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 usarwrite yEval 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.NNNpara 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 el63al 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 soloNSSNpara crear la etiqueta yNSNNsaltar 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. :)102es 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
Zcon 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,jyfen$_.fuente
printconsayde -2 caracteres. El meta consenso actual dice que las banderas de línea de comando como-M5.010no 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 usandogsi estoy dentro de tres del objetivo. El programa termina llamandoi(input), que empuja a-1ya 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 lasensaid, luego se coloca en el código en el camino hacia abajo desdeda,. (Tenga en cuenta que (15,15) tiene 15 en este punto.)lypponer varios caracteres útiles en el rectángulo (10,10) - (15,15), luego recuperarlosgdonde 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 AXmientras que la no comentada esINC AL.label1 dbuna 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
saycon 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
chrfunción y ponerlo en minúsculalcsi 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
logyexpdirectamente, pero no me resultó muy fácil usarlas.Para usar como números, tenemos
e,piytau; en el lado derecho dexoxx, están implícitamente en el suelo. Todos tienen 17 caracteres en sus representaciones de cadena, por lo que los usamosepara un recuento mínimo de caracteres. También tenemosi(4 caracteres),False(5 caracteres) yNaN(3 caracteres). Podemos multiplicar longitudes de cuerda conx;xxmultiplica uno más el largo de la cuerda por el lado derecho y agrega uno.chopelimina 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
wwal 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
7iniciará 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, por01lo 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
Qcomo 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 imm16ypush imm32, seguido depopgenerar 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 endxlugar deedxcerca 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ógicaORcon lo que ya está allí. Esto a veces hizo necesario volver a poner a cero la memoria.jmpinstrucció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], ahcosas se pueden factorizar.0xffviola "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).dupno 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].countempuja 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
displaydentro 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
putca su código ASCII. Podemos generar los números apropiados reutilizando elString deftruco 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 alpmétodo, para que calcule y muestre el carácter apropiado como efecto secundario, antes de generar un error para quepno 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
raisecon una llamada de método inexistente de una letra, lo que genera un NameError.Edición 2: Noté que con
print Stringextraí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 sizela 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
lpara 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,
vse coloca a en el código de la columna 7. Cuando el puntero de instrucción se ajusta y golpeav, la secuenciagose ejecuta repetidamente para leer desde las coordenadas empujadas y generar los caracteres correspondientes. Finalmente, la pila se vacía ygfinaliza 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
ven la columna 9 teóricamente habría guardado dos bytes más, pero habría forzado a los caracteresAinsva 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
rpara 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
mespacio 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 (
mQymq), la función exponencialmey la conversión de base (b), que también se pueden usar para emular la multiplicación ([X 0] Ybcalcula 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,Zrespectivamente.AtravésK.Sci(Sempuja una cadena que contiene un espacio,cobtiene el primer carácter de esta cadena yiconvierte ese carácter en su punto de código).STambié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).Andsheai,'But.fuente
HYbYCtYbc,HYbXAtYbcyHYbXBtYbc.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
Pyhpara 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) primoYqes 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.hisse acorta almacenando elhde antes en el portapapelesJ. Desde que se almacenó anteriormentes, construimoshisen reversa para que podamos recuperar elsuso recienteyy voltearlo después de usarloP.havle)fuente
vmetería elhque 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 ...Usignifica^2que 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:
0se usa para la mayoría de los espacios, porque solo cuesta un byte (O).15se usa (generado comoKUq), porque luego se puede reutilizar agregándolo a100(chard) para dar115(s). En otra ocasión5se usa para el espacio (generado comoKQ), por lo que luego se puede restar de44(,) para dar39(').Jse usa para almacenar caracteres que se repetirán: primeros, luego'. Del mismo modo, el portapapelesHalmacena100, lo cual es útil parady 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 como4en 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]), sumando1a los puntos de código ([55 54]), sumándolos y sumando1.w), bubble upb).fuente
Olugar deKWEpara 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).OOOOOziOOOOOOOOOOOOOOOOOOOOOOOOOOOzddddddzkdddzasBdzasAdzscdzdasCzsdes 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,AyCrespectivamente). 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
KZaIZgenerar 1s yOZparaKZgenerar 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
apara 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?P16750 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 dePs.Japt , 87 bytes
Intentalo
Explicación
La primera línea genera
'y lo asigna a variableU.La segunda línea se asigna
2a 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 dGaBRojo , 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í comocommaydot."y'más interesante: los imprimo restando un espacio deByGrespectivamente, comenzando desde un literalByG, convirtiéndolos primero en una cadena conmoldy 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 ximprimirx. 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,
ayypuede 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
9y 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 21instrucción, que imprime el mensajeCódigo de ensamblaje (se puede compilar con
tasm):Utiliza la
popainstrucción para abrir todos los registros, porque regularpopno puede completar todos los registros necesarios (por ejemplo,pop dies 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:
bpsiodiEl parcheo de bytes en el mensaje funciona haciendo lógica
ORen 0x20 (carácter de espacio) y una pequeña constante (4, 7, 12 o 14). La constante pequeña se obtiene inicializandocxydxhasta 9 (carácter de tabulación) y haciendoINCoDECsegún sea necesario.El parcheo de código utiliza las
IMULinstrucciones. 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í la9parte elige una función de impresión de DOS, y la6dparte es un parámetro libre. Resulta que esa6des 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 messagelugar 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