Escribe un programa que salga
Do not repeat yourself!
Su código de programa debe respetar las siguientes restricciones:
- su longitud debe ser un número par
- cada carácter que está en posición
2n
(donden
es un entero> 0) debe ser igual al carácter en posición2n-1
. El segundo carácter del programa es igual al primero, el cuarto es igual al tercero, etc.
¡Las nuevas líneas cuentan como personajes!
Este es el código de golf, por lo que gana el código más corto.
Ejemplos
HHeellllooWWoorrlldd
es un programa valido
123
o AAABBB
o HHeello
son incorrectos
Verificación
Puede usar este script CJam para verificar que su código fuente sea válido. Simplemente pegue su código en el cuadro "Entrada" y ejecute el script.
DDDooo nnnooottt rrreeepppeeeaaattt yyyooouuurrrssseeelllfff!!!
sería una respuesta válida en TriggerRespuestas:
Hexagony ,
166126124 bytesAl insertar las no-operaciones y los espacios en blanco implícitos, esto corresponde al siguiente código fuente:
Estoy seguro de que es posible acortar esto aún más, y tal vez incluso resolverlo en la longitud lateral 6, pero se está volviendo complicado ...
Cómo funciona
Diagrama generado con el Coloreador de Hexagonía de Timwi .
El código es completamente lineal. La
\
derecha al inicio redirige la IP a una diagonal, de modo que no tenemos que preocuparnos por los caracteres duplicados. Las rutas de colores se ejecutan en el orden naranja / rojo, azul / gris, verde, morado (cuando hay dos rutas del mismo color, la ruta de la izquierda se ejecuta primero, antes de ajustarse a la derecha).Si ignoramos los no-ops, los espejos y los comandos que otros anulan, el código lineal se reduce a esto:
Las letras en Hexagony solo establecen el valor del borde de memoria actual en el código de caracteres de la letra.
;
imprime el borde de la memoria actual como un carácter. Utilizamos&
para restablecer el borde de la memoria0
e imprimir un espacio con32;
.}
se mueve a un borde diferente, para que podamos recordar el32
espacio adicional. El resto del código solo imprime letras en el nuevo borde y ocasionalmente se mueve hacia adelante y hacia atrás';}
para imprimir un espacio. Al final, volvemos al borde del espacio con'
, incrementamos el valor a 33 con)
e imprimimos el signo de exclamación.@
termina el programafuente
;
, todavía no hay absolutamente ninguna reutilización entre pares de caracteres en el código. El código actual es más o menos lo primero que se me ocurrió, así que estoy pensando que si uno lo intentara lo suficiente, debería ser posible encontrar una solución mucho más complicada que reutilice los puntos y comas y tal vez incluso algunas letras, para que encajen. en la longitud lateral 6.;
solo una vez porque no puede atravesarlos horizontalmente. Solo hay 23;
s en su código, y solo 6 repeticiones de caracteres (2 × o, 1 × t, 1 × r, 2 × e), dando solo 29. Personalmente, esto más que me convence de que el tamaño 6 es imposible. .GolfScript,
1308476 bytesPruébelo en línea en Web GolfScript .
Cómo funciona
El intérprete de GolfScript comienza colocando una cadena vacía en la pila.
Concatenando una matriz con una cadena se aplana, por lo que el resultado es el resultado deseado.
fuente
Unario , ~ 1.86 × 10 222
Brainfuck simple -> respuesta unaria. Muy subóptimo;).
El programa consta de un número par de 0; específicamente:
de ellos.
Código original de brainfuck:
fuente
1
s en el programa Unary que genera la cadena solicitada. El segundo bloque de código es el programa BF que se usó para producirlo. Como el programa Unary está completamente hecho de1
s, satisface trivialmente el requisito de repetición.Ruby -
210014281032820670 bytesEsto supone que la salida puede ser un valor de retorno de una función (no se especificó que la salida debe ser STDOUT)
Código:
El truco consiste en construir la cadena a partir de una cadena vacía
""
utilizando la operación de agregar<<
y los códigos ASCII de los caracteres.Para obtener los números de los códigos ASCII, estoy tratando de descomponer el número en valores que pueda generar fácilmente. Por ejemplo, ASCII
90
es justo88+1+1
, que es:88
está bien por sí mismo11**00
es decir11^0
, que es simplemente1
Afortunadamente tanto
++
y--
que significaríaadd
en rubí, de modo que pueda escribir90
como88++11**00++11**00
Hay algunos trucos para llegar a algunos números más fácilmente que simplemente agregar 1s, aquí está el código que estoy usando para generar lo anterior (que incluye todas las asignaciones que estoy usando):
Todavía estoy pensando en otros trucos para disminuir los caracteres necesarios para llegar a un número.
Tenga en cuenta que si usa la
-rpp
bandera y agregapp
al inicio del código de esta manera:luego, para 2 + 4 bytes adicionales, esto puede funcionar como un programa completamente completo, pero imprimirá un extra
"
antes y después de la cadena requerida:Ejemplo:
fuente
pp
gema es una letra doble ..."
caracteres adicionales en la salida y 2. la necesidad de la-rpp
bandera (que no es como--rrpp
)> <> , 174 bytes
Afortunadamente, en cierto sentido, la restricción no se aplica verticalmente. Sin embargo, el mayor problema es que necesitamos duplicar cada nueva línea.
El código que se ejecuta aproximadamente es el siguiente:
Tenga en cuenta que el programa no tiene espacios dobles: cuando está en modo de cadena,> <> empuja espacios para celdas vacías. Sin embargo, a la inversa, esto significa que una solución usando
g
(leer una sola celda del código fuente) sería más complicado, ya que los espacios que hay en el programa se convierten en NUL cuando se leen.(Nota: Esto puede ser 50 bytes más corto si termina con un error , pero me gusta de esta manera).
fuente
Sclipting ,
186146 bytesPara ser claros, hay tres líneas de código, la mitad de las cuales está vacía, porque la nueva línea debe duplicarse. El recuento de bytes se basa en la codificación UTF-16.
Explicación
El bloque de caracteres coreanos al comienzo empuja la cadena
"DDDof� \"\u0002nf�of�twG \"\u0002rw'efVpw\aefVaf\u0016twG \"\u0002yw�of�uwWrw'sw7efVlf�fff!\"\u0012"
. Notarás que cada tercer personaje es un personaje que queremos; El resto es galimatías. Este es el por qué:En Sclipting, dos caracteres coreanos codifican tres bytes. Por lo tanto, cada carácter coreano codifica efectivamente 12 bits. Para comenzar una cadena
D
, los primeros 8 bits tienen que ser0x44
; el resto no importa, pero como tenemos que repetir todos los caracteres, los bits 12 a 20 también lo serán0x44
. Por lo tanto, tendremos un valor de la forma0x44n44n
para algunos n , que se descompone en los tres bytes0x44 0xn4 0x4n
.Para el
o
, que es0x6F
, obtenemos los bytes0x6F 0xn6 0xFn
.Como soy vago, comencé codificando
"DDDooo nnnooottt (etc.)"
y luego reemplacé todos los demás caracteres con el anterior, por lo que obtengo0x444444
="DDD"
para elD
y0x6F66F6
="of�"
para elo
. El�
está allí porque0xF6
por sí solo es una codificación UTF-8 no válida.Ahora, de vuelta al programa. El resto del programa procede de la siguiente manera:
Ahora, lo que quiero hacer a continuación es usarlo
"..."
como una expresión regular para poder hacer coincidir tres caracteres de la cadena original a la vez, usando la construcción de bucle 替 ... 終. Sin embargo, dado que cada instrucción está duplicada, necesito tener dos bucles de expresión regular anidados uno dentro del otro, y si la pila no funciona, obtengo un error de tiempo de ejecución. Por lo tanto,y luego comienza los bucles. De esta manera, el bucle externo itera solo una vez porque coincide con la expresión regular
""
contra la cadena""
, lo que produce una sola coincidencia. El bucle interno se ejecuta una vez por cada partido de"..."
contra la cadena grande. El cuerpo del bucle es:El ciclo interno termina aquí, por lo que cada coincidencia de la expresión regular se reemplaza con el primer carácter de esa coincidencia. Esto deja la cadena deseada en la pila.
Luego, termina el bucle externo, en cuyo punto la cadena deseada se retira de la pila y la única coincidencia de
""
la cadena""
se reemplaza con ella, dejando la cadena deseada nuevamente en la pila.fuente
Laberinto , 528 bytes
Las nuevas líneas dobles duelen, pero al menos esto demuestra que es factible.
Cada carácter se imprime uno por uno, primero formando el punto de código y luego imprimiendo un único carácter. Los puntos de código están formados por:
dónde
Se explota el comportamiento inusual de los dígitos del Laberinto
33::00&&
, que en realidad esCada carácter individual se imprime con el mecanismo.
El
xx
sólo existen para rellenar la cuadrícula para que sea más 5 alta. Primero__
presionamos dos ceros, luego tocamos un operador de rotación de cuadrículav
. Hacemos un cero y giramos:y otra vez:
Luego nos movemos hacia la derecha
.
en la tercera fila, ejecutando el comando de impresión solo una vez.fuente
CJam -
176136 bytesGracias a Sp3000 por dividir el tamaño de mi programa entre dos :-)
Explicación
HH77++
,GG00++
... calculan el código ascii entero de los caracteres agregando números (por ejemplo: 'HH77 ++' empuja 17, 17 y 77 en la pila, luego agrega estos 3 números)]]{{cc}}//
recorre los códigos ascii y los convierte en caracteres.Pruébalo aquí
fuente
33cc
, pero estoy seguro de que hay mejores maneras para algunos de los otroscc
todas partes, hazlo]]{{cc}}//
al finalBrainf *** auto modificable , 72 bytes
Tenga en cuenta que
\x00
representa unNUL
byte hexadecimal literal (celda vacía). El código fuente se coloca en la cinta, a la izquierda de la celda inicial.Explicación
Además, antes de hacer este programa, estaba haciendo uno usando solo caracteres BF en la fuente. ¡Es posible! También es mucho más largo, ya que para un valor ASCII impar, iba a crear el doble del valor, luego dividirlo por dos. Algo más corto sería modificar toda la fuente para generar valores impares para comenzar.
fuente
DDoo nnoott rreeppeeaatt yyoouurrsseellff!!
(espacios dobles)? Veo dos.
s.Change first '.' to '0'
. Cambié la explicación para mostrar (nuevamente) que el primero.
se cambió a cero.Gelatina , 66 bytes (no competitiva)
Pruébalo en línea!
Factoid
El programa aún funciona si elimina cada segundo carácter.
Pruébalo en línea!
Cómo funciona
devuelve una matriz de cadena. El literal comienza con a
“
, termina con a”
, y las cadenas están delimitadas internamente por“
. El resultado esEl argumento del enlace y el valor de retorno se establecen en esta matriz de cadenas, luego se ejecuta el resto del código fuente.
fuente
Gammaplex , 66 bytes
Gammaplex es un lenguaje 2D que utiliza la posición de la primera línea nueva como la longitud de la línea e ignora todas las demás líneas nuevas.
fuente
MSM ,
270160bytesMi primer programa de MSM!
La salida de cadena en MSM se realiza empujando los caracteres individuales en la pila y uniéndolos en una sola cadena a través de
.
, por ejemploEl número de
.
es uno menos que el número de caracteres. ParaDo not repeat yourself!
nosotros necesitamos 22.
s. Por suerte este es un número par, por lo que tenemos 11 doblesPoner las letras delante requiere algo más de esfuerzo. El patrón
hace el truco para cada personaje
c
. Se evalúa de la siguiente maneraNecesitamos 23 patrones de este tipo que comiencen
!!'',,
y terminenDD'',,
seguidos de los 22 comandos de unión.
.fuente
Befunge 98, 70 66 bytes
Pruébalo en línea!
Después de mi respuesta no válida, ¡aquí hay una mejor que realmente se ajusta al desafío!
(Gracias a Martin Ender por sugerir el uso del
��
carácter 0x17 en lugar de88ff++
)Explicación:
fuente
8f+
: tio.run/nexus/…DC ,
348346342306290278 bytesArchivo
dnr6.short.dc
(sin línea nueva):Correr:
fuente
BotEngine , 6x49 = 294
fuente
Revés , 54 bytes
Pruébalo en línea!
Dado que el puntero de Backhand ya se mueve en tres celdas por tic, todo lo que tenemos que hacer es disminuirlo a 2 usando
v
fuente
reticular, no competitivo, 62 bytes
Pruébalo en línea!
Explicación en partes:
U
establece la dirección del puntero en(2, 0)
, es decir, mover2
las unidades xy las unidades y0
, por lo que omite todos los demás caracteres, comenzando con el siguienteU
omitido. Luego, se graba cada otro personaje, y es equivalente a:que es un programa de salida simple.
Otro
Esto está compitiendo por la recompensa JavaScript de WallyWest:
Puedo demostrar que, si bien los números pueden construirse bajo esta restricción, las cadenas no pueden. Dado que no se pueden usar literales, ya que la colocación de cualquier carácter de construcción literal crearía una cadena vacía:
Entonces, solo se puede usar algún operador; Los únicos operadores "emparejados" utilizados son:
Y ninguno de estos puede emitir números / otros a cadenas. Por lo tanto, no se pueden generar cadenas.
fuente
Alice , 74 bytes
Pruébalo en línea!
Explicación
El primer problema es que necesitamos poder ingresar la cadena, por lo que queremos omitir solo el primero
"
. Hacemos esto saltando a la primera"
porque luego la IP moverá una celda antes de mirar la celda actual nuevamente, de modo que sea la segunda la"
que ingrese al modo de cadena. Pero para poder saltar allí, necesitamos10, 0
en la parte superior de la pila, en ese orden (segundo, superior). Esto se hace conaa00tt,,
:Esta función de rotación muestra un argumento. Si ese argumento es negativo, empuja el valor en la parte superior de la pila hacia abajo en esa cantidad de posiciones. Si el argumento es positivo, busca el elemento que se encuentra muchas posiciones debajo de la parte superior y lo empuja hacia arriba. Tenga en cuenta que, en el caso de
Rotate(10)
, no hay suficientes elementos en la pila, pero hay una cantidad infinita implícita de ceros en la parte inferior, por lo que un cero termina en la parte superior.Ahora podemos
J
pasar al primero"
usando estos dos argumentos. El segundo"
ingresa al modo de cadena y registra todo esoDDoo nnoott...
. Cuando toca el/
, la IP se redirige al sureste y entramos en modo ordinal. Por ahora, la IP rebota hacia arriba y hacia abajo a través de las tres líneas (dos de las cuales están vacías), por lo que primero registra tres espacios más en las líneas dos y tres y luego dejamos el modo de cadena cuando toca el"
. Dado que estamos en modo Ordinal en este momento, todos los caracteres grabados se insertan como una sola cadena en la pila (a pesar de que grabamos la mayoría de ellos en modo Cardinal), por lo que terminamos con esta cadena (tenga en cuenta los espacios finales) :Ahora la IP sigue rebotando hacia arriba y hacia abajo, lo que significa que ejecuta un comando de cada par, es decir,
Y
yt
. Luego, la IP llegará al final de la cuadrícula en la segunda línea y comenzará a rebotar hacia atrás a través de la cuadrícula. Esto también cambia en qué par de caracteres la IP toca la primera línea, por lo que al retroceder ahora se ejecuta;
,o
y@
. Ignorando todos los espacios y las redirecciones de IP implícitas, el código ejecutado estáYt;o@
en modo Ordinal.El
Y
es el comando "descomprimir" que separa una cadena en los caracteres en posiciones alternas. Dado que cada carácter se repite, eso realmente nos da dos copias de la cadena que buscamos, aunque la primera copia tiene dos espacios finales y la segunda tiene un espacio final.t
divide ese espacio final y lo;
descarta. Finalmente,o
imprime la cadena y@
termina el programa.fuente
05AB1E ,
1005852 bytes-6 bytes gracias a Kevin Cruijssen
Pruébalo en línea!
Reglas de idempotencia.
fuente
á
no se vectoriza en las cadenas internas, de lo contrario podría usarse después de))
... Eliminar todoá
y usarεεáá}}
después de los))
trabajos como alternativa, pero desafortunadamente no guarda ningún byte (pero ¿tal vez puedas encontrar inspiración en él? ) .. Y en„„!!
lugar de……!!
trabajar también, ya que el!
incorporado deja las cuerdas aparentemente igual. Ah bueno, lo intenté. xD##θθáá
por un tiempo, y por alguna razón no lo consideréεε}}
... Lo intent退
, lo que no funciona ... Esta es la respuesta más corta, ¡gracias!Stax , 70 bytes
¡Ejecútelo y depúrelo en staxlang.xyz!
Stax, afortunadamente, tiene la capacidad
::
para cada enésima. Todo lo que necesito es empujar la cadena doblada, presionar 2 y correr::
. Fácil, verdad?Incorrecto.
Empujar esa cuerda es complicado. La primera comilla se puede duplicar por
..""
, que es un literal de longitud 2 para."
seguido de una comilla significativa. El problema es que no veo forma de terminar la cadena (lo cual es necesario, o de lo contrario se imprimirá la versión duplicada) sin comenzar una nueva.El final del programa termina los literales de cadena. Si puedo poner este literal duplicado allí, tal vez haya una buena solución. Sin embargo, para saltar desde el final de un programa, se requiere
G}
, así que, como mínimo, estoy mirando esto:Esto no hace ... nada.
G
no comienza un bloqueo, por lo que ninguno saltará al segundo}
. Una vez más, tengo que hacer caso omiso de un carácter:..}}
. La ejecución salta del primeroG
al segundo}
, continúa hasta el final, salta de nuevo al segundoG
y de allí al segundo}
, y continúa una vez más hasta el final antes de continuar al comienzo de la[deduplicate]
sección con la cadena doblada encima de la pila.La deduplicación es simple.
11hh
empujó once y lo redujo a la mitad dos veces, redondeando hacia abajo las dos veces y produciendo dos, y::
luego nos dará la salida que necesitamos.UH oh. Esto no imprime nada. Aquí hay dos problemas: primero, eso
..}
significa que la cadena.}
estará encima de la pila al final del programa, y segundo, ¡la salida implícita ordinaria de Stax ahora está desactivada!El peor problema es la salida. Cuando un programa Stax finaliza correctamente sin imprimir nada, la parte superior de la pila se imprimirá implícitamente. ¿Pero no hemos impreso nada ...? Ah, pero tenemos. Los literales de cadena no terminados se imprimen en lugar de empujarse, e incluso esas dos cadenas vacías (de las que no coinciden
"
al final), a pesar de estar vacías, son suficientes para disparar esta comprobación. Cualquier impresión debe hacerse a mano.Necesitaremos uno
pp
oPP
, y en este caso, ignorar el primer paso..pp
es inaceptable, ya que imprimirá la cadena.p
. Eso significa que necesitamos nuestra salida deseada ya sea solo en la pila o en los dos primeros junto con una cadena vacía. Esto último se logra presionando dos cadenas vacías (zz
) y girando los tres elementos superiores dos veces (aa
) antes de imprimir.Una vez hecho esto, tenemos una pila de cuatro cuerdas de alto. Un quinto,
.}
luego se empuja antes de que el programa salga con gracia; En este punto, la falta de salida implícita se convierte en una bendición y una maldición, ya que ahora no se imprimirá nada extra.fuente