El programa más corto cuyo programa concatenado + salida es una permutación de los 95 caracteres ASCII imprimibles

12

Escriba un programa que sea lo más corto posible (medido por el recuento de bytes), no toma entrada, no contiene comentarios y genera una secuencia / secuencia de caracteres, de modo que el programa concatenado + salida tiene exactamente 95 caracteres y contiene todos los caracteres ASCII imprimibles exactamente una vez , es decir, programa + salida es una permutación de los 95 caracteres con códigos ASCII 32-126:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 

En caso de empate, el ganador es la entrada cuyo programa + salida concatenado (95 caracteres) está más cerca de la cadena anterior, según lo medido por la distancia de edición de Levenshtein (es decir, el número de eliminaciones de un solo carácter, inserciones o sustituciones requeridas para ponerlo en orden ASCII).

res
fuente
2
Entonces, ¿esto significa que si, por ejemplo, el programa contiene caracteres repetidos, se descalifica automáticamente? Eso es rudo.
breadbox
1
También es posible que desee decidir si el antiguo echo $0está descalificado.
Peter Taylor
3
¿Se permiten caracteres fuera del rango de caracteres ascii imprimibles (y posiblemente duplicados de los mismos)? ¿O el programa + salida debe contener todos los caracteres imprimibles exactamente una vez y nada más ?
primo
1
@primo Supongo que están permitidos. Creo que es hora de escribir una solución "shift-and-eval" que use duplicados (aunque los literales de cadena serán difíciles de obtener)
John Dvorak

Respuestas:

12

GolfScript, 14 caracteres

