Programma più breve il cui programma concatenato + output è una permutazione dei 95 caratteri ASCII stampabili


12

Scrivi un programma il più breve possibile (come misurato dal conteggio dei byte), non accetta input, non contiene commenti e genera una stringa / sequenza di caratteri, in modo tale che programma + output concatenati siano lunghi esattamente 95 caratteri e contengano tutti i caratteri ASCII stampabili esattamente una volta , ovvero programma + output è una permutazione dei 95 caratteri con codici ASCII 32-126:

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

In caso di pareggio, il vincitore è la voce il cui programma concatenato (95 caratteri) + output è il più vicino alla stringa sopra, misurata dalla distanza di modifica di Levenshtein (ovvero il numero di cancellazioni, inserzioni o sostituzioni necessarie per metterlo in ordine ASCII).


2
Quindi questo significa che se, ad esempio, il programma contiene caratteri ripetuti, viene automaticamente squalificato? È difficile.
breadbox,


1
Potresti anche voler decidere se il vecchio echo $0è squalificato.
Peter Taylor,

3
Sono ammessi caratteri al di fuori dell'intervallo di caratteri ASCII stampabili (e possibilmente duplicati)? O il programma + output deve contenere ogni carattere stampabile esattamente una volta e niente di più ?
primo

1
@primo Presumo che siano ammessi. Penso che sia il momento di scrivere una soluzione "shift-and-eval" che utilizza duplicati (anche se i letterali di stringa saranno difficili da ottenere)
John Dvorak,

Risposte:


12

GolfScript, 14 caratteri

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

Uscita :

 !"#$%&'(*+/015789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz|

La sfida (almeno per quanto ho capito) era quella di scrivere un programma il cui programma e output fosse una permutazione dei 95 caratteri ASCII stampabili, non scrivere il programma più breve possibile che emettesse i 95 caratteri ASCII stampabili.
Frank Schmitt,

Scusa, errore mio. Nel titolo legge "programma + output", mentre più avanti nella domanda legge programma + output concatenati .
Frank Schmitt,

),- Wow. Lo amo.
John Dvorak,

1
@JanDvorak codegolf.SE: l'unico posto in cui le persone si emozionano per un paren e una virgola. : P
Maniglia della porta

@Doorknob in golfscript significa "uncons giusti (rparen) e crea un array di quella dimensione (virgola)". In effetti ti rimane una stringa accorciata di un carattere (il ricciolo destro) e una matrice che termina appena sotto la posizione ASCII di quel personaggio (in |). Taglia i caratteri non stampabili, il punto e xor (qui la differenza del set simmetrico) con il codice sorgente (viene presa la sottrazione) sans ha detto riccio, e il gioco è fatto. E sì, string xor array è string.
John Dvorak,

6

Perl, 89 caratteri

Questo è il migliore che sono stato in grado di fare finora:

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

Per chi non è pratico in Perl minuzie, i due argomenti della printdichiarazione potrebbero essere resi come ~(-($=)) . (73 * 2)e tr///.

Il programma genera 6 caratteri:

591460

Purtroppo ogni singola iterazione costrutto che mi viene in mente in Perl ( for, while, until, map, grep) azioni almeno un personaggio con print. Se all'output fosse permesso di apparire nuove righe, allora potrei usare Perl 5.010 per ottenere una soluzione di 87 caratteri:

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

Vediamo se riesco a stampare un numero più grande :-)
John Dvorak,

uh ... puoi tradurre la seconda riga per me?
John Dvorak,

1
@JanDvorak $=è il numero di linee orizzontali nel dispositivo di output corrente. Di default 60. ~-$=è l'inversione bit per bit del complemento a due negativo di 60, che sembra essere 59. 73*2è 146. .e ,fai quello che ti aspetteresti da loro. y[]{}è un altro modo di dire tr///, che è l'operatore traslitterato. Prende $_e non fa nulla, perché non gli hai dato alcun personaggio da sostituire. Restituisce il numero di caratteri sostituiti, ovvero 0. Quindi abbiamo ~-$= . 73*2 , y[]{}= 59 . 146 , 0= '591460`.
Dan,

