Su desafío es simple: escriba el mayor tiempo posible de un programa prístino en el idioma que elija utilizando solo bytes únicos. (La definición completa de un programa original, copiado de ese enlace, se encuentra al final de esta pregunta).
Así es, sin condiciones. Su código no tiene que hacer nada en absoluto, solo ejecutarlo sin errores, cumplir con los requisitos para un programa original (vinculado anteriormente) e incluir bytes no duplicados en la codificación que utiliza.
A los fines de la explicación anterior y la definición vinculada de "programa prístino", un error se define como cualquier cosa que hace que el programa no se ejecute por completo o termine con un código de salida distinto de cero después de un período de tiempo finito.
Como esto es código de boliche , el código más largo , no el más corto, gana (medido por el conteo de bytes). El puntaje máximo teóricamente posible es 256, ya que hay 256 bytes distintos posibles. En caso de empate, gana la primera respuesta con la puntuación más alta.
Aquí está la definición completa de un programa prístino, copiado del enlace anterior:
Definamos un programa prístino como un programa que no tiene ningún error en sí mismo, pero lo hará si lo modifica quitando cualquier subcadena contigua de N caracteres, donde
1 <= N < program length
.Por ejemplo, el programa Python 2 de tres caracteres
`8`
es un programa original porque todos los programas resultantes de la eliminación de subcadenas de longitud 1 causan errores (errores de sintaxis, de hecho, pero cualquier tipo de error funcionará):
8` `` `8
y también todos los programas resultantes de la eliminación de subcadenas de longitud 2 causan errores:
` `
Si, por ejemplo,
`8
hubiera sido un programa sin errores, entonces`8`
no sería perfecto porque todos los resultados de la eliminación de la subcadena deben ser erróneos.
fuente
JMP <address outside of the program's memory>
en la asamblea. En principio, en una computadora real, podría hacer un bucle infinito o salir con un error distinto de cero, pero generalmente se bloqueará espectacularmente.Respuestas:
Jalea ,
253254256 bytesPruébalo en línea! o verificarlo!
Resulta que los idiomas de golf pueden jugar ...
‘
.Ahora solo«»
no se usan«»
. ¡Ahora tenga la puntuación óptima!¿Cómo?
La característica crucial de Jelly que lo hace posible es que los caracteres de apertura y cierre de los literales de cadena no son los mismos que en casi todos los demás idiomas.
La estructura del programa es la siguiente:
M <239 character long string> L»«’Ɗạ‘}237$¤¡
M
encuentra los índices de su argumento que apuntan a elementos máximos. Lo único que importa es que, sin argumentos para este programa, Jelly asigna0
errores a la cadena y Jelly cuandoM
se aplica0
.Para evitar
M
actuar0
en el programa completo, utilizamos el¡
rápido, que se aplicaM
varias veces según el resultado del enlace que lo precede inmediatamente. En este caso ese enlace es<239 character long string> L»«’Ɗạ‘}237$¤
.L
toma la longitud de esta cadena (239) y la»«’Ɗ
disminuye a 238. La»«
parte no hace nada peroƊ
(los últimos tres enlaces como mónada) hace que si se eliminan se produzca un error. Luegoạ
toma la diferencia absoluta entre el resultado de»«’Ɗ
y la mónada‘}237$
aplicada a la cadena.‘
aumenta y es una mónada, pero la}
convierte en una díada y la aplica a su argumento correcto237
, cediendo238
. Asíạ
rinde0
en el programa completo.¤
se vincula de nuevo a la cadena literal que forma un nilad. El resultado de esto es0
, porM
lo que no se aplica en absoluto, evitando cualquier error.Posibles subprogramas:
<string>..¤
será distinta de cero yM
se aplicará0
, causando un error.L»«’Ɗạ‘}237$
se elimina cualquier parte deM
, se aplicará0
o habrá operaciones entre la cadena y un número, lo que dará como resultado aTypeError
.¤¡
se elimina,M
se aplica a0
.”
y ambos’‘
se eliminan y“
no lo hacen, todo después seM
convierte en una cadena, porM
lo que actuará0
.”
y’
se elimina y“
no lo hace, todo entre”
y se‘
convierte en una lista de enteros.M
solo se elimina, hay unEOFError
porque¡
espera un enlace antes del nilad anterior.M“
y cualquier número de caracteres después de que se elimina, habrá unEOFError
porque¤
busca un nilod que lo precede pero no encuentra uno.238
no cuenta porque es parte de una mónada.Esto prácticamente cubre todo.
Anteriormente no lo había usado
«»‘
porque los dos últimos no se pueden incluir en la cadena porque coinciden con el“
carácter para formar otras cosas que no sean cadenas.«
tampoco puede estar en una“”
cadena pero no sé por qué.fuente
Haskell ,
3945505260 bytesEl identificador
main
debe tener tipoIO a
para algún tipo a. Cuando se ejecuta el programa, se realiza el cálculomain
y se descarta su resultado. En este caso su tipo esIO ((a,b)->a)
.El resultado es una aplicación de la función
(λ a b c d e f → return fst)
, una función constante de seis argumentos que devuelve la función fst (que da el primer elemento de una tupla de 2), inyectada en la mónada IO. Los argumentos son seisLT
(enumeración por menos),EQ
(enumeración por la igualdad), lista vacía[]
,3
,2
y1
.Lo que serían espacios se reemplazan con caracteres únicos que cuentan como espacios: una pestaña, un espacio sin interrupción, un avance de página, pestaña vertical, MARCA DE ESPACIO OGHAM, espacio regular, nueva línea y retorno de carro. Si falta alguno de estos, habrá una falta de coincidencia en el número de argumentos. Los nombres de los parámetros se eligen como caracteres UTF-8 de tres o cuatro bytes
𤶸陸ⵙ商ߜ新
, eligiendo cuidadosamente los caracteres que no generan bytes duplicados.Gracias a @BMO por sus valiosas contribuciones.
Volcado hexadecimal:
Pruébalo en línea!
fuente
'\109999'
parece ser válido, al menos en GHC 8.2.2.'\10999a'
produce un error léxico
produce un error léxico.maxBound :: Char
, es decir'\1114111'
. Nota: los números son decimales de forma predeterminada, por lo que si desea hexadecimal, debe poner unx
después de\
, por ejemplo'\x10999a'
.\x10ffff
funciona bien y\x110000
proporciona un error fuera de rango como era de esperar.Python 2 ,
20 21 33 39 4550 bytes¡Ahora un gran esfuerzo de colaboración!
+2 gracias a Aidan F. Pierce (reemplazar
sorted({0})
conmap(long,{0})
)+8 gracias a dylnan (uso de
\
y nueva línea para reemplazar el espacio; sugerencias para pasar de0
una expresión matemática; reemplazo-1
con-True
; uso de hexadecimal)+11 gracias a Angs (
4*23+~91
->~4836+9*1075/2
luego más tarde~197836254+0xbCABdDF
->~875+0xDEAdFBCbc%1439/2*6
)Pruébalo en línea! O vea la suite de confirmación
0xDEAdFBCbc
es hexadecimal y se evalúa como59775106236
.~
es un complemento en cuanto a bits, por lo que se~875
evalúa como-876
.%
es el operador de módulo por lo que se0xDEAdFBCbc%1439
evalúa293
./
es la división entera por lo que se0xDEAdFBCbc%1439/2
evalúa como146
.*
es la multiplicación por lo que sexDEAdFBCbc%1439/2*6
evalúa como876
.+
Esta suma se~875+xDEAdFBCbc%1439/2*6
evalúa a0
.... ninguna versión eliminada también se evalúa
0
.{0}
es unaset
que contiene un solo elemento,0
.Llamar
sorted
con aset
como argumento genera una lista, que puede indexarse con[...]
.Sin
sorted
el código({0})
solo se obtendría elset
y esto no se puede indexar de la misma manera,if({0})[-True]:q
elevaría aTypeError
.La indexación en Python está basada en 0 y permite una indexación negativa desde la parte posterior y
True
es equivalente a1
, por lo tanto,sorted({0})[-True]
encuentra el elemento0
, mientrassorted({0})[True]
que elevará una sintaxisIndexError
, como lo harásorted({})[-True]
ysorted({0})[]
no es válida.Lo
0
que se encuentra es falsey, por lo que el cuerpo deif
,q
nunca se ejecuta, sin embargo, si lo hiciera, generaría unNameError
dado queq
no se ha definido.Como una lista no vacía es verdadera, tampoco podemos recortarla
if[-1]:q
.Vea el conjunto de confirmación para ver: confirmación de que los bytes son únicos; todos los errores y el éxito del código en sí.
fuente
C (tcc) , x86_64,
2931333940 bytesDevuelve 0 . Gracias a @feersum por sugerir dígitos hexadecimales en mayúsculas.
Pruébalo en línea!
Cómo funciona
La asignación escribe dos entradas ( 184 y 49664 ) en la ubicación de memoria de main . Con entradas de 32 bits y orden de bytes little-endian, los bytes exactos son
b8 00 00 00 00 c2 00 00
.Dado que tcc no declara la matriz definida como .data (la mayoría de los compiladores lo haría), entonces saltar a main ejecuta el código de máquina al que apunta.
b8 00 00 00 00
(mov eax, imm32
) almacena el int 0 en el registro eax.c2 00 00
(ret imm16
) saca 0 bytes adicionales de la pila y los devuelve. (El valor en el registro eax es el valor de retorno de la función).fuente
> <> , 122 bytes
Pruébalo en línea!
No hace nada. Basado en el mismo formato que mi respuesta Programming a Pristine World .
Primero, verificamos que la longitud del código es 122 y error si no lo es.
><>
los programas no pueden finalizar sin el uso del;
comando, pero si este comando está en el programa, podemos eliminar todo antes de que finalice el programa de inmediato. Para combatir esto, usamos elp
comando para colocar un;
código en el código durante el tiempo de ejecución. Para hacer esto, restamos 6A
y lo colocamos después dep
.Probablemente agregaré la mayoría de los otros valores por encima de 127 una vez que descubra los valores de dos bytes correctos. Los 5 valores que faltan son
v^;
y las dos nuevas líneas.De los 7502 subprogramas, 7417 tuvieron errores debido a instrucciones no válidas, 72 por falta de memoria y 13 por quedarse sin memoria.
fuente
JavaScript, 42 bytes
i
,f
oif
causaráSyntaxError: missing ; before statement
;田
causaráSyntaxError: expected expression, got end of script
;田
causaráInvalid or unexpected token
;田
Mostrar fragmento de código
fuente
Brain-Flak , 2 bytes
Pruébalo en línea!
Alternativamente
[]
,{}
o()
. La eliminación de cualquier soporte hace que el otro soporte no coincida.Prueba de que esta es la solución óptima:
Un programa Brain-Flak está hecho de nilas (un par de paréntesis por sí mismas) o mónadas (un par de paréntesis que contienen 1 o más nilas). Una mónada no puede estar en un programa prístino, ya que simplemente puede eliminar una o más de las nilas. Del mismo modo, no puede tener más de un nilad en el programa, ya que puede eliminar uno de ellos sin interrumpir el programa.
Como tal, este podría ser el lenguaje menos óptimo para una programación prístina o única.
fuente
Ada, 110 bytes (latin1)
¿Probablemente la mejor respuesta que obtendrá de cualquier idioma en uso en la industria?
Hexdump:
Compile guardando en cualquier archivo que termine
.ads
y se ejecutegcc -c <filename>
. Produce un ejecutable que no hace nada. (No se puede proporcionar el enlace TIO porque TIO coloca el código en un.adb
archivo y,gcc
de forma predeterminada, intenta encontrar una especificación que coincida con ellos)Básicamente declara un paquete con un nombre abusando de mayúsculas / minúsculas latin1. Necesita un carácter de espacio en blanco diferente para cada uno de los espacios, por lo que utiliza espacio, CR, LF y TAB.
Cómo se ve en la versión vim:
Cómo funciona
En Ada, incluso las especificaciones se pueden compilar. Las especificaciones son como los archivos de encabezado de c, pero tienen más funciones y pueden compilar un código básico. Para que sea válida, cualquier especificación debe tener el formato:
package <NAME> is ... end <NAME>;
con<NAME>
coincidencia. Lo bueno de Ada es que no distingue entre mayúsculas y minúsculas. Por lo tanto, siempre que su nombre tenga variantes en mayúsculas y minúsculas, ¡estará listo!La parte difícil fue obtener una unidad compilable. Normalmente, los programas Ada tienen un procedimiento o función 'principal' que se encuentra fuera de cualquier paquete que se convertirá en el ejecutable final. Desafortunadamente, los procedimientos requieren la
begin
palabra clave, lo que conduce a demasiadose
s (solo se conocen 2 casos), mientras que las funciones requieren lareturn
palabra clave, lo que conduce a demasiadosn
s. Por lo tanto, tuve que compilar un paquete.fuente
C, 8 bytes
No hace nada.
Pruébalo en línea!
fuente
main(){short x;}
main(){short;}
compila solo con awarning: useless type name in empty declaration
. Creo que C99 y C ++ requieren un tipo de retorno explícito, por lo queint main
(o tal vezunsigned main
) podría funcionar, pero no con gcc, que solo advierte incluso con-std=c11
.return 0;
podría ser posible con C89, donde no hay implícitoreturn 0
al final demain
. Salir con un estado distinto de cero puede considerarse un fracaso, según otras respuestas. ¿Agregar banderas de compilación como-Werror
cuenta para la puntuación de una buena manera en el bowling de código? Porque hacer cumplir estrictamente las violaciones de C11 podría permitir un programa mucho más largo. Hmm,#include<>
algo y luego úsalo; no puede eliminar tanto la inclusión como el uso, y si falla sin un prototipo o macro def, ganará.main
yinclude
ambos contieneni
, por lo que no puede tener ambas cosas. Del mismo modo para declarar y usar una función. También usoreturn
en absoluto, ahora que lo pienso.int main
que no puede funcionar.JavaScript, 22 bytes
Pruébalo en línea!
Posibles errores
Cuando se modifica, arrojará uno de los siguientes errores 1 :
1. El número exacto de errores distintos depende del motor. Esta lista fue generada con SpiderMonkey (Firefox).
fuente
Python 3 + Flask-Env ,
7131417 bytesNo TIO porque no tiene
flask-env
.Encontró el nombre de módulo más largo que no tiene intersección
import
y no tiene ningún número al final del nombre._sha256
es más largo pero256
por sí solo no da error. Encontré una biblioteca,b3j0f.sync
que es un byte más, pero no pude conseguir que se importara correctamente.import
con\<newline>
. Sacar uno o ambos causa un error.Todavía puede haber opciones más largas que
flask_env
, realmente no hice una búsqueda exhaustiva, pero sí revisé ~ 70,000 módulos. Abierto a sugerencias.fuente
256
Se ejecuta sin errores.import *[hawkey]
y similares, pero por desgracia no funciona ...R , 14 bytes
Pruébalo en línea!
Esto podría ser lo más largo posible en R. Llamar a cualquier función está condenada al fracaso, porque podría eliminar todo menos el nombre de la función, lo que simplemente daría como resultado la impresión del código fuente de la función. Este es el objeto con nombre más largo en la configuración predeterminada de R sin caracteres duplicados y sin nombre de objeto sobrante al eliminar caracteres contiguos.
¡Este primer intento no funcionó, pero aprendí mucho al intentarlo!
dontCheck({family;NROW})
fuente
Perl 5, 3 bytes
=>
es la "coma gruesa", que cita la palabra a la izquierda. Entonces esto es equivalente aque no hace nada
Sin la coma gruesa,
y
es el operador de transliteración, que no es válido sin tres del mismo carácter repetido más tarde.La coma gruesa sola también es inválida, como está
=
y>
sola.fuente
brainfuck , 2 bytes
Pruébalo en línea!
Inspirado por la respuesta Brain Flak de Jo King . Esto es óptimo porque el único error en brainfuck son los corchetes sin igual. (Nuevamente, gracias a Jo King por esta información).
fuente
Rubí , 28 bytes.
Pruébalo en línea!
¡Verifícalo!
fuente
ML estándar , 22 bytes
Pruébalo en línea!
op-(a,b)
es la forma de-azucarada dea-b
.~
denota el menos unario, por lo que en realidad estamos computando765+324
. Esta expresión coincide con el patrón en la constante1089
. Esta coincidencia tiene éxito si el programa no ha sido alterado y no hace, bueno, nada.Si la coincidencia no tiene éxito porque se eliminaron algunos dígitos, se obtiene un
unhandled exception: Bind
. La eliminación deop-
resultados en un error de tipo porque una tupla coincide con unint
. Todas las demás eliminaciones deberían dar como resultado un error de sintaxis.fuente
Swift 4 , 19 bytes
Pruébalo en línea!
Todos los posibles errores que he encontrado son:
[
,]
,{
o}
dará lugar a un error de sintaxis[].
resultará enUse of unresolved identifier 'contains'
.
resultará enConsecutive statements on a line must be separated by ';'
[]
resultará enReference to member 'contains' cannot be resolved without a contextual type
{1 !=␊0}
resultará enExpression resolves to an unused function
1 !=␊0
resultará enMissing return in a closure expected to return 'Bool'
'!=' is not a prefix unary operator
'=' must have consistent whitespace on both sides
!=
resultará enMissing return in a closure expected to return 'Bool'
Consecutive statements on a line must be separated by ';'
Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
[].contains
resultará enClosure expression is unused
Algunos otros programas interesantes son (uno en cada línea):
fuente
a
sTcl , 6 bytes
Pruébalo en línea!
Tcl , 3 bytes
Pruébalo en línea!
Tcl , 2 bytes
Pruébalo en línea!
fuente
Lote de 7 bytes
Un buen comienzo
fuente
Retina , 2 bytes
No me sorprendería si esto es óptimo ...
Pruébalo en línea!
La expresión regular contiene un grupo vacío. Eliminar cualquiera de los pares causará un error de análisis debido a paréntesis inigualables.
Otras soluciones son:
\(
,\)
,\[
,\]
,\*
,\+
,\?
,a]
fuente
a]
no errorC (gcc) ,
7375 bytesPruébalo en línea!
Basado en la respuesta de @Steadybox, gracias a @Angs por detectar errores graves.
Sí, es un truco sucio (porque de hecho usa un
#define
con-DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main
y-Dg=return
), pero no veo ninguna regla que prohíba dicha opción de compilación.fuente
-DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main
+-Dg=return
, por lo que diría que esto usa un lenguaje inventado específicamente diseñado para el desafío , que está prohibido por defecto.-1
error sin error