Prefisso principesco di un programma in serie


16

Dovresti scrivere un programma o una funzione che produca o restituisca il più possibile il Capitolo I di The Little Prince . Il programma o la funzione deve essere un blocco di codice M-by-N contenente solo caratteri ASCII stampabili (punto di codice da 32 a 126) e nuove righe alla fine di ogni riga.

Puoi usare al massimo 26 caratteri a tua scelta tra i 96 caratteri ASCII stampabili (e le nuove righe alla fine delle righe).

In ogni riga e colonna ogni personaggio deve essere distinto in modo simile a un puzzle del sudoku, cioè non può esserci una lettera in una riga o colonna due volte.

Un esempio di codice corretto con M = 4, N = 3e alphabet = {a,b,c,d,/,*}:

abcd
bcd*
*/ac

Dettagli del codice

  • Puoi scegliere la forma del tuo blocco di codice (cioè Me N).
  • Il blocco deve essere pieno di caratteri, ovvero ogni riga deve avere la stessa lunghezza.
  • Una nuova riga finale alla fine dell'ultima riga è facoltativa.
  • Come scritto sopra in ogni riga e colonna, ogni carattere deve essere distinto.

Dettagli di output

  • Dovresti produrre o restituire un prefisso del capitolo I di Il piccolo principe senza ulteriori output.
  • Se si raggiunge una nuova riga nel testo, è possibile rappresentarla come qualsiasi variante comune (\ r, \ n, \ r \ n) ma utilizzare solo una di esse e contarla come 1 byte per il punteggio.
  • Una nuova riga finale è facoltativa.

Il tuo punteggio è la lunghezza del testo di output escludendo una nuova riga aggiuntiva se presente. Il punteggio più alto è migliore.

Risposta di esempio

##Python3, score = 6

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

    print('O\
    nce w')#X

Puoi verificare la validità del tuo codice con questo programma Python 3 (ideone) o questo programma CJam (online) fornito da @ MartinBüttner.


Questo non limita al massimo le dimensioni del programma a 26x26?
Marin

@marinus Sì.
randomra,

Sei sicuro che sia risolvibile?
FUZxxl,

@FUZxxl la domanda contiene una soluzione di riferimento con il punteggio 6. Speriamo che la domanda sia progettata in modo tale che non sia possibile stampare l'intera cosa (o che avrebbe bisogno di un pareggio).
Martin Ender,

@ MartinBüttner Ah! Ho dimenticato la parte "un prefisso di ...".
FUZxxl,

Risposte:


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-

Provalo online

Alfabeto: "'*-/2INOSacdehilmnorswxy

Spiegazione:

"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)

7

Pip , punteggio = 38

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

Alfabeto: "'015:IMORXacdehilnorswxy

(Sicuramente odio provare questo in un vero linguaggio di programmazione.)

Spiegazione:

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

4

Python 3, punteggio = 11

Questo è un problema davvero difficile per Python, poiché le restrizioni sulla ripetizione di caratteri su una riga o colonna rendono quasi impossibile rendere più di una stringa letterale. I vari modi di unire le stringhe sono quindi abbastanza inutili, poiché non è possibile iniziare le stringhe in alcun modo utile. Ecco il mio miglior tentativo:

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

Nota che c'è uno spazio alla fine della prima riga. L'alias xper chrè necessario per evitare che lo stesso carattere finisca in più di una colonna. I caratteri di commento alla fine potrebbero essere praticamente qualsiasi cosa.

L'alfabeto è composto da 21 caratteri stampabili, più newline (notare lo spazio all'inizio):

 "#(),37=O\cehinprtwx

L'output è:

Una volta quando io


Nota che questo è valido anche in Python 2. Grazie per aver trovato una buona risposta.
mbomb007,

3

CJam, punteggio = 21

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

Alfabeto: -;INOSacehinoswxy

Solo per far rotolare la palla; questo può probabilmente essere battuto facilmente.


2

CJam, punteggio = 15

Ho avuto questa idea per un po 'di tempo, ma non ho avuto il tempo di sedermi e mescolare le cose fino a quando non avrò la necessaria unicità della colonna, quindi per ora ecco una versione per bambini:

 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

Provalo online .

Spiegazione

L'idea di base è quella di utilizzare la codifica di base in modo da poter stampare più di 26 tipi di caratteri. Il codice principale è

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

Si noti che trattiamo il primo "O"per "Once"separatamente perché compresa nella nostra stringa vorrebbe troppo del nostro alfabeto. Se volessimo, potremmo provare ad estendere la nostra stringa di indicizzazione, ma dato che non ci sono più caratteri maiuscoli per un po 'a parte "I"questo, non mi sono preoccupato troppo di questo.

Abbiamo quindi bisogno di costruire il grande numero sulla seconda riga in qualche modo. L'approccio che ho adottato è stato quello di moltiplicare ripetutamente per un po 'di potenza, quindi aggiungere una costante e ripetere, quindi nel codice sopra 85032995607801617394è sostituito da

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

dove )è incremento ed #è esponenziazione in CJam.

Quindi il resto (la parte più fastidiosa) riempie ogni riga per soddisfare i criteri della colonna. Per fare questo scarichiamo i caratteri nelle stringhe e li usiamo ;per farli apparire. Sfortunatamente, anche se vorremmo utilizzarlo anche e#per i commenti per semplificare le cose, il fatto è quello# sia l'espiazione lo proibisce, quindi questo viene fatto solo sull'ultima riga.

Sono abbastanza sicuro che questo metodo possa essere esteso fino alla virgola nella prima frase, ma sfortunatamente mescolare le cose per soddisfare i criteri della colonna si sta rivelando difficile, quindi potrei aver bisogno di un altro metodo per generare l'intero con codifica base.


1

Python 2, punteggio = 13 (non valido)

Python non è la lingua migliore per questo .... Dopo un'ulteriore ispezione, ci sono due nsecondi nella mia prima riga. Non c'è rimedio utile e smetterò di perdere tempo con Python. Attualmente sto lavorando per creare una soluzione in un'altra lingua, ma non condividerò ancora quale.

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

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

Produzione: Once when I w


La tua prima riga non è valida, poiché ha due nsecondi. Questo problema è quasi impossibile in Python, poiché è possibile utilizzare una barra rovesciata di continuazione una sola volta (poiché la barra rovesciata deve trovarsi nell'ultima colonna) e nessuna linea può avere due dello stesso tipo di virgolette.
Blckknght,

@Blckknght Ah, mi mancava quello. Si. La mia risposta probabilmente non sarebbe migliore dell'esempio del PO allora ...
mbomb007,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.