{`),32>46-^}.~

Salida :

 !"#$%&'(*+/015789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz|
Howard
fuente
El desafío (al menos hasta donde yo entiendo) era escribir un programa cuyo programa y salida sea ​​una permutación de los 95 caracteres ASCII imprimibles, no escribir el programa más corto posible que genere los 95 caracteres ASCII imprimibles.
Frank Schmitt
Perdón mi error. En el título se lee "programa + salida", mientras que más adelante en la pregunta se lee programa + salida concatenado .
Frank Schmitt
),- Guau. Eso me encanta
John Dvorak
1
@JanDvorak codegolf.SE: el único lugar donde la gente se entusiasma con un par y una coma. : P
Pomo de la puerta
@Doorknob en golfscript significa "descomprimir correctamente (rparen) y hacer una matriz de ese tamaño (coma)". De hecho, te queda una cadena acortada por un carácter (el rizado derecho) y una matriz que termina justo debajo de la posición ASCII de ese carácter (en |). Recorte los caracteres no imprimibles, el punto y xor (diferencia de conjunto simétrico aquí) con el código fuente (se toma la resta) sin decirlo correctamente, y ya está. Y sí, string xor array es string.
John Dvorak
6

Perl, 89 caracteres

Esto es lo mejor que he podido hacer hasta ahora:

q< !"#%&'()+/8:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\^_`abcdefghjklmosuvwxz|>;
print~-$=.73*2,y[]{}

Para aquellos que no están familiarizados con Perl minutae, los dos argumentos de la printdeclaración se pueden representar como ~(-($=)) . (73 * 2)y tr///.

El programa genera 6 caracteres:

591460

Por desgracia cada iteración constructo que se me ocurre en Perl ( for, while, until, map, grep) comparte al menos un personaje con print. Si se permitiera que aparecieran nuevas líneas en la salida, entonces podría usar Perl 5.010 para obtener una solución de 87 caracteres:

q{ !"#%&'*,-./0:;>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`bcdfgjkmnoprtuvxz|~}while($_+=say)<9
caja de pan
fuente
Veamos si puedo imprimir un número mayor :-)
John Dvorak
eh ... ¿puedes traducir la segunda línea para mí?
John Dvorak
1
@ JanDvorak $=es el número de líneas horizontales en el dispositivo de salida actual. Por defecto 60. ~-$=es la inversión bit a bit del complemento negativo de dos de 60, que resulta ser 59. 73*2es 146. .y ,haz lo que esperas de ellos. y[]{}Es otra forma de decir tr///, que es el operador transliterar. Toma $_y no hace nada, porque no le diste ningún personaje para reemplazar. Devuelve el número de caracteres reemplazados, que es 0. Entonces tenemos ~-$= . 73*2 , y[]{}= 59 . 146 , 0= '591460`.
Dan
6

PHP 67 bytes

<?=U4eB1gkFdA6J9snZD2IE8y5PhwQV^xHGmqYMfNjKpbR3vcLalCWi0_TtrOSXouz;

Salida:

-|"/@>& *+}:[!],'~(){.\`7#%$

Parece que debería haber una solución de 65 bytes, generando 30 caracteres en lugar de solo 28, pero no pude hacer que se alineara. Los 6 caracteres no utilizados OSXouzse han agregado a uno de los literales de cadena.

Editar: luego de una mayor reflexión, no es posible generar más de 28 caracteres de esta manera. UPPER ^ lowersiempre dará como resultado un carácter entre 32 y 63, por lo que se requieren los 10 dígitos @[\]_`{|}~. Cuatro de los 22 restantes se usan en el guión mismo, dejando solo 18 que se pueden obtener solo con letras. Sin embargo, el desempate podría mejorarse significativamente.

primo
fuente
Ah, claro, palabras simples. ¿Cómo podría haberlo olvidado?
John Dvorak
3

Ruby, 91 caracteres

%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcefghijklmnqvwxyz|~};puts(?@‌​.ord*98+1)

Salidas 6273.

%{...} truco robado de Jan Dvorak

Pomo de la puerta
fuente
Sin comentarios. Como se indica claramente.
Johannes Kuhn
@JohannesKuhn Ah, no me di cuenta de eso. editado
Pomo de la puerta
%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcefghijklmnqvwxyz|~};puts([email protected]*98+1)es lo que creo que desea (para 91 caracteres) con el punto y coma movido para usarlo como un separador imprimible (en lugar de una nueva línea), y con las letras de 'ord' eliminadas del interior de las llaves.
res
@res Sí, es difícil manejar todas estas letras: P
Pomo de la puerta
Ahora \ se incluye tres veces.
Howard
3

Perl, 61 caracteres

print$:x8^CJIBQTOWAEULHVGFNMKRPZY,q<#"/;*g~?|={.>&+u15m97ws26

Salida:

c@db[yo]le_ah\jfD`kX}zS-! %)('v304

$:por defecto " \n-". x8lo repite ocho veces; El resultado de 24 caracteres se grabó en bits con una barra libre de 23 caracteres (el último -se deja como está). La segunda parte es una cadena q de 12 caracteres a nivel de bits y una barra libre de 10 caracteres (los últimos 2 caracteres se descartan).

Mugriento
fuente
1
Creo que la longitud de su programa es de 61 caracteres.
res
Gracias. Mi editor de texto informó 62 caracteres debido a la EOF.
Grimmy
1

Ruby, 95 caracteres, 6 ediciones

%{ !"#$&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz|~}

Sí. Eso es. Solo un literal de cadena flotante que nunca se imprime. Ruby admite literales de cadena (prestados de Perl, creo) en la forma delimitador de tipo porcentual: el delimitador es cualquier carácter no alfanumérico, y si el delimitador de apertura es un paréntesis de apertura (cualquiera de [({<), el delimitador de cierre es el correspondiente corchete de cierre (se permiten corchetes anidados).

Me doy cuenta de que esto es más una presentación de línea de base, pero a menos que alguien logre imprimir algo o que haya un lenguaje con un literal de cadena de forma libre de dos caracteres con un delimitador de apertura y cierre diferente , este es el mejor que hay.

John Dvorak
fuente
0

Tcl 96, editar distancia 12

if 0    {!"#$%&'()*+,-./123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdeghjklmnopqrstuvwxyz|~}
Johannes Kuhn
fuente
Me temo que uno de los espacios debería ser una pestaña
John Dvorak,
¿Se puede imprimir una pestaña o espacio?
Johannes Kuhn
la pestaña no se puede imprimir (ASCII 9), pero el espacio se puede imprimir (ASCII 32).
John Dvorak
1
[Acabo de ver que el OP solo aclaró esto después de que respondiste :)]
flornquake
1
join {!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghklmpqrstuvwxyz|~} parece funcionar con 95 caracteres? (Gracias por su entrada. Perdón por el camaleón, desafortunadamente lo edité a toda prisa y debería haber hecho las cosas de manera diferente)
Res