En el lenguaje de programación que elija, escriba 95 programas, cada uno de los cuales generará uno diferente de los 95 caracteres ASCII imprimibles sin que ese carácter aparezca en ninguna parte del programa .
Por ejemplo, si su lenguaje era Python , su programa que genera el carácter P
podría ser
print(chr(80))
porque P
tiene el código ASCII 80. Este programa es válido porque P
nunca aparece en el código fuente. Sin embargo, para el programa que genera minúsculas p
, algo como
print(chr(112))
sería inválido porque, aunque se imprime p
, p
está presente en el código. Un programa válido podría ser
exec(chr(112)+'rint(chr(112))')
que imprime p
pero no contiene p
.
Su objetivo es hacer que cada uno de sus 95 programas sea lo más breve posible. Su puntaje es la suma de las longitudes de caracteres de todos sus programas.
Si por alguna razón no puede escribir programas válidos para algunos caracteres, puede marcar esos caracteres como "No se programó" o DNP , y omitir programas para ellos por completo. De esta forma, los lenguajes sintácticamente estrictos podrán competir.
La respuesta ganadora es la respuesta que tiene la puntuación más baja del conjunto de respuestas que tienen la menor cantidad de DNP.
Reglas
El código fuente de todos sus programas solo puede contener pestañas ASCII plus imprimibles y líneas nuevas, todos los cuales se cuentan como un carácter. (¡Porque en una codificación diferente sería fácil omitir caracteres que no existen!)
- Nota: Esta regla parece necesaria, pero hay muchos idiomas con diferentes codificaciones y estoy seguro de que sería genial ver las respuestas para ellos. Por lo tanto , puede romper esta regla , puede usar cualquier personaje que desee, pero luego su respuesta se vuelve no competitiva , no puede ganar.
Los programas deben ser reales, llenos programas , de acuerdo con las convenciones estándar de su lenguaje. Las funciones y los fragmentos REPL no están permitidos.
La salida de cada programa debe ir a stdout o la alternativa aceptada de su idioma.
Los programas no deben solicitar ni requerir aportes. (Si solicitar entradas es inherente a su idioma, está bien).
Los programas deben ser deterministas, finitos en tiempo de ejecución e independientes. por ejemplo, no debería importar si uno se ejecuta en una carpeta separada de los otros programas.
La salida de un programa debe ser el carácter ASCII imprimible preciso al que corresponde, opcionalmente seguido de una nueva línea final, nada más y nada menos.
Asegúrese de incluir información sobre los 95 (idealmente) programas en su respuesta, así como su puntaje y cualquier DNP. Usted no tiene que enumerar todos los programas que siguen un patrón simple como " , ...", pero asegúrese de que está seguro de que todos serían trabajar y que se añade su puntuación correctamente.print(chr(80))
print(chr(81))
print(chr(82))
Como referencia, aquí están los 95 ASCII imprimibles que sus programas deben generar:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
fuente
0
Respuestas:
Python 2,
10751065104310401039 bytesCada programa tiene la forma
print'\<octal char code>'
, excepto:'
→print"\47"
0
a través8
→print~-<N+1>
9
→print-~8
\
→print'%c'%92
i
→exec'pr\151nt"\151"'
n
→exec'pri\156t"\156"'
p
→exec'\160rint"\160"'
r
→exec'p\162int"\162"'
t
→exec'prin\164"\164"'
Para referencia y facilidad de prueba, aquí está la lista completa de programas, separados por nueva línea.
Probar:
-1 bytes gracias a @ Sp3000!
fuente
print~-<N+1>
no funciona para1
. Usted ha dicho que trabaja para0
a8
.<angle brackets>
no es código literal. Sustituir<N+1>
con el valor literal deN+1
; en este caso, el programa para1
seríaprint~-2
. Vea la lista completa de programas.CJam, 269 bytes
Cada uno de los programas tiene la forma,
'<char - 1>)
excepto:S
, 1 byte'
=>39c
, 3 bytes)
=>'*(
, 3 bytes0
=>T
, 1 byte1
=>X
, 1 byte2
=>Y
, 1 byte3
=>Z
, 1 byte4
-9
=><num-1>)
, 2 bytesLa puntuación es:
3 * 82 + 1 + 3 + 3 + 4 * 1 + 6 * 2 = 269
fuente
39c
para'
? Además, se está olvidando de que un solo dígito puede ser ese número1)
para2
etc. para guardar un byte allí1)
era a lo que me refería, síTXYZ
Código de máquina x86 con restricciones ASCII para DOS,
310431012913 bytesBueno ... supongo que es más corto que Java ...
3230 bytes para casi todos los caracteres, para excepciones ver más abajo.La mayoría de las veces solo sigue el patrón:
xor
para obtener un puntero hasta el final.sub
de las últimas 2 palabras porque el código de operación paraint
no está en ASCII.AH
y el personaje enDL
. Ambos sexor
editan porque el carácter en sí no puede aparecer en el programa y 2 no es un carácter ASCII imprimible.int 21h
int 20h
La mayoría de las veces, si un personaje no está permitido, se puede reemplazar girando un poco los datos o cambiando a un registro diferente.
Se vuelve un poco más interesante cuando de repente te encuentras incapaz de restar o incapaz de empujar o reventar el único registro utilizable para los cálculos ...
fuente
Brainfuck
1770171017031686 bytes60 bytes guardados por Dennis
17 bytes guardados por Sp3000
DNP: 46 (
.
)Todos excepto 43, 45, 60, 62, 91 y 93 son robados descaradamente de Esolangs.org
fuente
--[>-<---]>[<->--]<[->-<]>.
Funciona para la salida+
.-----[[----<]>>-]<.
+[+[+>]<<++++]>.
MATL,
305, 302, 300297 bytesCada programa se ve así:
Excepto por
Dígitos. Aquí están los programas para 0-9:
'C'. Este programa es
espacio. Esto es
Desde hoy aprendí que MATL trata el carácter 0 como espacio. Gracias @LuisMendo!
Puede usar matl.tio para verificar cualquiera de ellos.
Como referencia, aquí están todos ellos:
fuente
Java 8,
679865826577 bytessuspiro
Esto es básicamente un puerto de mi respuesta de Python 2 , pero con todo lo que viene con la escritura de un programa completo en Java.
Ahora sin ningún DNP en absoluto! Gracias Kevin Cruijssen!
La mayoría de los programas tienen la forma
interface A{static void main(String[]a){System.out.print("\<octal char code>");}}
, excepto:interface\tA{static\tvoid\tmain(String[]a){System.out.print("\40");}}
(pero con la\t
s reemplazada por pestañas sin procesar)"
→interface A{static void main(String[]a){System.out.print('\42');}}
(
→interface A{static void main\u0028String[]a){System.out.print\u0028"\50");}}
)
→interface A{static void main(String[]a\u0029{System.out.print("\51"\u0029;}}
.
→interface A{static void main(String[]a){System\u002Eout\u002Eprint("\56");}}
0
→interface A{static void main(String[]a){System.out.print(1-1);}}
1
→interface A{static void main(String[]a){System.out.print(3-2);}}
2
→interface A{static void main(String[]a){System.out.print(3-1);}}
3
→interface A{static void main(String[]a){System.out.print(4-1);}}
4
→interface A{static void main(String[]a){System.out.print(5-1);}}
5
→interface A{static void main(String[]a){System.out.print(6-1);}}
6
→interface A{static void main(String[]a){System.out.print(7-1);}}
7
→interface A{static void main(String[]a){System.out.print(8-1);}}
8
→interface A{static void main(String[]a){System.out.print(9-1);}}
9
→interface A{static void main(String[]a){System.out.print(8+1);}}
;
→interface A{static void main(String[]a){System.out.print("\73")\u003B}}
A
→interface B{static void main(String[]a){System.out.print("\101");}}
S
→interface A{static void main(\u0053tring[]a){\u0053ystem.out.print("\123");}}
[
→interface A{static void main(String...a){System.out.print("\133");}}
\
→interface A{static void main(String[]a){System.out.print((char)92);}}
]
→interface A{static void main(String...a){System.out.print("\135");}}
a
→interf\u0061ce A{st\u0061tic void m\u0061in(String[]b){System.out.print("\141");}}
c
→interfa\u0063e A{stati\u0063 void main(String[]a){System.out.print("\143");}}
d
→interface A{static voi\u0064 main(String[]a){System.out.print("\144");}}
e
→class A{public static void main(String[]a){Syst\u0065m.out.print("\145");}}
f
→class A{public static void main(String[]a){System.out.print("\146");}}
g
→interface A{static void main(Strin\u0067[]a){System.out.print("\147");}}// \u0067
i
→\u0069nterface A{stat\u0069c vo\u0069d ma\u0069n(Str\u0069ng[]a){System.out.pr\u0069nt("\151");}}
m
→interface A{static void \u006Dain(String[]a){Syste\u006D.out.print("\155");}}
n
→class A{public static void mai\u006E(Stri\u006Eg[]a){System.out.pri\u006Et("\156");}}
o
→interface A{static v\u006Fid main(String[]a){System.\u006Fut.print("\157");}}
p
→interface A{static void main(String[]a){System.out.\u0070rint("\160");}}
r
→class A{public static void main(St\u0072ing[]a){System.out.p\u0072int("\162");}}
s
→interface A{\u0073tatic void main(String[]a){Sy\u0073tem.out.print("\163");}}
t
→class A{public s\u0074a\u0074ic void main(S\u0074ring[]a){Sys\u0074em.ou\u0074.prin\u0074("\164");}}
u
→interface A{static void main(String[]a){System.console().printf("%c",117);}}
v
→interface A{static \u0076oid main(String[]a){System.out.print("\166");}}
y
→interface A{static void main(String[]a){S\u0079stem.out.print("\171");}}
{
→interface A\u007Bstatic void main(String[]a)\u007BSystem.out.print("\173");}}
}
→interface A{static void main(String[]a){System.out.print("\175");\u007D\u007D
Uf
El compilador de Java procesa escapes Unicode como
\u007B
antes de realizar cualquier otro procesamiento, lo que hace posible escribir código que usa escapes Unicode en identificadores e incluso palabras clave. Entonces, para escribir un programa que no use un carácter presente en el repetitivo, simplemente lo sustituimos con escape unicode.Para referencia y facilidad de prueba, aquí está la lista completa de programas, separados por nueva línea y con las pestañas sin procesar reemplazadas por cuatro espacios:
Tenga en cuenta que el programa
u
utilizaSystem.console()
, que devolverá nulo (y, por lo tanto, provocará que el código arroje aNullPointerException
) si lo llama desde cualquier otra cosa que no sea el terminal nativo de su sistema operativo (cmd
en Windows y, supongo,bash
en Linux / OSX) .Para probar, cree un nuevo directorio y coloque el código anterior en un archivo nombrado
printables
en ese directorio. Luego, ejecute el siguiente script de Bash:El script anterior colocará cada línea
printables
en su propio directorio, los nombrará a todosA.java
(excepto el archivo que se imprimeA
, al que se le cambia el nombreB.java
), compilará cada archivo, los ejecutará y luego eliminará la evidencia. Los caracteres ASCII imprimibles deberían tardar unos diez segundos en comenzar a aparecer en su shell.Si estás en Windows, ejecuta el siguiente archivo Batch:
Este archivo por lotes adopta un enfoque ligeramente diferente; en lugar de dividir previamente las líneas, procesa el archivo línea por línea y compila y ejecuta cada programa a su vez. Nuevamente, elimina la evidencia una vez que finaliza.
¡Salvamos innumerables bytes + el 1 DNP gracias a Kevin Cruijssen!
fuente
class B
para imprimirA
interface
lugar de la clase para que pueda eliminar elpublic
) y si su sistema operativo tiene una consola incorporada, por lo que no tiene que usarSystem.out.print
:interface A{static void main(String[]a){System.console().printf("%1",(char)117);}}
Eclipse, IntelliJ y los compiladores en línea no tienen esta consola, lo que resulta en aNullPointerException
.print
> <> ,
443437 bytesEnlace de intérprete de TIO . Hay muchos patrones aquí:
[num][num]*o;
: Multiplicación de dos números, luego genera el resultado como un carácter cono
y para con;
. > <> dígitos van hasta 15, es decir0123456789abcdef
.[num][num]-n;
, que toma la diferencia de dos números y las salidas como un número conn
.'-o[invalid char]
: > <> es toroidal, por lo que cuando el puntero de instrucción llega al final de una línea, retrocede al principio. En este caso, esto hace que el código se ejecute dos veces, es decir'-o[char]'-o[char]
. La primera'-o[char]'
parte empuja tres caracteres a la pila,-
calcula y'o' - [char]
luegoo
muestra el resultado como un personaje. > <> luego genera errores cuando llega[char]
, ya sea debido a un comando no reconocido o por reventar una pila vacía.'-n[invalid char]
, que sale como un número.'[num][op]o[invalid char]
, lo que se aplica[op]
con[num]
on[char]
, error en char. Por ejemplo,'2+oJ
salidasL
, que son dos más queJ
.'
El código de es"-oH
, utilizando en su"
lugar.-
El código de es'%oB
, utilizando en su%
lugar.ln;
: Empuje la longitud de la pila, salida como num y luego pare, dando0
. Del mismo modolln;
para1
y'ln;
para3
.4|n+
: Presione 4, rebote|
y presione otros 4, agregue, luego envíe8
como num. Rebota de|
nuevo, y error al intentar ejecutarn
nuevamente en una pila vacía.3|n*
para9
.[num]|o*
para@Qdy
.'1-:00p
: El más interesante, para elo
caso. Para evitar el usoo
en nuestro código, debemos usarlop
para colocar uno
en el cuadro de código y luego ejecutarlo. La inicial'1-:00p'
configura la pila para que tenga un valorp
superior, y la1-
reduce a un valoro
.:
duplica estoo
y00p
coloca unoo
en (0, 0), convirtiendo el cuadro de código eno1-:00p
. El puntero de instrucción se ajusta nuevamente, generando el otroo
. El carácter (0, 0) se reemplaza algunas veces más antes de que el programa finalmente falle.fuente
Dyalog APL ,
527522 bytes(no compite porque APL realmente no se puede escribir usando ASCII solamente)
La mayoría están en el formato
nn⊃⎕AV
onnn⊃⎕AV
, las excepciones son:Aquí está la lista completa:
fuente
⍨
es mi nuevo smiley favoritoRubí, 869 bytes
A los 63 caracteres
@
a través~
, tenemos una solución de 10 bytes:Para la mayoría (21) de caracteres
space
a través?
, tenemos una solución 9 bytes:Quedan once casos especiales:
En total, la puntuación es 10 × 63 + 9 × 21 + 10 + 3 + 8 × 4 + 5 = 869.
fuente
?\xxx
lugar de"\xxx"
1 byte cada uno.p 1+8
y nop-~8
?-
, o algo así. :(putc 65
=>A
WolframAlpha , 368 bytes
Formato general:
Excepciones:
Aquí está la lista completa:
fuente
PHP (
891680674 bytes,20 DNP)Editar: ahorré 203 bytes gracias a jimmy23013 e implementé el 2 DNP gracias a Mego
Esta respuesta abusa fuertemente de la generosa naturaleza de PHP. La mayoría de los casos toman una de estas formas (7 bytes cada uno):
PHP convierte las letras a cada lado del operador en cadenas, luego realiza la operación apropiada a nivel de bits al convertir cada cadena a su valor de carácter ASCII y finalmente convierte el resultado nuevamente en un carácter.
En el primer ejemplo anterior, se
Y^x
convierte89^78
. El resultado de esto es33
, que luego se envía a STDOUT como el personaje!
.Se escribió un guión para imponer todas las combinaciones posibles: los resultados se pueden encontrar aquí .
Excepciones:
;
es<?=Z^a?>
(8 bytes)|
es<?='9'^E;
(9 bytes)<
y?
normalmente sería DNP debido a la etiqueta de inicio requerida, pero al usar el-r
indicador, el código se puede ejecutar sin ellos:<
esecho Z^f;
(9 bytes)?
esecho Z^e;
(9 bytes)=
esecho Z^g;
(9 bytes)Puntuación:
(7 * 90) + 8 + 9 + 9 + 9 + 9 = 674 bytes
fuente
&
|
^
entre dos letras para generar todos los caracteres ascii imprimibles, excepto<?=|;
.~
lugar de XOR, AND u OR. PHP puede usar más caracteres imprimibles como constantes, que solo letras.Brachylog ,
546477 bytesCréditos para Fatalizar por el código para
@
.En la lista a continuación, el primer carácter es el carácter que se imprimirá (para facilitar la referencia).
Todos son predicados, por lo que
Z
debe ser el argumento para recibir el resultado: ¡ Pruébelo en línea!Explicación
@P
es esta cadena:que contiene todos los ASCII imprimibles.
fuente
"@"
esta manera> <> , 531 bytes
Los programas toman dos formas principales:
El primero es para caracteres con códigos de caracteres con dos factores, ambos menores que 16, el otro es para los otros casos. La mayoría de los números para los que uso la segunda forma tienen muchas soluciones de igual longitud, pero elegí esa por legibilidad.
Excepciones:
Lista llena:
fuente
;
usos;
. Además, estoy bastante seguro de que la mayoría de estos se pueden jugar al golf por error, yo
definitivamente es posible.o
yO
, no veo cómoo
es posible. ¿Y cómo terminar en un error sería más corto?o
se puede hacer haciendo uso dep
. Sin embargo, podría publicar por separado por error, porque probablemente habrá muchos patrones diferentes involucrados.;
programa. ¡Gracias por señalar eso!Hexagony ,
376373 bytes, 1 DNPGracias a FryAmTheEggman por guardar 3 bytes.
Casi todos los programas tienen la misma forma:
Sin embargo, hay algunas excepciones:
;
sin usar;
, por lo tanto, 1 DNP.@
, no podemos usar@
para finalizar el programa. En su lugar, usamosS2;:
oS3;%
. Esto termina con un error de división por cero, pero ese error no es visible en STDOUT. Entonces esto sigue siendo cuatro bytes.U
que requeriríaU3;@
. Hay varias formas de solucionar esto, incluido el cambio a minúsculas, es decirn9;@
, o el uso de incremento o disminución, es decir,T);@
oV(;@
. En cualquier caso, todavía son cuatro bytes.0
e!
imprimen un valor entero, para que podamos obtener0
y1
con!@
y)!@
, respectivamente, guardar 3 bytes.En cuanto a cómo funcionan los
<letter><digit>;@
programas: el diseño hexagonal de un programa de la forma1234
es siempreComo ninguno de los programas contiene ningún comando que redirija el flujo de control, estos son simplemente programas lineales que se ejecutan en orden.
En todos los casos, la letra al comienzo del código establece el borde de la memoria actual en su código de caracteres. Por ejemplo, en el programa
P1;@
,P
establece el valor80
. Luego, el dígito multiplica este valor por 10 y se suma a sí mismo (es decir, el dígito se agrega al valor actual). Eso da801
en el ejemplo anterior. Finalmente,;
imprime este valor tomándolo como módulo 256 y usándolo como un valor de byte. En este caso801 % 256 = 33
y!
se imprime a.fuente
Espacio en blanco , 1643 bytes, 1 DNP
17 bytes para los caracteres [33-63] y 18 bytes para los caracteres [64-126]
En Whitespace esto es sencillo, porque los caracteres imprimibles (excepto el espacio) no tienen ningún significado de todos modos:
El programa anterior imprime un '!' (100001b). Cambie
[TAB][SPACE][SPACE][SPACE][SPACE][TAB]
en la primera línea al personaje que desee. No es posible imprimir un espacio sin usar un espacio, porque imprimir cualquier cosa siempre comienza con[TAB][LF][SPACE]
fuente
Retina , 712 bytes, 2 DNP
Este fue un esfuerzo de colaboración con FryAmTheEggman.
Hay varias clases de soluciones. Para la mayoría de los caracteres desde el espacio hasta
^
, utilizamos un programa de la siguiente forma:El personaje en la segunda línea itera a través de los rangos
_0-9A-Za-z
mientras que el resto permanece sin cambios. Esto convierte la entrada vacía en ese carácter y luego la reemplaza con el carácter ASCII imprimible (representado porp
) en la posición correspondiente. Cada uno de estos programas tiene 8 bytes de longitud.Dentro de este rango, solo hay algunas excepciones. Lo más importante es que los dígitos se pueden acortar:
x
(cuenta el número dex
s en la entrada vacía)(weehoo, programa vacío; cuenta el número de coincidencias vacías en la entrada vacía)
2: ahora convertimos la entrada en un solo carácter, antes de contar cadenas vacías:
3: lo mismo pero convertimos la entrada en dos caracteres:
4: tienes la idea ...
5-9: giro de la trama ... usamos la repetición de caracteres para evitar que la segunda línea se alargue:
...
La otra excepción es que
T
es un DNP: no creemos que sea posible generar un carácter que no sea un dígito sin que aparezca en el código fuente si no se pueden utilizar las etapas de transliteración.A los personajes restantes. Para imprimir
_
utilizamos un programa similar a la solución general anterior:Haciendo uso del hecho que
w
comienza con_
.Luego,
`
está el segundo DNP, porque las etapas de transliteración también lo requieren.Luego, la mayoría de las letras minúsculas se imprimen con algo como esto (que se imprime
a
):Nuevamente, el carácter en la segunda línea se incrementa a través
_0-9A-O
. Aquí, solo tenemos que tener cuidado conl
yw
, que podemos imprimir con los siguientes programas, respectivamente:Finalmente, solo
{|}~
quedan, que requieren 9 bytes cada uno. Aquí, usamos la etapa de transliteración para incrementar el carácter que los precede. Por ejemplo,~
se puede imprimir con:fuente
Pyke,
364362355 bytesTodo en la forma
w<chr(charcode+32)>.C
(4 bytes) excepto:->
d
1 byte0
->Z
1 byte1
->~W
2 bytesa
->Gh
2 bytesz
->Ge
2 bytesa
) en formaG<number>@
(3 bytes)k
->GT@
3 bytes>
->~Bh
3 bytes]
->~Be
3 bytesZ
->~le
3 bytes9
->~ue
3 bytesw
->G22@
4 bytes.
->~B4@
4 bytesC
->~K38@
5 bytesIntérprete de Pyke en línea
fuente
JavaScript (ES6),
10831068 bytesForma general:
Excepciones:
Editar: Guardado 15 bytes gracias a @ GOTO0.
fuente
alert(atob`XA`)
"\" para guardar algunos bytes.x
.\u
escapes en el código fuente? Genial05AB1E , 417 bytes
Explicación
La mayoría son 5 bytes de longitud del formulario:
convert nr to base nr+1
.>
necesita un byte extra ya que no podemos usar incremento para eso.a,b,x,y,z,Y,Z
se extraen de losA
cuales contiene el alfabeto en minúsculas.A,B,C,D,E,F
son números convertidos a hexadecimal.0-9
son simples incrementos / decrementos, así como variables predefinidas.fuente
Maravilloso, 220 bytes
Para un carácter que no es un dígito, son solo los dos dígitos hexadecimales en mayúsculas del código de caracteres. Por ejemplo, los siguientes resultados del programa
A
:Para un dígito que no lo es
3
, reemplace2F
en el siguiente código por los dígitos hexadecimales en mayúsculas del código de caracteres - 1:Para
3
:Puntuación total: 2 * 85 + 5 * 10 = 220.
Interprete.
Mi primer intento fue Bubblegum y no funcionó para los personajes antes
?
...fuente
Perl 6: 921 bytes
Traducción de la solución Python.
Cada programa tiene la forma
say "\x<hex escape code>"
, excepto:s
→put "\x73"
a
→put "\x61"
y
→put "\x79"
→
"\x20".say
"
→say chr 34
\
→say chr 92
x
→say chr 120
0
→say 1-1
1
→say 3-2
2
a9
→say <n minus one>+1
Para referencia y facilidad de prueba, aquí está la lista completa de programas, separados por nueva línea.
Aquí está el código que usé para probar la lista anterior, y cuente la puntuación:
fuente
say
se requiere el espacio posterior y las secuencias de escape octal se escriben como\o77
. Siéntase libre de publicar una solución Perl 5 por separado ... :)Haskell,
1874 1864 1856 1855 1795 17911589 bytes, 7 DNPLa mayoría de los programas son
main=putChar '\xx'
omain=putChar '\xxx'
wherexx
/xxx
es el código ASCII del carácter a imprimir. Esto funciona para todos menos 14 caracteres:Sin embargo, para los dígitos
1 74 bytes se pueden guardar (¡gracias a Christian Sievers!):Los 52 programas hasta
c
(código 99) toman 18 bytes, los 19 restantes toman 19 bytes cada uno.Puntuación parcial:
10*14 + 52*18 + 19*19 = 1437
Para 7 de los caracteres restantes, funcionan los siguientes programas:
Puntuación parcial:
18 + 22 + 18 + 21 + 19 + 27 + 27 = 152
Esto deja 7 DNP:
=aimnrt
Cada programa Haskell necesita definir un main (
main=
), por lo que son 5 DNP. Para imprimir en stdoutputChar
,putStr
ointeract
se puede utilizar, produciendot
yr
como otros DNP. (También hayprint
, sin embargo,print 'a'
impresiones'a'
y noa
, y también contienet
y der
todos modos). Haskell también tiene unachr
función que devuelve el número de caracteres correspondiente dado, sin embargo, para usarloimport Data.Char
es necesario.Puntuación total:
1437 + 152 = 1589
7 DNPfuente
main=print$1-1
etc.succ
)BBC Basic,
422413 bytesDescargue el intérprete gratis en http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
9 bytes guardados gracias a Leaky Nun.
Forma general
32..99 excluyendo 12 casos especiales: 56x4 = 224 bytes
100..126 : 27x5 = 135 bytes
12 casos especiales: 54 bytes
La mayoría de los números siguen la forma general, pero los incluí todos aquí para mostrar dónde está el problema.
El primer carácter es el carácter que se imprimirá.
fuente
V.48
para0
?V.
yP.
siempre han estado allí?.
se expandirán en una palabra clave. Este desafío es estricto sobre el uso de ASCII no imprimible, pero podría decirse que con otros desafíos se podría decir que las palabras clave simbólicas (ascii 127-255) fueron un byte. Dicho esto, nunca he intentado ese argumento, y generalmente doy ambas puntuaciones.Minkolang 0.15 , 604 bytes
Para la mayoría de los personajes,
"<char-1>"1+O.
sería un programa válido, quizás uno de los más cortos. Sin embargo, debido al hecho de que los caracteres se almacenan como puntos de código en la pila significa que muchos de ellos se pueden producir por multiplicación y suma, en cinco bytes o menos. Además, tenga en cuenta quel, $1, $2, $3, $4, $5, $6, $l
son10, 11, 12, 13, 14, 15, 16, 100
respectivamente.Formato:
<character>: <program>
Menciones especiales:
(Pruébelo). Minkolang tiene la capacidad de modificar los caracteres en el cuadro de código, por lo que este programa hace que lo reemplace
-
al final.
, lo cual es necesario para detener el programa."N"1+d90pN.
paraO
trabajos de la misma manera.(Pruébelo)
lZ
empuja los alfabetos en mayúsculas y minúsculas a la pila, yI
empuja la longitud de la pila, que es 52, precisamente el punto de código de "4". La mejor parte es que inicialmente estaba considerando la solución4$3*O.
, que multiplica 4 y 13 para obtener 52, pero no pude porque tenía un 4, ¡así que terminé encontrando una solución más golfista de todos modos!(Pruébelo)
d
duplica la parte superior de la pila, por lo que lo que hace este código es empujarlo11
, duplicarlo y luego multiplicarlo. Hubiera sido una forma alternativa de escribir esto$12;O.
, que tiene el mismo número de bytes.(Pruébelo)
;
es exponenciación, por lo que hace 5 ^ 3 para obtener 125.fuente
Groovy, 1019 bytes
Tenía una solución de Groovy diferente escrita (ver más abajo), pero después de enviarla, profundicé un poco más en los escapes de personajes, con la esperanza de encontrar una forma de acortar más el programa, y descubrí que Groovy tiene un escape de caracteres octal que yo no sabía de Esto simplifica significativamente el código, hasta el punto de que desafortunadamente elimina la necesidad de casi todas las soluciones extravagantes que se me ocurrieron.
También parece casi idéntico a la solución Python 2 de Copper , hasta el punto de que básicamente parece que plagiado su trabajo. Ugh
Cada programa tiene la forma
print'\<octal value>'
, excepto:p
,r
,i
,n
,t
→'print''\<octal value>'
(pero con la letra correspondiente de "imprimir" también reemplazado por el valor octal)0
-9
→print~-<next int>
Aquí está la lista completa de programas por personaje.
Groovy, 1130 bytes
Mi programa anterior, antes de descubrir que existen escapes octales. Mucho más interesante, OMI.
Cada programa tiene la forma
print(--'<next char>')
, excepto:-
,[
,~
→print(++'<previous char>')
&
→print(--"'")
p
,r
,i
,n
→System.out<<--'<next char>'
t
→'prin\u0074'(--'u')
(
→print'\u0028'
)
→print'\u0029'
0
-9
→print~-<next int>
Aquí está la lista completa de programas para cada personaje:
fuente
En realidad ,
383382381 bytes1 byte gracias a Mego.
Para una referencia fácil, la primera columna es el código de caracteres, la segunda columna es el carácter y la tercera columna es el código.
El código para
0
es un espacio único.Pruébalo en línea!
Sugerencias de golf son bienvenidas.
fuente
:
en 5:9P2*c
Fourier, 306 bytes, 1 DNP
Casi todos los programas siguen el patrón
na
donde n es el código de caracteres de cada uno de los caracteres. Por ejemplo:Pruébalo en línea!
Así que solo enumeraré las excepciones:
0 (cero)
Como el acumulador está preconfigurado a cero, podemos mostrar esto usando un solo carácter:
Pruébalo en línea!
1
Similar a cero, esto incrementa el acumulador para obtener 1.
Pruébalo en línea!
5 5
El código ASCII para 5 es 53, así que tuve que solucionar esto:
Pruébalo en línea!
una
Debido a que
a
es la función de salida de caracteres, no hay otra forma de producir el carácter a, por lo que este es mi único NO PROGRAMA .Vea todos los programas aquí
fuente
Matlab,
12381224 bytes, 2 DNPEl patrón principal es:
Para los dígitos es un poco más corto:
Para los personajes
[]'
es:Los caracteres
ds
dedisp
se muestran usandofprintf
( gracias @Stewie Griffin );ip
Sin embargo, también pertenezco allí, así que estoy cambiando la cadena y usandoeval
:()
Sin embargo, ambos caracteres son necesarios paradisp
oeval
, por lo que son DNP.Para referencia toda la lista:
fuente
[100 105 115 112]
(char-codes)disp
?disp([100 105 115 112])
tampoco producirá una cadenaeval([100 105 115 112])
.fprintf
para ans d s:fprintf([115,''])
. Guarda 2x7 bytes =) No será una presentación ganadora, pero oye: 14 bytes son 14 bytes ,,,disp([0 ''])
contiene un espacio.disp([0,''])
no lo hacefprintf
.Jalea (no competitiva), 406 bytes
Esto imprime todos los caracteres del 32 al 126. El recuento de bytes se calcula con https://mothereff.in/byte-counter .
Pruébalo en línea!
fuente
In a programming language of your choice, write 95 programs, each of which outputs a different one of the 95 printable ASCII characters without that character occurring anywhere in the program.
Befunge-93, 530 bytes
La forma más fácil de generar un carácter, sin usar ese carácter, es calcular el valor ASCII y usar el
,
comando (salida de caracteres) para representarlo. Por ejemplo,49*,@
genera el carácter de dólar (ASCII 36, 4 * 9). Sin embargo, esto rara vez es el más óptimo, ya que la mayoría de los valores requieren más de 3 bytes para calcular.Otra forma de generar un número en 3 bytes es aprovechar el hecho de que el
g
comando (get) en la primera celda del campo de juego generará el valor ASCII de g (se supone que una pila vacía se rellena con ceros, por lo que es leyendo el valor del campo de juego en 0,0). Asíg1+,@
te da h , yg1-,@
te da f . Obviamente, esto funciona para una gama de compensaciones, y también son posibles operaciones distintas+
y-
también. Entonces, por ejemplo,g3/,@
obtienes una cita doble.Una variación de esto es preceder al
g
comando con otro que deja todos los ceros en la pila. Entonces todavía estás leyendo un valor del campo de juego en 0,0, pero el personaje que se está leyendo ahora es diferente. Esto cuesta un byte más, pero le da acceso a muchos más valores. Por ejemplo, le0g1-,@
da una barra diagonal y le:g1+,@
da un punto y coma. Otros prefijos viables incluyen*
,+
,-
,>
,\
y_
. Y de nuevo tenga en cuenta que otras operaciones son posibles:>g2*,@
obtener una barra vertical.Otra variación es preceder a
g
con a1
, por lo que ahora ya no está leyendo desde 0,0, sino desde la celda en blanco en 0,1. En Befunge, las celdas vacías se inicializan con espacios de forma predeterminada, por lo que1g,@
obtiene un espacio y1g1+,@
un signo de exclamación.Para los caracteres de dígitos, hay un truco más dudoso que podemos usar. En lugar de tratar de generarlos como caracteres, los generamos como números (un número pequeño es más fácil de generar que su equivalente ASCII). Entonces, por ejemplo,
11+.@
le da 2 y, en particular, tenga en cuenta los casos especiales:.@
para 0 y!.@
para 1 . La parte dudosa de esto es que una salida numérica en Befunge incluye un espacio después del número, por lo que no es una salida de caracteres pura.Otro truco dudoso que podemos usar es una variación de la
g
técnica anterior. En lugar de limitarnos a los comandos Befunge para el prefijo, también podemos utilizar técnicamente cualquier personaje que no sea un comando Befunge. En la mayoría de los intérpretes se ignorará un comando no reconocido, por log
que terminará leyendo el valor ASCII del carácter anterior. Esto nos permite generar la mayoría de los otros valores ASCII que de otra manera no podrían calcularse en 3 bytes. Como un ejemplo:Qg1+,@
te da R .Finalmente, hay tres casos especiales. No se puede generar una g en menos de 5 bytes, por lo que debemos recurrir a ella
"f"1+,@
. Una coma es el más complicado modificación dinámica, que requiere del campo de juego:0g4-:80p @
. Podríamos usar una técnica similar para evitar el carácter at, pero un truco más eficiente es usar el%
comando (módulo) como terminador, es decir88*,%
. Cuando%
se alcanza el no hay nada en la pila, por lo que el cálculo del módulo genera una división por cero, y en el intérprete de referencia esto terminará el programa.A continuación se muestra la lista completa de programas, uno por línea.
fuente