Potencialmente muy difícil, pero he visto algunas cosas increíbles que salen de este sitio.
El objetivo es escribir un programa, en cualquier idioma, que haga lo que quiera. El problema es que el programa debe ser válido después de cualquier desplazamiento circular de los caracteres.
Un cambio de carácter circular es muy similar a un cambio circular . Algunos ejemplos aclaran mis cosas.
Para el programa int main() { return 0; }
El desplazamiento hacia la izquierda por 6 caracteres produce: in() { return 0; }int ma
desplazarse a la izquierda por 1 carácter produce: nt main() { return 0; }i
desplazarse a la derecha por 10 caracteres produce: eturn 0; }int main() { r
Sin embargo, este programa obviamente no cumple con las reglas.
Reglas
- Cualquier idioma
- El ganador se decide por recuento de votos
- Las soluciones que hacen lo mismo, o cosas completamente diferentes para cada rotación, recibirán 100 votos virtuales para su puntaje.
ACTUALIZACIÓN Creo que esto ha durado lo suficiente. El ganador, con más votos (votos virtuales incluidos) es Mark Byers. ¡Bien hecho!
fuente
Respuestas:
Use el lenguaje correcto para la tarea. En este caso, ese es Befunge .
Este lenguaje permite naturalmente rotaciones porque:
Este programa Befunge imprime exactamente la misma salida ("Hola") independientemente de cuántos "cambios de caracteres circulares" utilice:
Se ejecuta en Befungee . Requiere que se aumente el tablero (no el valor predeterminado de 80 caracteres). Se puede ejecutar así:
Funciona primero generando y almacenando dinámicamente un programa que imprime "Hola" y luego sobrescribiendo el primer byte para redirigir el control al programa recién escrito. El programa se escribe dos veces, de modo que si un byte no se escribe correctamente la primera vez, se corregirá la segunda vez.
La idea podría extenderse para producir cualquier programa de complejidad arbitraria.
fuente
Brainf * ck
Elija la herramienta adecuada para el trabajo: ¡un adagio que nunca ha sido más relevante que este trabajo aquí mismo!
El programa no desplazado que ve aquí simplemente se imprime
SHIFT
(más una nueva línea). Los cambios circulares de forma abrupta producirán varias otras salidas, aunque siempre generarán seis caracteres ASCII.fuente
Commodore 64 BÁSICO
?
es la abreviatura dePRINT
y:
es un separador de sentencias, entonces:Las variaciones más largas son, por supuesto, posibles:
etc ...
fuente
Golfscript
Este programa imprime algunos dígitos que siempre suman 2, independientemente de cómo se cambie el programa:
Se imprime la primera línea
1010
(10 en binario), se imprime la segunda línea02
y se imprimen todas las demás líneas2
.Actualizar:
El programa se puede probar aquí . Tenga en cuenta que he agregado
n
s al final de cada fila solo para formatear la salida; estos se pueden eliminar y el programa aún funciona.fuente
Ruby, probablemente una de las soluciones más cortas posibles:
Y otro un poco más largo y más interesante:
fuente
binario x86 de 16 bits
Construido manualmente con la ayuda de estas ( 1 2 ) tablas, nasm y ndisasm. Esto siempre regresará sin un bloqueo o bucle infinito, porque no hay bytes que salten o cambien la pila y se llene con NOP para terminar con un solo byte
ret
instrucción de en cualquier caso.En la mayoría de los casos, esto generará
FOO
una subcadena de eso. SiAX
está roto, esto llamará un int 10 aleatorio (esto cambió la velocidad de parpadeo del cursor en una de mis pruebas), pero generalmente no resulta en un bloqueo.Para probar, coloque el hexdump en un archivo y use
xxd -r foo.hex > foo.com
, luego ejecútelo en un entorno de dos (usé dosbox).Aquí hay un volcado hexadecimal de este archivo:
Y algunas compensaciones interesantes desmontadas:
+0
(para los ejemplos a continuación, el resto del binario sigue siendo válido)
+1
+2
+6
+11
+12
+18
(otras compensaciones son solo repeticiones de lo anterior)
+58
fuente
Respuesta unaria:
^ 44391 Ceros
Programa de gatos. No importa cómo rotas, es el mismo programa.
fuente
PHP
Aquí tienes, un programa PHP válido:
fuente
Scala
A citas anidadas:
C ++ / Java / C # /ScalaComentario:
Comando vacío:
Golpetazo
Comentario, combinación de espacios en blanco y Shell:
Sed
Comandos válidos independientes:
p
P
n
N
g
G
d
D
h
H
Una combinación de lo anterior:
p;P;n;N;g;G;d;D;h;H;
AWK
Para imprimir cada línea del archivo:
o
No imprimas nada:
Perl
fuente
;P;n;N;g;G;d;D;h;H
valido?J
Primero, un script para verificar rotaciones válidas de un programa
s
:Por ejemplo, el programa
+/1 5
(suma de 1 y 5) da:Luego, un programa aburrido y válido:
fuente
corriente continua
Los programas de CC son fácilmente válidos en cualquier rotación. Por ejemplo:
fuente
Codigo de maquina
¿Qué hay del código de máquina Z80 / Intel 8051 para NOP ?
Claro que no hace ninguna operación, pero toma un ciclo o dos ... puede tener tantos o tan pocos como desee.
Y no estoy de acuerdo con la respuesta de Ruby anterior: creo que un solo byte 00h es más corto que un Ruby
p
.fuente
k
Evalúa una cadena vacía
Devuelve un carácter de punto
Devuelve la aplicación parcial de '.' (forma dinámica) a una lista de caracteres vacía.
fuente
sh, bash
cc girado es cc nuevamente, pero no es muy amigable si se llama tan desnudo.
dh debhelper tampoco es muy cooperativo, mientras que hexdump solo espera la entrada.
Ghostscript inicia el modo interactivo, mientras que el grupo de conmutadores muestra un mensaje de uso, una solución válida aquí, en mi opinión, también.
Y aquí está el guión para encontrar candidatos para tales programas:
Si también encuentra secuencias más largas, como (arj, jar) o (luatex, texlua) que no son válidas después de cada turno, pero solo después de ciertos turnos, que leí mal al principio, pero hay pocos, por lo que es fácil para filtrarlos a mano.
fuente
arj
/jar
no es válido, ya que no hay unrja
comando (aunque me gusta este ejemplo). +1 para el guión: muy buena idea :)every
o para querer decira random one
. El ejemplo conshift left by 6
,left by 1
yright by 10
me aseguró en la interpretación, que solo necesito encontrar una sola posibilidad de cambio.... in any language ...
: mi solución solo funciona en bash (y sh, zsh, ash y algunas otras), pero todas esas otras soluciones también toman nombres de programas.Ejemplo trivial de Python:
Se pueden cambiar tres caracteres repetidamente para revelar más y más del alfabeto.
fuente
Pitón
Solo evalúa algunos números
fuente
dc ya se usa, pero el siguiente programa siempre genera lo mismo , sin importar la rotación: D
salidas
fuente