Su reto es escribir N fragmentos de código de tal manera que, al concatenar el primer K ≥ 1 en conjunto, producen el número K . Cuanto mayor sea N , mejor. Aquí está el truco: no puedes usar ningún personaje más de una vez en tus fragmentos.
Reglas
- Puede usar el mismo personaje varias veces en un fragmento (y solo uno).
- Estos fragmentos deben concatenarse en el orden en que se presentan , sin omitir ninguno.
- Debes escribir al menos dos fragmentos.
- Todos los fragmentos deben estar en el mismo idioma.
- Recuerde: los fragmentos no tienen que ser programas o funciones completos, ni tienen que funcionar por sí solos.
-1
es un fragmento válido en Java, por ejemplo - Todas las concatenaciones resultantes deben generar el valor K respectivo .
- El ganador es la persona con el mayor valor de N. El desempate es la longitud total más corta del programa en bytes.
Ejemplo
Supongamos sus fragmentos eran AD
, xc
, 123
, y ;l
. Luego:
AD
debería producir1
ADxc
debería producir2
ADxc123
debería producir3
- y
ADxc123;l
debe producir4
.
Este programa tendría una puntuación de 4 .
number
code-challenge
source-layout
Conor O'Brien
fuente
fuente
1
y '2'?Respuestas:
Python 3 , 1 112 056 fragmentos, 4 383 854 bytes
Esto es muy similar a la respuesta de @ WheatWizard's Python 2 . Empecé a trabajar en esto poco antes de que se publicara, pero resolver las peculiaridades de Python con respecto a los caracteres no ASCII y las largas colas tomó algo de tiempo. Descubrí que Python lee líneas de 8191 bytes a la vez, y cuando esos 8191 bytes contienen solo una parte de un carácter de varios bytes, Python arroja un SyntaxError .
El primer fragmento utiliza una codificación de caracteres Fewest (distintos) para la integridad de Turing .
Esta monstruosidad simplemente construye la siguiente cadena y la ejecuta.
Los siguientes fragmentos tienen exactamente un carácter. Los siguientes tres caracteres son
\n
,\r
y#
. Todos los caracteres Unicode restantes (excepto los sustitutos) siguen un orden específico, por lo que se alinean con el límite de 8191 bytes.El siguiente script genera los programas apropiados para la entrada k entre 1 y 1112056 .
fuente
Perl 5,
50,091151 fragmentosPrimer fragmento:
Fragmentos del 2 al 26: aB
través deZ
Fragmentos del 27 al 46: a
a
travész
, excluyendo los caracteres en "longitud"Fragmentos 47 a 56: a
0
través de9
Fragmento 57:_
Los fragmentos restantes son los 50,105 caracteres Unicode individuales que Perl considera como caracteres de "palabras", excluyendo los 14 caracteres de palabras distintas en el fragmento inicial, en cualquier orden.Bueno, fue un buen pensamiento, pero resulta que después de una cierta longitud, Perl te da un error de "identificador demasiado largo". Este es el programa combinado más largo que pude hacer que Perl digeriera:
La página del manual de perldiag dice "Es probable que las versiones futuras de Perl eliminen estas limitaciones arbitrarias", pero mi Perl 5.18 no lo ha hecho.
Explicación:
En el modo no estricto, Perl 5 interpreta las cadenas de caracteres de palabras sin comillas como "palabras desnudas", en esencia, las cita automáticamente. Por lo general, es mejor evitarlos, ¡pero seguro que ayudan aquí!
fuente
a-z
muy probable que tus fragmentos usen caracteres de tu primer fragmento.length("length(
.Python 2 , puntaje 32
Con los fragmentos posteriores
B
,C
,D
, ...Y
,Z
,u
,v
,w
,x
,y
,z
.En un giro de ironía dramática, Python 3 admite identificadores Unicode, lo que nos permitiría ser muy tontos con este truco, pero no puede hacerlo
print
sin paréntesis. También podría meter dígitos en el identificador, pero no creo que este enfoque sea muy divertido para extraer más.Pruébalo en línea!
Python 2 , puntaje 18, menos trampa
Pruébalo en línea!
fuente
JavaScript (ES6, V8 6.x),
5250298119526119638119683128781 fragmentos,88149147575179575631576121612789 bytesMás abajo hay un fragmento de pila que genera el programa completo, lo evalúa y crea un enlace de descarga para el archivo. Ese fragmento continuará generando mejores respuestas a medida que las versiones posteriores de Unicode sean compatibles con las versiones más nuevas de JavaScript, que agregan nuevos identificadores válidos al idioma.
Usar solo ASCII
Explicación
Esto utiliza la técnica de metaprogramación
Proxy
para habilitar una captura del controlador get en el objeto y acceder al nombre de la propiedad como una cadena, devolviendo los identificadoreslength / 2
como su valor.Con el primer fragmento comenzando como
new Proxy({},{get:(n,{length:e})=>e>>(e/e)}).nn
, cada fragmento adicional agregado incrementa la cadenalength
del identificador2
asegurándose de que.repeat()
el código respectivo señale dos veces para caracteres de 2 bytes utf-16 y una vez para caracteres de 4 bytes utf-16.Identificadores en JavaScript
En la especificación ECMAScript ,
IdentifierName
se define un con la siguiente gramática:Generando la respuesta
Inicialmente usando la propiedad Unicode "ID_Continue", escribí un script Node.js que genera la respuesta completa. Ahora es solo un script del lado del cliente que utiliza un ingenuo
eval()
para probar caracteres válidos, iterando a través de todos los puntos de código Unicode:Ejecución de
stat -f%z answer.js
los rendimientos de una cuenta de bytes de 612.802, pero que restar 13 bytes para elconsole.log(
y)
envolver la presentación efectiva.Codificación
La fuente se almacena como utf-8, que se refleja en el enorme recuento de bytes de la respuesta. Esto se hace porque Node.js solo puede ejecutar archivos fuente codificados en utf-8.
JavaScript almacena internamente cadenas con codificación utf-16, por lo que la "longitud de caracteres" de la cadena devuelta en JavaScript es en realidad solo la mitad del número de bytes de la cadena codificada en utf-16.
fuente
x
lugar de$
liberarlo como un carácter identificador adicional?Python 2 , puntaje
610+3 gracias a pizzapants184
+1 gracias a WheatWizard
Pruébalo en línea!
fuente
print int(True)
a solo4/4
, puede sumarand 7
7, dado que no tiene que imprimir el número, simplemente 'producirlo'&2
aumentará su puntaje en uno porque&
tiene mayor precedencia que^
, pero necesita hacer el número 2 de alguna manera. (Puedes usar[[]==[]][[]<[]]<<[[]==[]][[]<[]]
)ord
estaba en conflicto conand
, pero lo arregléTI-Basic (serie 83, SO versión 1.15 o superior), puntuación:
17181924(Desempate: 53 bytes).
Puede obtener una puntuación muy grande al abusar de la longitud de la cadena como de costumbre: comience con (como señala @Scrooble) y continúe agregando fragmentos de token único al final. TI-Basic tiene más de 700 de ellos, por lo que en realidad funciona bastante bien. Pero aquí hay otro enfoque:
length("A
length("length(
Tenga en cuenta que la TI-Basic se tokenized, por lo que (por ejemplo) el
e^(
comando no utiliza ninguno de los personajese
,^
,(
.Se basa en una característica no documentada del
sub(
comando: además de encontrar subcadenas, también se puede usar para dividir un número por 100.Esto funciona si se está ejecutando en una calculadora fresco, lo cual nos permite suponer que
X
,Y
,Z
son todos cero, que las variables de ventana se ajustan a sus valores normales, que la calculadora está en modo de radianes, y querand
's primeras tres salidas será de unos0.943
,0.908
,0.146
.fuente
PowerShell , 25 bytes, puntaje 5
Fragmento 1:
' '.count
salidas1
. Hace esto tomando el.count
de una cadena, que es uno porque solo hay una cadena. Pruébalo en línea!Fragmento 2:
*2
resultados2
porque tomamos el1
fragmento anterior y lo multiplicamos por dos. ¡ Pruébelo en línea!Fragmento 3:
+!""
salidas3
agregando el Boolean-not de una cadena vacía. Esto convierte implícitamente la cadena vacía en$true
, que nuevamente se convierte implícitamente en1
, así que estamos agregando uno ¡ Pruébelo en línea!Fragmento 4:
-(-1)
resultados4
simplemente restando uno negativo ¡ Pruébelo en línea!Fragmento 5:
|%{5}
salidas5
tomando el número anterior en un ciclo y cada iteración de ese ciclo (solo uno, porque solo hay un número de entrada) salidas ¡5
Pruébelo en línea!Gracias a Jan por un medio alternativo de idear
4
y una forma astuta de idear5
.fuente
' '.count*2+!""-(-1)|%{5}
un puntaje de 5?$_
dentro|%{ }
. ¡Gracias!C, 10 fragmentos, 45 bytes
Pruébalo en línea!
fuente
MATL , Puntuación
815,64123 bytes11,23ZP
fue su idea, junto con cambiar3
con elI
fragmento 7.OO...N&
Fue idea suya.Más por venir.No sé las funciones de MATL de memoria, así que tuve que ir y venir de un lado a otro en la documentación ... :)Pruébalo en línea!
fuente
5Yy
es lindo! Ya usoY
en 3 para obtener el segundo prime :(OOOOOOON&
. Si agrega otros, este probablemente debería ser el último, debido a&
yyyyyyyy...
? Tuve que duplicar el número, 24y
para duplicarlo 12 veces ...?d
. Ahora estoy en el móvil, pero intentoX#
depurar-imprimir la pilaV , puntaje 10
Pruébalo en línea!
fuente
Jalea , 253 bytes, puntaje 250
Fragmentos posteriores de 1 carácter:
Nota:
¶
también pueden ser reemplazados por\n
, son el mismo byte en la página de códigos de Jelly.Después de agregar todos esos fragmentos, puede agregar el fragmento de 2 caracteres
”‘
.+1 gracias a Dennis .
Pruébalo en línea!
fuente
Lenguage , 1 112 064 fragmentos
El n º fragmento consta de 2 3n-1 repeticiones de la n º de caracteres Unicode no sustituto, hasta e incluyendo el 1 112 064 º y último carácter no sustituto de la norma Unicode actual.
La salida está en unario (usando el byte nulo como dígito) por simplicidad. El decimal es posible, pero hará que los programas sean aún más largos. Con unary, podemos probar los primeros programas.
Para n = 1 , obtenemos 4 repeticiones de U + 0000 . Esto es equivalente al programa brainfuck
.
, que imprime un byte nulo.Para n = 2 , obtenemos 32 repeticiones de U + 0001 , para un total de 36 caracteres. Esto es equivalente al programa brainfuck
..
, que imprime dos bytes nulos.Para n = 3 , obtenemos 256 repeticiones de U + 0002 , para un total de 292 caracteres. Esto es equivalente al programa brainfuck
...
, que imprime tres bytes nulos.Y así sucesivamente, hasta n = 1 112 064 .
fuente
'+'*(48 + d) +'.>'
para cada dígito decimal de n alcanzaría el mismo puntaje. Es mucho más difícil de describir.BÁSICO (ZX Spectrum), puntaje 244 (nuevo puntaje 247) [¿esto es trampa?]
Fragmento 1:
Fragmento 2:
:
Fragmento 3:
REM
Fragmentos 4-244: Fragmentos de un solo carácter, que utilizan todos los caracteres que no están en los fragmentos 1, 2 y 3.
Explicación
Caracteres
En Spectrum,
PRINT
es un solo carácter (código 245). El fragmento 1 utiliza 11 caracteres diferentes:2
,3
,5
,6
,+
,-
,*
,(
,)
,PRINT
yPEEK
Lo que se ve como espacios son una parte de caracteresPRINT
yPEEK
, por lo que el espacio en sí no ha sido utilizado. Decidí dar el número de línea 2356 porque estos son los únicos dígitos presentes en el código.Los caracteres 13 y 14 no están permitidos. Eso significa que quedan 243 caracteres para los fragmentos 2-244, comenzando por
:
yREM
para evitar el código que produciría un error o haría cualquier otra cosa.Cómo funciona
Es por eso que no estoy seguro de si esta respuesta es del libro.
23635 es la ubicación de memoria para PROG variable de sistema de 16 bits, almacenada como LH. (El valor generalmente es 23755. Pero aparte del resultado incorrecto si no es el caso, usar este número directamente, aunque acortaría el código, me costaría caracteres de dígitos adicionales). El valor de PROG es la ubicación de la memoria donde se almacena el programa en sí. Los primeros dos bytes son el número de línea almacenado como HL, los siguientes dos bytes son la longitud de la línea almacenada como LH. Así es como el programa busca la longitud de su propia línea, por lo que es necesario restar algo apropiado
Guardando personajes
Teniendo en cuenta cómo se almacenan los números, la línea podría haber terminado con -114 para que el fragmento 1 produjera 1. Pero no quería usar dígitos adicionales, por lo que quité dos números de 2 dígitos, que luego tuvieron que sumar a 122; 56 y 66 lo hicieron muy bien.
El código es un poco feo con todos los valores de anidamiento y cálculo de PROG (
PEEK 23635+256*PEEK 23636
) dos veces. Pero si lo almacenara y luego usara el valor almacenado, costaría caracteres / fragmentos adicionales: la línea podría comenzar comoque utilizaría 4 caracteres adicionales:
LET
,p
,=
y:
.Tal vez voy a diseñar esto para que todos los números se calculen a partir de números que usan solo 1 dígito y obtienen 3 fragmentos.
EDITAR:
Aquí está el nuevo fragmento 1 (así es como se muestra una línea larga en el Spectrum, por lo que si desea probar el código, eso lo ayudará a ver que lo escribió correctamente):
Podría obtener otro fragmento evitando
+
y simplemente arreglármelas-
. No voy a intentarlo, esto fue suficiente prueba.fuente
Klein 011 , 9 fragmentos
Fragmento 1
Pruébalo en línea!
Fragmento 2
Pruébalo en línea!
Fragmento 3
Pruébalo en línea!
Fragmento 4
Pruébalo en línea!
Fragmento 5
Pruébalo en línea!
Fragmento 6
Pruébalo en línea!
Fragmento 7
Pruébalo en línea!
Fragmento 8
Pruébalo en línea!
Fragmento 9
Pruébalo en línea!
Explicación
Este fue un desafío muy divertido para Klein. La topología única de Klein permite hacer muchas cosas interesantes. Como puede observar, las respuestas 5-9 simplemente agregan relleno (las letras no hacen nada en Klein, así que las usé como relleno) al código para extender el cuadro delimitador. Esto hace que la ip tome un camino diferente a través de partes anteriores del código debido a la topología única de Klein.
Voy a hacer una explicación completa más tarde, pero por ahora aquí es una versión más fácil de entender del programa con todas las letras reemplazadas por
.
s.Pruébalo en línea!
fuente
> <> , Puntuación:
Infinito1,112,064-6 = 1,112,058Fragmento 1 (6 bytes)
Este fragmento genera la cantidad de caracteres después de; mas uno. Esto se puede extender a
unacantidadinfinitamuy grande de fragmentos de un carácter cada uno. Un rápido google me dice que hay 1.112.064 posibles caracteres Unicode, menos los 6 que ya he usado.Trate Se Online
fuente
R , puntuación: 79
Gracias a la respuesta de Sean Perl por la inspiración; Esto abusa de algunas peculiaridades del intérprete R.
Primer fragmento:
fragmentos posteriores son los caracteres en:
Pruébalo en línea!
La
scan
función lee datos del archivo""
cuyo valor predeterminado esstdin()
.Los documentos para
stdin()
indican que:Por lo tanto, los datos posteriores se convierten en el archivo. Esto puede expandirse trivialmente y puede funcionar con múltiples codificaciones diferentes.
fuente
Pyke , 256 bytes, puntaje 254
Tenga en cuenta que estos son códigos hexadecimales de los bytes reales, separados por espacios, ya que allí
\x00
se incluye el byte nulo ( ).Fragmento de inicio:
Fragmentos posteriores de 1 carácter:
Pruébalo aquí!
fuente
Java 8, 7 fragmentos (19 bytes)
Solo un comienzo, seguiremos trabajando en ello.
Pruébalo aquí.
Explicación:
La precedencia de ejecución quizás se aclara cuando agrego paréntesis:
a*b
: Multiplicara
conb
~a
:-a-1
a>b?x:y
:if(a>b){ x }else{ y }
a|b
: Bitwise-ORa
conb
a^b
: Bitwise-XORa
conb
a%b
:a
módulo-b
fuente
Python 2 , 110 fragmentos
Aquí está el fragmento completo:
Pruébalo en línea!
El primer fragmento es
Y luego los siguientes 109 fragmentos son los siguientes 109 bytes.
Esto es bastante "engañoso" como dice Lynn. El primer fragmento abre el archivo y resta 44 de su longitud, luego cada fragmento agrega 1 a la longitud del archivo sin cambiar la lógica del programa en su conjunto. aumentando así el resultado de la salida en 1.
fuente
dc , puntaje 13, 58 bytes
Pruébalo en línea! (Tenga en cuenta que la versión TIO agrega un
f
después de cada fragmento para imprimir la pila completa, mostrando que cada fragmento solo deja un valor único en la pila; también olvidé el espacio inicial en el último fragmento que no importa funcionalmente cuando están separado por saltos de línea pero cuenta para el uso de mi personaje)Cada concatenación de fragmentos adicional deja el valor deseado y solo el valor deseado en la pila. Después de llegar a 12, me quedé sin formas de comer la pila. Traté de usar operaciones matemáticas desde el principio, ya que engullen la pila y a medida que avanzamos en números más grandes, es más difícil de manejar de esa manera. Cuando todo está dicho y hecho, solo me queda el dígito 0 para jugar y muy poco en la forma de hacer estallar la pila, por lo que creo que 13 está bastante cerca del máximo. Estoy seguro de que hay muchas formas similares (y probablemente más cortas) de lograr esto en CC, esto simplemente encajó. Tenga en cuenta que cygwin maneja AF mezclado con 0-9 de manera diferente a la mayoría de las versiones de cc,
44C4r/CC 4//
funciona para el fragmento final en cygwin.fuente
Pyth , 124 fragmentos
Pruébalo en línea!
Los caracteres no imprimibles se escaparon utilizando tres caracteres imprimibles (
x..
). El primer fragmento tiene una longitud de tres bytes, cada fragmento posterior aumenta en longitud de uno en uno.fuente
Beatnik , 22 bytes, puntaje 20
Asumir la palabra "fragmento" le permite empujar el valor en la pila.
fuente
Octava, puntaje 86
Seguido por:
Esto explota el hecho de que Octave trata todo después del nombre de una función como una entrada de cadena. Por lo tanto,
nnz n
devuelve el número de elementos distintos de cero en la cadena'n'
. Llegamos a 86 agregando los otros caracteres ASCII imprimibles.',"%#
no funcionafuente
APL (Dyalog) , puntaje 12
+1 puntaje gracias a @dzaima
Fragmentos del primero al tercero:
Entonces cada uno de
234567890
.Pruébalo en línea!
fuente
Julia 0.6, 111217
El siguiente script crea el programa completo:
Explicación
La macro
seguido de todos los caracteres unicode distintos permitidos en los identificadores, calculados con
isidentifier
. Algunas marcas diacritiales ensucian el conteo, así que las eliminé.fuente
TeX, puntaje 61 (posiblemente 190)
Primer fragmento:
Otros 60 fragmentos: en cualquier orden, cada uno con un carácter de
Explicación:,
\len
que se invoca al final, convierte una secuencia de control en una cadena, cada carácter (incluido\
) es una ficha de carácter de esa cadena; luego\glen
engulle la ficha\
, luego\tlen
cuenta las fichas restantes. Por lo tanto, genera la longitud de esa secuencia de control (sin incluir\
).Los caracteres de otros fragmentos amplían la secuencia de control que inicialmente es justa
\t
. Una secuencia de control de varios caracteres debe estar compuesta solo por letras, pero todas cuentan como letras porque se les ha asignado el código de categoría 11 (usando códigos ASCII para que los caracteres en sí no aparezcan en el primer fragmento).Decidí usar códigos octales para algunos caracteres que me costaron un símbolo,
'
pero me salvó dos dígitos, 8 y 9, por lo que obtuve un fragmento. Posiblemente podría haber ganado un par más si no fuera necesario\expandafter
.Salida
Posible alteración: abrigo
\number\count1
en\message{}
lo que la salida no entra en.dvi
producción, pero en lugar de salida de la consola y.log
. No cuesta ninguna letra extra.190
Desafortunadamente, TeX funciona con ASCII y no con Unicode (¿o lo hace ahora?), Pero mi solución podría extenderse para incluir 129 fragmentos de un solo carácter más que contengan los caracteres con los códigos 127-255. Tal vez incluso algunos caracteres antes del 32. El carácter 32 (espacio) no funcionó, de lo contrario también lo pondría en un fragmento, no lo necesitaba en el primer fragmento. Por supuesto, cada uno de estos caracteres adicionales debería incluirse
\catcode
en una letra en el primer fragmento.fuente
Pip, 57 bytes, puntaje = 16
Tenga en cuenta que
<tab>
representa un carácter de tabulación literal (ASCII 9). Pruébalo en línea!Cada fragmento es un programa completo que genera el número deseado. La mayoría de ellos funcionan según el principio de que la última expresión en un programa Pip se imprime automáticamente: por ejemplo, en el fragmento 5, se evalúa el código anterior, pero la única parte que importa es el
5
. Las excepciones a esto son:RT9
(raíz cuadrada de 9), pero después del fragmento 2 en realidad se analiza como2RT9
(segunda raíz de 9), lo que, por supuesto, equivale a lo mismo.y
variable. El fragmento 8 genera el valor dey
.o
(preinicializado a 1). El fragmento 13 toma ese resultado y lo restav
(preinicializado a -1).1
sin una nueva línea (Ok=k
, donde sek=k
evalúa al valor de verdad predeterminado de 1), y luego se imprime automáticamente6
.Otras cosas interesantes:
14
del valor de pi."F"
de hexadecimal.fuente
Zsh , puntaje> 50 000 (1 112 046?), 16 + Σ (longitudes de punto de código UTF-8) bytes
Zsh maneja codificaciones multibyte por defecto. El fragmento de base tiene 18 personajes únicos, 34 en total. Todos los demás puntos de código (salvo el byte nulo) se pueden agregar a esto. Mientras escribo esto, mi script que prueba esto está en el punto de código ~ 50 000, tamaño de archivo total de 150K, yendo a unos 30 fragmentos / segundo. Ejecute mi script de prueba completo usted mismo aquí. Es posible que desee ajustarlo para comenzar en algunos puntos de código posteriores.
¡Pruebe los primeros 2000 fragmentos en línea!
Más fragmentos son posibles usando esta técnica .
fuente