Imprima la frase And she said, 'But that's his.'
usando solo los siguientes caracteres: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Sin signos de puntuación o caracteres no alfabéticos. Puede usar el lenguaje de programación que desee. El espacio en blanco está completamente permitido. El programa más corto gana.
code-golf
kolmogorov-complexity
restricted-source
Halcón de crin azul
fuente
fuente
a-zA-Z
. En teoría, podría usarw
rite yE
val para crear las instrucciones necesarias, pero ninguna de ellas+-*,%'"
se puede construir sin usar (al menos) una de ellas+-*,%'"0-9
.(programmer-of (language 'lisp))
no le gusta estoRespuestas:
De espacio en blanco ,
417414349265 bytes265 bytes gracias a Kevin Cruijssen
Pruébalo en línea!
Explicado:
fuente
Whitespace is completely allowed.
Veo que has tomado esto literalmente.NNN
para salir, ya que ya se detiene con un error cuando está agregando antes de print_char, por lo que ni siquiera vendrá después de Jump_to_Label. Además, ¿por qué almacenar el63
al principio y recuperarlo en el bucle? Simplemente puede presionarlo antes de agregarlo. Y, ¿por qué es el Label-nrTTSSSSTN
? Una etiqueta incluso puede estar vacía, por lo que soloNSSN
para crear la etiqueta yNSNN
saltar a la etiqueta es suficiente cuando solo está usando una etiqueta.63
? No estoy 100% seguro de que sea la constante más corta posible aquí. Si es así, algo está mal con mi programa de generación constante que escribí para un desafío anterior. :)102
es la más eficiente: 281 bytes (o aquí con resaltado ). (NOTA: También he usado una copia para guardar 4 bytes para el espacio intermedioehs dnA
(copiado del espacio intermediodias ehs
).Perl 5 ,
13310295 bytesPruébalo en línea!
Explicación:
Regexes, print y chop se aplican a la variable
$_
por defecto.Reemplaza la cadena vacía con
And she saidZ ZBut thatZs hisZZGjGGf
.Reemplaza cada uno
Z
con el resultado de la evaluaciónchr oct oct oct ord chop
. Esto elimina el último carácter de$_
, toma su código clave, lo interpreta como octal tres veces y lo convierte de nuevo en un carácter. Por ejemplo,j
→ 106 → 70 → 56 → 46 →.
.Debido a la forma en que funciona el reemplazo, las modificaciones
$_
que ocurren mientras se evalúa el reemplazo se pierden, por$_
lo que ahora es asíAnd she said, 'But that's his.'GjGGf
.Elimina todo
G
,j
yf
en$_
.fuente
print
consay
de -2 caracteres. El meta consenso actual dice que las banderas de línea de comando como-M5.010
no cuentan para el conteo de bytes.> <> ,
916915903 bytesAl principio pensé que una solución en> <> era imposible, pero luego me di cuenta ... ¿quién necesita condicionales o control lógico? :RE
Pruébalo en línea
Empujo repetidamente los números (el número 15) a la pila, luego empujo la longitud de la pila e imprimo el carácter con ese valor ASCII. Si necesito reducir la longitud de la pila, reduzco la pila tres valores a la vez usando
p
, o uno a la vez usandog
si estoy dentro de tres del objetivo. El programa termina llamandoi
(input), que empuja a-1
ya que no hay entrada, luego lo imprime para causar un error.Este es el programa Python 3 que usé para crear la solución una vez que pensé en cómo hacerlo:
Pruébalo en línea
fuente
p
: crear un 59 en la pila mientras se mueve desde el espacio a las
ensaid
, luego se coloca en el código en el camino hacia abajo desded
a,
. (Tenga en cuenta que (15,15) tiene 15 en este punto.)l
yp
poner varios caracteres útiles en el rectángulo (10,10) - (15,15), luego recuperarlosg
donde sea más conveniente.8086 Asamblea en PC IBM,
1463845664 bytesAclaración: La fuente real del lenguaje ensamblador es la entrada, no el código de máquina generado.
La dificultad es que la mayoría de las instrucciones x86 (como ADD, SUB, JMP, saltos condicionales, acceso a memoria) tienen dos argumentos y, por lo tanto, necesitan una coma o una dirección de memoria. Por lo tanto, no podemos usar sumas, restas, ifs o bucles.
Durante mi primer intento pude "construir" números usando una combinación de incremento, decremento, multiplicación, división, trucos de bytes y las oscuras instrucciones BCD (como AAA, DAS). Después de eso, me di cuenta de que esta idea podría usarse para crear código de autoinspección y auto modificación.
Intento 1. (1463 bytes)
Usó las instrucciones disponibles para construir códigos ASCII y la dirección 0xb800 del búfer de pantalla. El cálculo de cada personaje en la secuencia fue golfizado a mano.
Intento 2. (no completo)
Se dio cuenta de que hay un código de operación para cada número entero en el rango 0x40-0x5f. Esta gama incluye AZ. Entonces, por ejemplo, INC CX corresponde a 0x41 = 'A'. (Esta tabla de códigos de operación es muy útil).
Intenté construir 3 cadenas de "datos" y colocarlas una encima de la otra. El primer as-is (mayúscula), el segundo "desplazado" a la zona 0x60-0x7f (minúscula) y el último "desplazado" a la zona 0x20-0x3f (puntuación).
El código auto modificable produciría un bucle o tres para iterar sobre los datos.
Intento 3. (845 bytes)
Al igual que el enfoque anterior, pero para reducir los datos, la cadena solo se codificaría una vez, con "caracteres de control" mezclados para cambiar los conjuntos de caracteres.
Intento 4. (664 bytes)
¿Cómo deshacerse de los caracteres de control que requieren muchas instrucciones parcheadas para lidiar con la ramificación? Dado que solo se usan dos letras mayúsculas, me preguntaba si podría "voltear" la tabla de códigos de operación para codificar letras minúsculas usando el rango 0x40-0x4f y la puntuación usando el rango 0x90-0x9f (restando de 0xc0). La "A" y la "B" se pueden poner por separado.
Sin embargo, solo la mitad de los códigos de operación en el rango 0x90-0x9f son utilizables y no se alinearon con los necesarios. Entonces pensé que tal vez podría barajarlos usando un XOR, y encontré uno que funcionó. Y aquí está.
Golfizado:
Montar con
y ejecutar en DOSBOX (ejecutar CLS primero). Se ve como esto:
Comentado:
fuente
INC AX
mientras que la no comentada esINC AL
.label1 db
una línea propia. Producirá una advertencia, pero no un error.Perl 6 ,
1299127212201215 bytesGracias a Grimy por -27 bytes.
-52 bytes porque no necesitábamos las orejas de conejo en primer lugar.
Gracias a Jo King por -5 bytes.
Pruébalo en línea!
Emite la cadena con una nueva línea final. Si no quiere eso, reemplace el último
say
con aprint
. También puede reemplazar las nuevas líneas en la fuente con espacios.Explicación
Este código imprime la cadena carácter por carácter. Cada carácter se forma al alimentar el código de carácter apropiado en la
chr
función y ponerlo en minúsculalc
si es necesario.Actualmente, todos los valores se generan al generar una cadena con el número correcto de caracteres; En algunos casos, el número de caracteres es el reverso del código de caracteres de destino. Teóricamente debería ser posible usar funciones matemáticas como
log
yexp
directamente, pero no me resultó muy fácil usarlas.Para usar como números, tenemos
e
,pi
ytau
; en el lado derecho dex
oxx
, están implícitamente en el suelo. Todos tienen 17 caracteres en sus representaciones de cadena, por lo que los usamose
para un recuento mínimo de caracteres. También tenemosi
(4 caracteres),False
(5 caracteres) yNaN
(3 caracteres). Podemos multiplicar longitudes de cuerda conx
;xx
multiplica uno más el largo de la cuerda por el lado derecho y agrega uno.chop
elimina un personaje de la cadena en caso de que estemos lejos del objetivo.Las declaraciones de impresión se encadenan juntas usando
and
, que tiene una precedencia bastante baja. Es casi un milagro que exista; de lo contrario, tendríamos que usar puntos y comas ilegales.Encontré las expresiones de los personajes a mano. Puede valer la pena buscarlos mediante programación para encontrar expresiones más cortas.
fuente
Ancho ,
6664 bytesPruébalo en línea!
Impresiones para depurar. Para imprimir en stdout, agregue
ww
al final del código, que aparece y genera la parte superior de la pila.Explicación
En Ancho, cada letra se correlaciona con un número, según su "ancho", según esta tabla . Esto asigna a cada letra un número del 0 al 9. Luego, esos números se utilizan para ejecutar el código.
En particular, una letra que coincide
7
iniciará un literal de cadena. Leerá conjuntos de dos letras a la vez, hasta que vuelva a leer la letra original. Cada conjunto de dos letras se convertirá a sus números de ancho, se leerá como un número decimal entre 0 y 99, y el carácter que igualarán será su índice en la siguiente cadena:Por ejemplo, el índice de
!
es 1, por01
lo que serán los números de ancho correctos. Por lo tanto,if
,iI
,jt
, etc hará todo correlato a un literal de cadena de!
.En este caso, traduje los 31 caracteres de la salida requerida a las letras apropiadas, utilizando
Q
como comillas. La parte superior de la pila se imprime para depurar cuando finaliza el programa.fuente
Código de máquina x86 (32 bits), 256 bytes
Cuando imprimo mi código en mi consola de página de códigos 437, veo lo siguiente:
Contiene algunos caracteres de espacio en blanco, por lo que aquí está el mismo código cuando reemplazo todos los caracteres de tabulación por
→
y todos los caracteres de espacio sin separación (con el código 255) por*
:Hexdump:
Algunas explicaciones sobre cómo funciona:
Las instrucciones útiles son:
push imm8
,push imm16
ypush imm32
, seguido depop
generar constantes. Esto también puede generar cero (inah
) al presionar un byte (imm8
).and [ecx+32], ah
- suponiendo ah = 0, esto establece el byte a cero. Sucede que la longitud de la cadena de salida es 32, por lo que el código llena el búfer de principio a fin.or [ecx+32], edx
- suponiendo que el byte de salida se establece en cero, esto copiaedx
(4 bytes) a la salida. Utilizo una variante endx
lugar deedx
cerca del final del búfer, porque no debería escribir más allá del búfer de salida. ¡La restricción en el código hace que sea imposible escribir bytes individuales de esta manera!imul edx, [ecx+32], whatever
- Esta es la idea principal de codificación. Con suficiente entropía[ecx+32]
y cualquier número, puede generar cualquier salida. Lo uso para generar 2 o 3 bytes de valores necesarios. Alguna complicación es que, al escribirlo en la salida, debe hacer lógicaOR
con lo que ya está allí. Esto a veces hizo necesario volver a poner a cero la memoria.jmp
instrucción se utiliza para regresar. Lo elegí porque su codificación es0xff
, que corresponde a un espacio que no se rompe en la página de códigos 437. Un poco exagerado en las reglas, pero de lo contrario creo que la tarea es imposible ...Código fuente del ensamblado, junto con un programa en C que lo ejecuta (usa la sintaxis de Visual Studio):
fuente
dec ecx
+and [ecx+32], ah
cosas se pueden factorizar.0xff
viola "Sin signos de puntuación o caracteres no alfabéticos"?PostScript,
889874837835 bytesPruébalo en línea!
Esto usa 32 copias de los enteros
89 25 20 6
. Todos los códigos de barras de la cadena de destino se pueden obtener con operaciones en esos enteros, en orden de pila: por ejemplo, 'A' (ASCII 65) es 89 - (25 y (20 + 6)). Muchas 4 tuplas de enteros tienen esta propiedad; este fue elegido porque son particularmente fáciles de generar.El valor predeterminado plano es 1, por lo que esto crea una cadena de longitud 1 (inicializada en
\0
).dup
no es una copia profunda: crea una segunda referencia a la misma cadena. rrand empuja la semilla aleatoria, que por defecto es 0. La pila es ahora["\0", "\0", 0]
.count
empuja el número de elementos en la pila, por lo que calcula 3 ^ (3 * (5 * 6)) = 89.4 * 5 = 20, 5 * 5 = 25, 6 = 6. La pila es ahora
["\0", "\0", 0, 89, 25, 20, 6]
.Duplicar toda la pila, cinco veces. Así terminamos con 32 copias de nuestra pila inicial de 7 elementos. Solo necesitamos 31 copias, ya que la cadena de destino tiene 31 caracteres de largo, pero la copia adicional no duele.
Calcule un código de char de los cuatro enteros superiores, escríbalo en el índice 0 de la cadena, luego imprima la cadena.
Suprime la solicitud predeterminada.
fuente
Rubí ,
420 354338 bytesPruébalo en línea!
En orden ascendente de disgusto:
Las palabras que comienzan con una letra mayúscula pueden imprimirse definiendo una clase con ese nombre y llamando
display
dentro del cuerpo de definición de clase.Se pueden mostrar otras palabras definiendo métodos con ese nombre, que devuelve un Símbolo, y luego convirtiéndolo en una Cadena para eliminar los dos puntos iniciales.
Se pueden mostrar otros caracteres llamando
putc
a su código ASCII. Podemos generar los números apropiados reutilizando elString def
truco para obtener una cadena, luego tomando la suma de sus bytes usando un módulo determinado por su tamaño. Desafortunadamente, no tenemos ninguna forma de invocar métodos en un objeto que no sea dentro de la definición de clase de ese objeto, lo que hace que sea difícil pasar argumentos. Entonces, el truco final es redefinirString#inspect
, que se llama implícitamente al pasar una Cadena alp
método, para que calcule y muestre el carácter apropiado como efecto secundario, antes de generar un error para quep
no pueda terminar de ejecutarse e imprimir un nueva línea. Entonces necesitamos rescatar el error en el código principal.Editar: Jordan hizo que el byte contara mucho menos, ejem, alto con un poco de flujo de control de golf inteligente, y he cortado algunos bytes más al reemplazarlo
raise
con una llamada de método inexistente de una letra, lo que genera un NameError.Edición 2: Noté que con
print String
extraído en un método, es más barato usarlo solo con una definición de método que usar el truco de definición de clase, ya que los métodos pueden estar en mayúsculas.fuente
sum size
la suma del módulo tiene su tamaño, ¡pero todo lo demás funciona!> <> ,
233122 bytesPruébalo en línea!
Esto comenzó como un golf de la respuesta de mbomb , pero descubrí un cambio fundamental que ahorra una gran cantidad de bytes, así que lo publico como mi propia respuesta.
La generación de caracteres no alfabéticos para la salida se realiza presionando repetidamente valores en la pila, luego se usa
l
para empujar la longitud de la pila. Sin embargo, esto no necesita ser emitido de inmediato: usandop
, este carácter puede colocarse en cualquier celda cuyas coordenadas estén entre 10 y 15 inclusive, para ser recuperado más tarde cong
. Del mismo modo, los caracteres alfabéticos se pueden colocar en el código fuente inicial y leer de esta manera: dado que el código de caracteres no alfabéticos más alto en la entrada es 46 (.
), esto significa que la pila no necesita ser empujada más arriba de los 62 necesarios para almacenar los 31 caracteres de la salida.Además,
v
se coloca a en el código de la columna 7. Cuando el puntero de instrucción se ajusta y golpeav
, la secuenciago
se ejecuta repetidamente para leer desde las coordenadas empujadas y generar los caracteres correspondientes. Finalmente, la pila se vacía yg
finaliza el programa con un error.Los primeros 7 bytes de código se reutilizan como las primeras 7 y las últimas 7 coordenadas empujadas. Colocar el
v
en la columna 9 teóricamente habría guardado dos bytes más, pero habría forzado a los caracteresAinsv
a un cuadrado de 2x2 en el código, lo cual es imposible. Una versión anterior usaba la columna 15, pero eso requería una línea adicional en el código fuente y terminaba seis bytes más.fuente
r
para mover la alineación donde quiera. Sin embargo, jugar golf a este programa me duele un poco el cerebro.CJam , 262 bytes
Pruébalo en línea! Las líneas nuevas solo se muestran aquí para mayor claridad; Cada línea representa un personaje.
Menos mal, esto fue divertido. Restringirnos a los comandos alfabéticos plantea algunos desafíos interesantes:
{
y}
, prácticamente no hay oportunidad para controlar el flujo (exceptof
, que no encontré una oportunidad para usar).\
,_
,;
, o$
, no tenemos medios para la manipulación de pila.Esto significa que el objetivo principal será obtener los puntos de código relevantes en la pila y luego convertirlos en caracteres con
c
.El problema es que también nos faltan los comandos aritméticos más básicos, así como los literales enteros. Sin embargo, esto está bien, ya que el
m
espacio de nombres contiene numerosas operaciones matemáticas avanzadas, y hay muchas variables predefinidas para números útiles.Terminé haciendo un uso intensivo de las raíces cuadradas (
mQ
ymq
), la función exponencialme
y la conversión de base (b
), que también se pueden usar para emular la multiplicación ([X 0] Yb
calcula X * Y). Además, a veces es más fácil construir el punto de código en mayúsculas, en cuyo caso podemos usarel
(convertir a minúsculas) en el carácter resultante.Todavía no estoy satisfecho con algunos de los más largos. Oh bien.
Explicación
Esta es una explicación carácter por carácter de la salida. Antes de comenzar, aquí hay algunas formas cortas de hacer números:
T
,X
,Y
,Z
respectivamente.A
travésK
.Sci
(S
empuja una cadena que contiene un espacio,c
obtiene el primer carácter de esta cadena yi
convierte ese carácter en su punto de código).S
También se utiliza para espacios.GmQ
(raíz cuadrada entera de 16).AZbYb
(convertir 10 a base 3, rindiendo[1 0 1]
, y convertir la matriz de números resultante a base 2, rindiendo 5).Ymei
(compute exp (2) y convertir a entero).A
n
d
s
h
e
a
i
,
'
B
u
t
.
fuente
HYbYCtYbc
,HYbXAtYbc
yHYbXBtYbc
.Deadfish ~ , 943 bytes
Pruébalo en línea!
No se permiten bucles
:(
fuente
malvado , 198 bytes
Pruébalo en línea!
Esto fue muy divertido.
fuente
Stax ,
133958479 bytesEjecutar y depurarlo
fuente
MATL ,
187158bytesPruébalo en línea!
Versión más legible: ¡ Pruébelo en línea! Intento manual de construir la cuerda. Probablemente haya mucho espacio para jugar al golf cortando la cuerda en trozos convenientes, usando
P
yh
para voltear y construir una cuerda. Espero que alguien acepte el desafío de superarme. El principal desafío es que no puede usar+
o-
, por lo que la aritmética básica a menudo no es posible.Reflejos:
KQthpYq
: el número 25 (KQthp
) primoYq
es 97, correspondiente a la letraa
. La letras
(115) se genera de manera similar a partir del 113, el 30º número primo. Luego se reutiliza ampliamente en el portapapelesJ
.his
se acorta almacenando elh
de antes en el portapapelesJ
. Desde que se almacenó anteriormentes
, construimoshis
en reversa para que podamos recuperar els
uso recientey
y voltearlo después de usarloP
.h
avle
)fuente
v
metería elh
que tenía antes. Supongo que debería haberlo hecho en lugar de asumirlo. Además, gracias por el aviso, se produjo una eliminación excesivamente celosa. Tengo curiosidad por ver si puedes hacerlo mejor que esto ...U
significa^2
que eso podría haberme ahorrado bastantes bytes ...MATL , 118 bytes
Pruébalo en línea!
Versión más legible (cada línea corresponde a un carácter, excepto las operaciones de reorganización de la pila).
Explicación
El programa produce los puntos de código de los caracteres requeridos, como números independientes. Al final, todos esos números se concatenan en un vector de columna, se reforman como un vector de fila y se convierten en caracteres. El resultado se muestra implícitamente.
Algunos de los trucos utilizados:
0
se usa para la mayoría de los espacios, porque solo cuesta un byte (O
).15
se usa (generado comoKUq
), porque luego se puede reutilizar agregándolo a100
(chard
) para dar115
(s
). En otra ocasión5
se usa para el espacio (generado comoKQ
), por lo que luego se puede restar de44
(,
) para dar39
('
).J
se usa para almacenar caracteres que se repetirán: primeros
, luego'
. Del mismo modo, el portapapelesH
almacena100
, lo cual es útil parad
y para generar otros caracteres.Q
(sumar1
),q
(restar1
),E
(multiplicar por2
) yU
(cuadrado), junto con los literales predefinidos en los portapapelesI
(3
) yK
(4
).h
) y calculando su suma (s
) o diferencias consecutivas (d
).100
(d
) se genera como4
en binario interpretado como un número decimal.110
(n
) se obtiene de65
(A
) mediante la conversión a cadena ('65'
: puntos de código[54 53]
), sumando1
a los puntos de código ([55 54]
), sumándolos y sumando1
.w
), bubble upb
).fuente
O
lugar deKWE
para espacios. Y confirmó mi sospecha de que probablemente sea mejor sacrificar otro portapapelesH
.dc ,
240222209 bytesPruébalo en línea!
Mi primer pensamiento fue el mismo que @seshoumara, solo empuje suficientes cosas en la pila para generar todos los valores ASCII de los personajes. Entonces se me ocurrió que desde entonces
+
,-
y que*
somos operadores de un solo carácter, ¡puedo recrearlos y tener la capacidad de usar la aritmética! ¡Seguramente eso sería más pequeño!Y, no me sorprendería si pudiera jugar golf más bytes, pero por ahora ... este enfoque complicado ha logrado vincular al ingenuo (ish).OOOOOziOOOOOOOOOOOOOOOOOOOOOOOOOOOzddddddzkdddzasBdzasAdzscdzdasCzsd
es la parte del enfoque que es similar a la de @ seshoumara, pero solo subimos a 46, que es.
. Hacemos esto porque necesitamos subir a 45,-
y también necesitamos un período en nuestra cadena, por lo que solo ir uno más para el período es (creo) más barato. En el camino, almacenamos algunos valores: 5, 32, 39, todos serán útiles más tarde. 5 para cosas utilitarias, 32 y 39 para sus valores ASCII. Originalmente hice 1-5, pero eso era costoso, y pude simplemente evitar usar 4; useZ
(resalte un valor, presione el número de dígitos que tiene) en un número de tres, dos o un dígito para esos valores. A los 42, 43 y 45, convertimos estos para cuerdas (*
,+
, y-
respectivamente) y guardarlas como macros (B
,A
yC
respectivamente). Esto significa que sin usar los caracteres*+-
, ahora podemos usar esos operadores.A partir de aquí, básicamente comenzamos a generar los valores ASCII utilizando el poder de las matemáticas en lugar de la simple acumulación, almacenando algunas de las repeticiones en el camino. 100, 105 y 115 aparecen lo suficiente como para almacenarlos (en registros o de otro modo) tiene sentido. Originalmente, dejé la pila llena de 10 y los usé para hacer 100; terminó guardando bytes para llenar la pila con 32s y usarlos como espacios más adelante. Una versión ligeramente más legible de la sección ASCII:
OOlAxlAxP OBlBxdIlAxoP AdlBxddsrIlAxssP P OP lsIZlCxddspP OZlCxP P OP lrdZlCxP lsP lrP lcP P KP dZlBxdZlAxP OAZlAxdP IZlCxdP rPdP lpP lrdZlCxP P KP OP P lpP lsP OP ldP KP
.Afeitó 18 bytes: almacenando el número 5 como la raíz de entrada en lugar de un registro; el número 32 como precisión en lugar de un registro; el número 115 como raíz de salida en lugar de un registro; a continuación, tuvo que cambiar
KZ
aIZ
generar 1s yOZ
paraKZ
generar 2s.Afeitó 13 bytes más inundando la pila con 32s; ajuste de precisión a 39; usando la manipulación de la pila para evitar almacenar 116; cortando algo de trabajo doble que accidentalmente dejé.
fuente
a
para recrear esos operadores, luego llamarlos conx
. Esto muestra el comportamiento de datos es código de DC. Cuando tenga tiempo, aplicaré tu último truco para almacenar datos en parámetros, en lugar de registros. ¿Crees que podríamos obtener una solución de CC aún más corta al abusar de la forma en que P funciona para imprimir más letras a la vez si tenemos la suerte de ingresar el gran número necesario usando solo hexadecimal?P
16750 o 0x416E. Si acabamos de tener suerte y una de las subcadenas estaba compuesta exclusivamente por valores AF, entonces eso podría darnos un atajo. ¡Sin embargo, eso sería un poco de suerte! De lo contrario, estaríamos ingresando números grandes de alguna manera, ideándolos de alguna manera, o agregando y multiplicando por 256. Lo que parece ... más grueso que un montón deP
s.Japt , 87 bytes
Intentalo
Explicación
La primera línea genera
'
y lo asigna a variableU
.La segunda línea se asigna
2
a la variableV
.La tercera línea genera
.
y lo asigna a variableW
.La última línea, entonces, construye la cadena un carácter a la vez en reversa.
fuente
Qc dGaB
Rojo , 272 bytes
Si las comillas dobles son necesarias:
Rojo , 344 bytes
No funciona en TIO pero funciona en el intérprete Red.
Explicación:
Las palabras son triviales: las imprimo (imprimo sin nueva línea) como literales con
quote
. Rojo tiene una palabra incorporada para espaciosp
, así comocomma
ydot
."
y'
más interesante: los imprimo restando un espacio deB
yG
respectivamente, comenzando desde un literalB
yG
, convirtiéndolos primero en una cadena conmold
y luego en un carácter (para usar la resta en ellos) conto sp
( Rojo tiene conversión por prototipo - convierta el cadena al tipo desp
, que es el carácter).fuente
'
, así que la solución de 272 bytes es la misma.Adelante (adelante), 351
Lástima que no puedo redefinir CHAR o EMIT a palabras de una letra, ya que eso requeriría usar
:
y;
(eg: C CHAR ;
) o'
(eg' CHAR ALIAS C
)De hecho, si pudiera definir palabras, podría hacer
: P CHAR EMIT ;
y luegoP x
imprimirx
. Oh bien.Ni siquiera puedo crear un búfer, escribir esa secuencia de caracteres allí y luego usarla como entrada, ya que escribir en la memoria requiere usar
!
oC!
fuente
Alphabeta ,
180 177 175163 bytesPruébalo en línea!
WIP
fuente
Pepe , 266 bytes
Mantengo la pila r vacía y tengo 's' en la pila R
Esto no está en TIO, pero puedes probarlo aquí
fuente
dc , 240 bytes
La idea principal es aumentar continuamente la pila en 1 (
K
), guardando (sX
) el tamaño de la pila (z
) en registros personalizados cuando coincide con cada código ASCII único. La impresión (P
) se realiza en todo momento.Pruébalo en línea!
Hice alguna optimización, como no guardar una letra si no se usa después de eso, como duplicar (
d
) una letra, por ejemplo t, en la pila para guardar un byte, ya que recordar (lX
) es de 2 bytes.fuente
80186+ código de máquina, formato .COM de MS-DOS,
822787 bytesSolo se usan pestañas y espacios además de las letras. Dado que la mayoría de los códigos de operación en el rango permitido son ciertos incrementos, decrementos, empujes, estallidos y AND y OR indirectos de registro, además de IMUL, aprovecho el hecho de que el registro de pila se envuelve cuando llega al final del segmento para modificar el código a la inversa! Se requiere el ensamblaje 80186+ porque estoy presionando valores inmediatos.
Fuente anotada (formato TASM):
fuente
Befunge-98 (FBBI) ,
125124121 bytesPruébalo en línea! Salidas a un archivo llamado
\n
(una nueva línea nueva). Gracias a Jo King por su guión.La salida incluye 10 nuevas líneas finales.
Para una nueva línea final, +1 byte cambiando la siguiente línea:
Pruébalo en línea!
Explicación:
El puntero de instrucciones se mueve de la siguiente manera:
El programa coloca los caracteres no alfabéticos en posición, antes de enviar esa línea a un archivo.
Befunge-98 incluye instrucciones
a
...f
, que empujan su valor hexadecimal correspondiente a la pila. Para generar otros números, pasa esos valores ay
("Get SysInfo") como argumentos para obtener:Al colocar la mayor parte del código en y = 23,
ayy
puede usarse para acceso repetido al tamaño de la pila, que luego se usa para generar códigos de caracteres.fuente
Pyth , 210 bytes
Pruébalo en línea!
Encontré algunos números que podrían expresarse usando solo letras (como
T
= 10,Z
= 0,lG
= longitud (alfabeto) = 26,Cd
= charcode (espacio) = 32), y algunas funciones que podrían realizarse usando solo letras (comot
= decremento,h
= incremento,hF
= aplicación repetida de incremento = suma), y luego ejecuté una búsqueda de fuerza bruta para encontrar las combinaciones más cortas de esas funciones y números que dieron como resultado cada una de las letras que necesitaba.fuente
Código de ensamblado x86 de 16 bits, 665 bytes
(el binario es alfabético, no la fuente)De alguna manera olvidé la regla que permite el espacio en blanco. Seguramente el código se puede jugar como resultado.
Bytecode:
Fuente:
Funciona de esta manera:
mueve el puntero de la pila al final del código, a través de POP AX (no puede POP SP porque no es alfabético);
construye la instrucción para despachar una llamada DOS (algorítmicamente porque no es alfabética);
construye los caracteres no alfabéticos;
coloca la cuerda en la pila;
coloca la instrucción de envío en la pila en el extremo exacto del código, de modo que la ejecución fluya directamente a esa instrucción;
construye la instrucción para imprimir una cadena;
muestra la cadena y se bloquea rápidamente. : - / (Una salida elegante requeriría más código)
fuente
Japt , 74 bytes
Intentalo
fuente
05AB1E ,
145121109 bytesPruébalo en línea!
fuente
80186 código máquina + DOS, 91 bytes
Versión de texto:
Versión de texto, con pestañas (código 9) reemplazadas por
9
y espacios (código 32) reemplazados por*
:Hexdump:
El código de la máquina aparece en un archivo con extensión
.com
. Cuando lo ejecuto, imprime el mensaje requerido y luego se cuelga (ejecutando datos aleatorios).Explicación de alto nivel sobre lo que hace:
,'.$
)int 21
instrucción, que imprime el mensajeCódigo de ensamblaje (se puede compilar con
tasm
):Utiliza la
popa
instrucción para abrir todos los registros, porque regularpop
no puede completar todos los registros necesarios (por ejemplo,pop di
es un código de operación prohibido).Las direcciones de bytes a parche están en el rango 0x100 ... 0x160. Por suerte, se pueden representar como una suma de 3 bytes con valores permitidos:
bp
si
odi
El parcheo de bytes en el mensaje funciona haciendo lógica
OR
en 0x20 (carácter de espacio) y una pequeña constante (4, 7, 12 o 14). La constante pequeña se obtiene inicializandocx
ydx
hasta 9 (carácter de tabulación) y haciendoINC
oDEC
según sea necesario.El parcheo de código utiliza las
IMUL
instrucciones. Encontré las constantes de 16 bits necesarias para multiplicar usando la búsqueda de fuerza bruta.Finalmente, la dirección del mensaje (0x13b) se obtiene por multiplicación. Para ahorrar espacio, tomé una de las constantes de una de las instrucciones, que contiene un valor inmediato
0x96d
. Aquí la9
parte elige una función de impresión de DOS, y la6d
parte es un parámetro libre. Resulta que esa6d
es la única posibilidad que puede dar 0x13b después de la multiplicación.Desmontaje de la parte del código:
Dato curioso: Normalmente, usaría en
offset message
lugar del codificado13bh
, pero en este caso, porque al momento de analizar su dirección es desconocida, tasm genera un desplazamiento inmediato de 16 bits, desperdiciando 1 byte de código:fuente