6

PHP 67 byte

<?=U4eB1gkFdA6J9snZD2IE8y5PhwQV^xHGmqYMfNjKpbR3vcLalCWi0_TtrOSXouz;

Produzione:

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

Sembra che ci dovrebbe essere una soluzione a 65 byte, che genera 30 caratteri anziché solo 28, ma non riesco a farla allineare. I 6 personaggi inutilizzati OSXouzsono stati invece incollati su uno dei letterali a stringa.

Modifica: dopo ulteriori riflessioni, non è possibile generare più di 28 caratteri in questo modo. UPPER ^ lowercomporterà sempre un carattere tra 32 e 63, quindi sono necessarie tutte e 10 le cifre @[\]_`{|}~. Quattro dei restanti 22 sono usati nello stesso script, lasciando solo 18 che possono essere ottenuti solo con lettere. Tuttavia, il tiebreaker potrebbe essere migliorato in modo significativo.


Ah, certo, senza parole. Come avrei potuto dimenticarlo?
John Dvorak,

3

Rubino, 91 caratteri

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

Uscite 6273.

%{...} trucco rubato da Jan Dvorak


Senza commenti. Come affermato chiaramente.
Johannes Kuhn,

@JohannesKuhn Ah, non me ne sono accorto. modificato.
Maniglia della porta

%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcefghijklmnqvwxyz|~};puts(?@.ord*98+1)è quello che penso tu voglia (per 91 caratteri) con il punto e virgola spostato per essere usato come un separatore stampabile (anziché una nuova riga), e con le lettere di 'ord' rimosse dall'interno delle parentesi graffe.
res

@res Sì, è difficile gestire tutte queste lettere: P
Doorknob

Ora \ è incluso tre volte.
Howard,

3

Perl, 61 caratteri

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

Produzione:

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

$:il valore predefinito è " \n-". x8lo ripete otto volte; il risultato di 24 caratteri viene quindi bitored xored con un barestring di 23 caratteri (l'ultimo -viene lasciato così com'è). La seconda parte è una stringa Q di 12 caratteri bit a bit e una limitazione di 10 caratteri (gli ultimi 2 caratteri vengono scartati).


1
Trovo che la lunghezza del tuo programma sia di 61 caratteri.
res

Grazie. Il mio editor di testo riportava 62 caratteri a causa dell'EOF.
Grimmy,

1

Rubino, 95 caratteri, 6 modifiche

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

Sì. Questo è tutto. Solo una stringa fluttuante letterale che non viene mai stampata. Ruby supporta i letterali di stringa (presi in prestito da Perl, credo) nella forma delimitatore di tipo percentuale - il delimitatore è un carattere non alfanumerico e se il delimitatore di apertura è una parentesi aperta (una delle [({<), il delimitatore di chiusura è il corrispondente parentesi di chiusura (sono consentite parentesi nidificate).

Mi rendo conto che si tratta più di una presentazione di base, ma a meno che qualcuno non riesca effettivamente a stampare qualcosa o a meno che non ci sia una lingua con una stringa a forma libera a due caratteri letterale con un delimitatore di apertura e chiusura diverso , questo è il migliore che ci sia.


0

Tcl 96, modifica distanza 12

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

Uno degli spazi dovrebbe essere una scheda, temo
John Dvorak,

è stampabile una scheda o uno spazio?
Johannes Kuhn,

la scheda non è stampabile (ASCII 9), ma lo spazio è stampabile (ASCII 32).
John Dvorak,

1
[Ho appena visto che l'OP ha chiarito questo solo dopo aver risposto :)]
terremoto del

1
join {!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghklmpqrstuvwxyz|~} sembra funzionare con 95 caratteri? (Grazie per il tuo contributo. Mi dispiace per il camaleonte - sfortunatamente ho modificato in fretta e avrei dovuto fare le cose in modo diverso.)
res
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.