Prefijo principesco por un programa en patrón

16

Debería escribir un programa o función que genere o devuelva la mayor cantidad posible del Capítulo I de El Principito . Su programa o función tiene que ser un bloque de código M-por-N que contenga solo caracteres ascii imprimibles (punto de código del 32 al 126) y nuevas líneas al final de cada fila.

Solo puede usar como máximo 26 caracteres de su elección entre los 96 caracteres ascii imprimibles (y las nuevas líneas al final de las filas).

En cada fila y columna, cada personaje debe ser distinto al de un sudoku, es decir, no puede haber una letra en una fila o columna dos veces.

Un ejemplo bloque de código correcta con M = 4, N = 3y alphabet = {a,b,c,d,/,*}:

abcd
bcd*
*/ac

Detalles del código

  • Puede elegir la forma de su bloque de código (es decir, My N).
  • El bloque debe completarse con caracteres por completo, es decir, cada fila debe tener la misma longitud.
  • Una nueva línea al final de la última fila es opcional.
  • Como se escribió anteriormente en cada fila y columna, cada carácter debe ser distinto.

Detalles de salida

  • Debería generar o devolver un prefijo del Capítulo I de The Little Prince sin ningún resultado adicional.
  • Si llega a una nueva línea en el texto, puede representarla como cualquier variante común (\ r, \ n, \ r \ n) pero use solo una de ellas y cuente como 1 byte para la puntuación.
  • Una nueva línea adicional es opcional.

Su puntaje es la longitud del texto de salida, excluyendo una nueva línea adicional si está presente. Mayor puntaje es mejor.

Ejemplo de respuesta

##Python3, score = 6

alphabet = `print('O\ce w)#X` (alphabet element count = 16)

    print('O\
    nce w')#X

Puede verificar la validez de su código con este programa Python 3 (ideone) o este programa CJam (en línea) provisto por @ MartinBüttner.

randomra
fuente
¿No limita esto el tamaño del programa a 26x26 como máximo?
marinus
@marinus Sí, lo hace.
randomra
¿Estás seguro de que esto tiene solución?
FUZxxl
@FUZxxl la pregunta contiene una solución de referencia con puntaje 6. Esperemos que la pregunta esté diseñada de tal manera que no sea ​​posible imprimir todo (o necesitaría un desempate).
Martin Ender
@ MartinBüttner ¡Ah! Olvidé la parte "un prefijo de ...".
FUZxxl

Respuestas:

4

CJam, 47

"Once wh
en Imwas
msix yea
r2s oldm
I "N-'m/
Sc*2s-O"
saw"N/SO
o'aS"m2 
a"Oo2s-N
-S/OI*so
'yI-a"nr
wiNadI"c
cel'iaIS
/m2*Oo'x
 I-scel*
Ooel'c 2
2/'e*ON-

Pruébalo en línea

Alfabeto: "'*-/2INOSacdehilmnorswxy

Explicación:

"Once wh
en Imwas
msix yea
r2s oldm
I "         push this string
N-          remove newlines
'm/Sc*      replace m's with spaces (the c is redundant)
2s-         convert 2 to string and remove 2's
O           push an empty string
"
saw"        push this string
N/          split into lines (effectively removes the newline)
S           push a space
Oo          print empty string (no-op)
'a          push 'a'
S           push a space
"m2 
a"          push this string
Oo          print empty string (no-op)
2s-         convert 2 to string and remove 2's
N-          remove newline
S/          split by space (effectively removes the space)
OI*so       print an empty string repeated 18 times (no-op)
'y          push 'y'
I-          subtract 18 -> 'g'
a           wrap in array (string) -> "g"
"nr
wiNadI"     push this string
c           convert to (first) character -> 'n'
c           convert to character (no-op)
el          convert to lowercase (no-op)
'i          push 'i'
a           wrap in array (string) -> "i"
IS/         split " " into slices of length 18 -> [" "]
m           (acting as -) remove space strings from "i" (no-op)
2*          repeat "i" 2 times -> "ii"
Oo          print empty string (no-op)
'x          push 'x'
I-          subtract 18 -> 'f'
sc          convert to string and back to char (no-op)
el          convert to lowercase (no-op)
*           join "ii" with separator 'f' -> "ifi"
Oo          print empty string (no-op)
el          convert to lowercase (no-op)
'c          push 'c'
2 2/        divide 2 by 2 -> 1
'e          push 'e'
*           repeat 'e' 1 time -> "e"
O           push empty string
N-          remove newlines (no-op)
aditsu
fuente
7

Pip , puntaje = 38

eyli:
"Once
when0
I was
si01x
year5
old I
0sMw1
1M 0"
X1RMh
Rnsxy
iR:'M
'aiR 
:5'si

Alfabeto: "'015:IMORXacdehilnorswxy

(Seguro que odiaría probar esto en un lenguaje de programación real ).

Explicación:

