Su objetivo : escribir un fragmento de código que dará como resultado el clásico resultado de "¡Hola, mundo!" ser impreso a STDOUT o equivalente.
Reglas : El código debe estar enteramente en la impresión ASCII. Todo el código debe ser funcional: la eliminación de cualquier carácter de conteo único debe cambiar el resultado o hacer que el código no funcione. Todas las variables deben usarse después de la asignación. Los literales de caracteres y cadenas deben ser necesarios para la salida, es decir, el reemplazo de cualquier literal de caracteres o cualquier carácter dentro de un literal de cadena por otro carácter debe ser capaz de cambiar el resultado (y no a través del efecto de la secuencia de escape), reemplazando el carácter con barra invertida o equivalente)
(NOTA: la regla final se editó en)
Puntuación : Aquí es donde se pone interesante. La puntuación más alta gana según lo determinado por el número de caracteres, según las reglas típicas de boliche de código. Pero el uso repetido de caracteres dará como resultado deducciones de puntos. Específicamente...
- El uso repetido de cualquier carácter alfanumérico (az, AZ, 0-9) dará como resultado una deducción de 3 puntos por repetición (el primer uso no resulta en una deducción).
- El uso repetido de puntuación básica ([!? .-, ": ';]) - incluyendo los corchetes - dará como resultado una deducción de 2 puntos por repetición.
- El uso repetido de otros caracteres ASCII {`~ @ # $% ^ & * _ + = | \ /> <}, incluidos los corchetes, dará como resultado una deducción de 4 puntos por repetición.
- El uso repetido de espacios, tabulaciones y líneas nuevas dará como resultado una deducción de 1 punto por repetición. Es decir, solo el primer uso de un espacio, tabulación o nueva línea contará para su total.
Nota: los comentarios no cuentan para el total, aunque los caracteres que marcan el inicio / final de un comentario sí lo hacen. Por ejemplo, en C / C ++, si tiene /* This is a comment */
, contará dos barras y dos asteriscos, pero nada entre ellos.
Algunos ejemplos (nota: uso de Julia como lenguaje de muestra) ...
print("Hello, world!");
Total de caracteres visibles: 22
Contiene espacio: +1
Alfanuméricos
repetidos : -12 para llor Puntuación repetida: -2 para "
Puntuación final: 22 + 1-12-2 = 9
print("Hel",char(108),"o, wor",0x108,"d!"); # 0x108 makes a Uint8 that prints as ASCII
Caracteres totales: 43 (no cuenta ningún carácter después de #, que es el carácter del comentario)
Contiene espacio: +1
Alfanuméricos
repetidos : -18 para rr1008 Puntuación repetida: -24 para () "" "" ",,,,,
Final puntuación: 43 + 1-24-18 = 2
xy=STDOUT
m="Hello, world!"
print(xy,m);
Total de caracteres visibles: 37
Contiene nueva línea: +1
Contiene espacio: +1
Alfanuméricos
repetidos : -18 para xilor Puntuación repetida: -4 para ",
Otros ASCII repetidos: -4 para =
Puntuación final: 37 + 1 + 1-18-4 -4 = 13
Un par de piezas de código inválidas ...
x=2;print("Hello,world!")
Problema: x
se asigna, pero no se usa.
print("Hello,"*" world!")
Problema: *
es innecesario, el resultado será el mismo sin él.
k=1
if k>0
print("Hello, world!")
else
print("abcghjmquvxyzABCDEFGIJKLMNOPQRSTUVWXYZ_+*-&|")
end
Problema: el segundo print
comando no se ejecutará. Además, eliminar caracteres entre comillas en el segundo print
comando no cambiará la salida.
x="Hello, world!";
print(x)
Problema: la eliminación de la nueva línea no cambiará el resultado ni causará un error (en Julia, el punto y coma solo es necesario si hay varios comandos en la misma línea; de lo contrario, solo suprime el valor de retorno).
print("Hellos\b, world!")
Problema: el s
carácter no afecta el resultado, ya que se borra \b
. Esto es aceptable si se hace a través de code ( "Hello",char(100),"\b, world!"
), pero no se puede hacer a través de literales de cadena o literales de caracteres.
Práctica calculadora de puntaje - http://jsfiddle.net/4t7qG/2/ - gracias a Doorknob
Respuestas:
Perl - 96
(Bastante bien, dada la puntuación teórica máxima de 97)
(Tenga en cuenta que la segunda línea comienza con un
\t
tabulador real )El código tiene 98 caracteres y contiene todos los caracteres ascii exactamente una vez, más un extra
-
.98 - 2 = 96
Aquí no hay literales de cadena , pero la eliminación de cualquier carácter individual interrumpe el programa.
Desofuscación
Hay 3 declaraciones en este programa (bueno, en realidad 2 pero abusé
+
como algún tipo de separador de declaraciones)s{}[Hel0o, w3$=d!]
Este es un caso muy extendido del operador sed. Se escribe más comúnmente como
s/a/b/
, os:a:b:
, pero Perl permite mucha más fantasía aquí:s(a)(b)
s(a)^b^
s(a)[b]
e inclusos qaqbq
.Reemplaza una cadena vacía (dentro
{}
) conHel0o w360d!
(dentro[]
) (se$=
interpola60
por defecto). Debido a la falta de un~=
operador, funciona$_
.y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)
Este también es un caso muy extendido, pero de un
tr
operador, que también se llamay
(y< >( )
).Veamos la tabla de reemplazo:
" # %&'*.124578:?@BCDEFGIJKLMNOQ /-9
\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cA k-u
he movido algunos caracteres para que la cadena existente no se rompa. La única parte que realmente funciona aquí es
/-9
->k-u
. Reemplaza0
conl
,3
cono
y6
conr
.Nuevamente debido a la falta del
~=
operador, opera en$_
modo que ahora tenemos la frase completa en la
$_
variable.print
La falta de argumentos hace que imprima solo la
$_
variable.fuente
/-9
y enk-u
realidad se usan para transformar la cadena. El resto es una basura del mismo tamaño . Si elimina solo un carácter, los conjuntos se desalinearán y el programa no mostrará "¡Hola, mundo!" nunca más.<...> removal of any single counting character must change the result or cause the code to not function.
eliminación de 1 carácter en cualquier lugar lo rompe. Puede hacerlo funcionar eliminando 2 caracteres, pero eso no está en las reglas.All code must be functional
. Claramente estás doblando las reglas, por lo menos. No estoy diciendo "rompe las reglas" directamente, pero definitivamente es cuestionable.Esta respuesta se creó antes de agregar la regla sobre literales de cadena y no participa en el concurso.
Es completamente legítimo. : P Si elimina cualquier carácter de esa cadena, se imprimirá
ello, world!
.fuente
<<
deben eliminarse.if 'x'>'w'
técnicas, pero bloquea "k \ bH" para dar como resultado "H", por ejemplo. Siéntase libre de contribuir con una segunda respuesta después de la restricción agregada.CJam, 94
Pruébalo en línea! Tenga en cuenta que debe haber un tabulador justo antes del salto de línea. A SE no le gustan los tabuladores, por lo que deberá insertarlo manualmente.
Puntuación total: 94
He usado el siguiente código para verificar que ninguno de los caracteres dentro de la cadena se pueda eliminar:
Imprime una matriz que muestra la cantidad de veces ¡Hola, mundo! se imprimiría si se eliminara el carácter correspondiente al índice.
fuente
254b
). El módulo de resultado final 7 debe ser 1, por lo que el bloque de código anterior se ejecuta una vez. Necesitaré un módulo para hacer que cada personaje sea necesario.Z
, elT
, o probablemente algunos otros caracteres no cambia el resultado.Rubí,
2841Solo para comenzar las respuestas con una solución en el espíritu de la pregunta:
Puntuación (creo que entendí bien):
orli
)"'
)fuente
.
en3.1
se puede quitar sin problema. Como puede elx
in0x4
o el-
in8-5
.PHP, 1 (¡sí, un punto!)
Usar caracteres mágicos para generar una suma de comprobación, que en forma binaria coincide con "Infierno", "o, w", "orld" y "!".
Por lo general, me gusta encontrar lagunas, pero esta vez decidí jugar por el espíritu y la intención del concurso. Cada personaje y su posición son esenciales para la salida. Los únicos lugares que puede sustituir son nombres de variables que no son valores literales, el espacio en blanco entre
php
yforeach
quePHP
trata como equivalente, y el uso de'
vs"
quePHP
trata como similar.Para su información, estas son algunas otras cadenas mágicas y hashes de interés:
fuente
\t
,\n
o el espacio. No es un experto en PHP, pero;
parece opcional también.Befunge-98 , 97 puntos!
Pruébalo en línea!
La pestaña está entre el
q
y eln
.Utiliza un truco similar a la respuesta anterior de Befunge para rellenar las líneas con los caracteres sobrantes, pero evita usar caracteres duplicados en la sección de ejecución. Al eliminar cualquiera de los caracteres que no se ejecutan, las partes que se ejecutan están fuera de lugar, por lo general terminan en bucles infinitos o se imprime la salida incorrecta.
Cómo funciona
Realmente, la única parte ejecutora se ve así:
Primero usa un literal de cadena de envoltura para agregar
, world!
a la pila. Esto evita dos"
s.Esto se agrega
Hello
a la pila utilizando una variedad de métodos para evitar caracteres duplicados.$
muestra el espacio en exceso causado por el literal de cadena de ajuste.7+
agrega 7 alh
final del literal de cadena para crear elo
.ba*46\%:
calcula 111, el valor ascii del
y lo duplica.'e
agrega e a la pila.f1g
obtiene el personaje a 1,15, que es elH
Luego reutiliza el
,
en la cadena para imprimir el conjuntoHello, world!
. El resto son solo cambios de dirección para navegar hasta el final@
.fuente
Rubí, 78
Creo que hay más abuso de reglas, no estoy seguro exactamente de cuál sería el parche. Toma una cadena larga y verifica la suma del resultado, por lo que cualquier eliminación o cambio hará que el programa falle. Probablemente podría optimizarse un poco para eliminar la duplicación de algunas letras y obtener espacios en blanco allí.
fuente
if
puede ser eliminadoif
realmente funcione y las cosas que siguen obedezcan las reglas.puts('Hello, world!')
funcionaría. Creo que las reglas necesitan aclararse si esto es legítimo.PHP, 2257
Escapatoria: la barra invertida se omitió de las especificaciones y la calculadora de puntaje.
Este código cuenta el número de ocurrencias de barras invertidas en cada cadena e imprime un equivalente ASCII. Reemplazar cualquier barra diagonal inversa con otro carácter, o eliminar una barra diagonal inversa, provoca un error de análisis o cambia el resultado.
Una característica interesante de las barras diagonales inversas
PHP
es que deben escaparse, ¡de modo que duplica la puntuación automáticamente! Puede volver a duplicar, triplicar, etc., el puntaje multiplicando el número de barras invertidas, pero no quería ser codicioso, y creo que podría exceder los límites de lo que puede ingresar.fuente
Befunge - 87
La primera línea vale cuatro puntos debido a toda la repetición, pero no hay caracteres duplicados en la segunda línea. El único literal de cadena en este código es
dlrow ,olleH
, que se invierte e imprime como salida. La eliminación de cualquier carácter desconectará elv
al final de la primera línea del@
final de la segunda, haciendo que el programa nunca termine. Siv
se elimina, el código irá a un bucle infinito imprimiendo la salida correcta.fuente
Aceto , 3
Finalmente logró obtener una puntuación positiva!
Pruébalo en línea!
fuente
∑
no está en impresión ASCIIAcc !! , -138 (y sí, eso es negativo 138)
Si bien puede que este no sea exactamente el mejor puntaje que he obtenido en PPCG, dudo que pueda ser más alto que esto en Acc !!
Pruébalo en línea!
fuente