eyl      Statements consisting of single variables are no-ops
i:       Assign to i the following:
"Once
when0
I was
si01x
year5
old I
0sMw1
1M 0"    ...this string
X1       ...repeated once (no-op to get alignment right)
RMh      ...with all 1s and 0s removed (h is preinitialized to 100)
Rns      ...and all newlines replaced with spaces.
xy       More no-ops
iR:'M'a  Replace every M with a, assigning result back to i
iR:5's   Replace every 5 with s, assigning result back to i
i        Auto-print i
DLosc
fuente
4

Python 3, puntuación = 11

Este es un problema realmente difícil para Python, ya que las restricciones en la repetición de caracteres en una línea o columna hacen que sea casi imposible hacer más de una cadena literal. Por lo tanto, las diversas formas de unir cadenas son bastante inútiles, ya que no puede obtener las cadenas para comenzar de ninguna manera útil. Aquí está mi mejor intento:

x=chr 
print(
"Once\
 when"
,x(73)
)#prin

Tenga en cuenta que hay un espacio al final de la primera línea. El alias xpara chres necesario para evitar que el mismo carácter termine en más de una columna. Los caracteres de comentario al final podrían ser casi cualquier cosa.

El alfabeto tiene 21 caracteres imprimibles, más nueva línea (observe el espacio al inicio):

 "#(),37=O\cehinprtwx

Salida es:

Una vez cuando yo

Blckknght
fuente
Tenga en cuenta que esto también es válido en Python 2. Agradece encontrar una buena respuesta.
mbomb007
3

CJam, puntaje = 21

"Once wh
en I"N-o
N;S"was 
six y"N-

Alfabeto: -;INOSacehinoswxy

Solo para hacer rodar la pelota; Esto probablemente se puede superar fácilmente.

Ypnypn
fuente
2

CJam, puntaje = 15

He tenido esta idea por un tiempo, pero no he tenido tiempo de sentarme y barajar las cosas hasta que obtenga la singularidad de columna necesaria, así que aquí hay una versión para bebés por ahora:

 79c32"*)+#,105468:;=>Ibef
,:=>Ibcef";7 6)#*219435+80
50I=>;9)6#*127438+ ":,bcfe
),68:>=Ibcef";20 5#*17394+
6)4*b123,97>:c"80f5=+;e# I
"9>+f=e# ),*0481362bI:;5c7

Alfabeto (26): " #)*+,0123456789:;=>Ibcef

Pruébalo en línea .

Explicación

La idea básica es utilizar la codificación base para que podamos imprimir más de 26 tipos de caracteres. El código central es

79c                             e#  Push "O"
85032995607801617394 28b        e#  Push array of indices, encoding using base 28
123,97>:c" I                    e#  Push "abcdefghijklmnopqrstuvwxyz I\n"
"+
f=                              e#  Map indices to chars

Tenga en cuenta que tratamos el primero "O"por "Once"separado porque incluirlo en nuestra cadena tomaría demasiado de nuestro alfabeto. Si quisiéramos, podríamos intentar extender nuestra cadena de indexación, pero como no suceden más caracteres en mayúscula por un tiempo, aparte de "I"eso, no me molesté demasiado con esto.

Entonces necesitamos construir el gran número en la segunda línea de alguna manera. El enfoque que tomé fue multiplicar repetidamente por algo de potencia, luego agregar una constante y repetir, por lo que en el código anterior 85032995607801617394se reemplaza por

32
7 6) # * 219435 +
9) 6 # * 127438 +
20 5 # * 17394 +

donde )es incremento y #es exponenciación en CJam.

Luego, el resto (la parte más molesta) está rellenando cada fila para cumplir con los criterios de la columna. Para hacer esto, volcamos los caracteres en cadenas y los usamos ;para reventarlos. Desafortunadamente, si bien nos gustaría usar también los e#comentarios para facilitar las cosas, el hecho de que #sea ​​exponenciación lo prohíbe, por lo que esto solo se hace en la última línea.

Estoy bastante seguro de que este método puede extenderse hasta la coma en la primera oración, pero desafortunadamente barajar las cosas para cumplir con los criterios de la columna está resultando difícil, por lo que podría necesitar otro método para generar el entero codificado en base.

Sp3000
fuente
1

Python 2, puntaje = 13 (inválido)

Python no es el mejor lenguaje para esto ... Luego de una inspección más profunda, hay dos ns en mi primera línea. No hay remedio que valga la pena, y voy a dejar de perder el tiempo con Python. Actualmente estoy trabajando para hacer una solución en otro idioma, pero aún no compartiré cuál.

print"Once wh\
en I",#Oncehtp
chr(0167)#Onwt

Alfabeto (22): "#(),0167IOcehinprtw

Salida: Once when I w

mbomb007
fuente
Su primera línea no es válida, ya que tiene dos ns. Este problema es casi imposible en Python, ya que solo puede usar una barra diagonal inversa de continuación de línea una vez (ya que la barra diagonal inversa debe estar en la última columna) y ninguna línea puede tener dos del mismo tipo de comillas.
Blckknght
@Blckknght Ah, me perdí esa. Si. Mi respuesta probablemente no sería mejor que el ejemplo del OP entonces ...
mbomb007