Bowling di codice riorganizzabile


14

Sfida di bowling

Scrivi un programma o una funzione che produce lo stesso output, indipendentemente da come riorganizzi il codice sorgente. (L'output non può essere un errore)


Punteggio Pangram

  • Il tuo punteggio è la quantità di caratteri unici nel tuo codice sorgente.

    Un programma con codice sorgente AJBavrebbe un punteggio di 3
    Un programma con codice sorgente AAJavrebbe un punteggio di 2
    Un programma con codice sorgente 111avrebbe un punteggio di1

  • Questa è una variante di . Vince il programma con il punteggio più alto!

(Per comodità, qui è stato creato uno strumento di punteggio automatizzato )


Regole della sfida

  1. Input
    Il programma / funzione può accettare un input, ma è del tutto facoltativo.

  2. Output
    Questo output può essere tutto quello che vuoi, ma dovrebbe essere non nullo, non nullo, non vuoto e senza errori. (Pertanto l'output deve essere almeno 1 byte)

  3. Riorganizzazione
    Non importa come il codice sorgente viene riorganizzato, l'output dovrebbe essere lo stesso.

    Esempio:
       Programma: ABJuscite hello world, così come i programmi: [ AJB, JAB, JBA, ecc]

Questa è una variante di . Vince il programma con il maggior numero di personaggi!


1
Senza alcun compito specifico da realizzare, questa sfida è troppo ampia secondo me.
Dennis,

2
Cosa significa non-zero?
Dennis,

2
Mentre il tuo punteggio pangram è un tentativo di far funzionare il bowling di codice, non sono sicuro che queste sfide debbano essere davvero taggate come bowling di codice . Il meccanismo di calcolo del punteggio è molto diverso da quello che dovrebbe essere il bowling di codice, quindi direi che usi code-challenge o crei un nuovo tag.
Martin Ender,

1
Sono d'accordo con Martin. Ad esempio, questa sfida non è un code-golf. Non appena ottieni un punteggio diverso da quello del numero totale di caratteri (o byte), non è più una sfida di bowling
Nathan Merrill

3
Il programma / la funzione deve finire? (es. posso stampare 0per sempre?)
MildlyMilquetoast

Risposte:


18

Lenguage, 1.112.064 punti se UTF-8

Il mio programma è composto da ogni possibile carattere UTF-8. Stampa "Hello world" e utilizza 1,75 * 1076 yottabyte di spazio.

(Per generare il programma, è sufficiente creare un file con 17498005810995570277424757300680353162371620393379153004301136096632219477184361459647073663110750484 caratteri, assicurandosi che ogni possibile carattere UTF-8 sia nel file)


2
Lei, signore, è un genio. E aspetta, perché il mio computer si sta rompendo? : 'P
HyperNeutrino,

Pensavo che Unicode avesse il carattere 1114112?
MilkyWay90

14

Molte lingue, 2 punti

0.

Produce 0.0come 0.o .0. Richiede l'analisi del numero liberale che va bene con un punto decimale all'inizio o alla fine, assumendo 0 per la parte integrale o decimale mancante.0000000.darebbe lo stesso punteggio.

Funziona anche nelle seguenti lingue (in alcuni casi con un output diverso, come indicato):

  • Python REPL
  • REPL Javascript
  • MATLAB (produce ans = 0 )
  • Octave (produce ans = 0 )
  • MATL (produce 0 )
  • CJam
  • Retina (produce 0 )
  • Stacked (produce 0)

Per Python, penso che questo sia l'unico modo per ottenere un punteggio superiore a 1, poiché le possibilità possono essere esaurite.

  • Qualsiasi operatore binario o unario fallirà come ultimo carattere
  • Qualsiasi [](){} richiede una partita e fallirà se quello di chiusura viene prima
  • Una scheda o uno spazio non possono iniziare una linea. Newline non può essere utilizzato in REPL.
  • A , non può essere il primo personaggio
  • Un #primo classificato commenterebbe tutto e non produrrebbe output
  • Un inizio \è una continuazione di riga non valida
  • I backtick (Python 2) devono essere accoppiati e non circondare nulla è un errore
  • $, !, ?, E @non può essere utilizzato senza altri personaggi inutilizzabili

Questo lascia lettere, cifre, _, ., e citazioni.

  • Con le virgolette, qualsiasi non stringa al di fuori di esse genera un errore.
  • Lettere con possibili cifre e _nomi di variabili, di cui non esiste sempre alcuna permutazione.

Le cifre delle foglie e .. Permettere cifre diverse dà un numero diverso a meno che tutte le cifre lo siano 0. Quindi, penso a zero ed .è l'unico modo per ottenere un punteggio sopra 1. Ma non conosco bene il lexer Python, quindi potrei mancare qualcosa.


11

CJam , punteggio 15

T U
V	LMOQR[]0q

Provalo online!

Stampa sempre 0000:

  • 0 spinge solo uno zero.
  • T, U, VSono variabili che vengono pre-inizializzati a zero.
  • L, M, O, Q, RSono variabili che vengono pre-inizializzati a un elenco vuoto, in modo che non si presentano in uscita.
  • [ e ] può o meno avvolgere le cose in un elenco, ma non è necessario che corrispondano correttamente e che l'output sia comunque appiattito per la stampa.
  • q legge l'input che è vuoto e quindi non compare neanche nell'output.
  • avanzamento riga, spazio e tabulazione vengono ignorati dal parser.

Questa è un'ottima risposta per un linguaggio come CJam! Nizza
Albert Renshaw,

Potrebbe ressere aggiunto un minuscolo realizzando qualcosa di simile al minuscolo q?
Albert Renshaw,

1
@AlbertRenshaw non puoi averli entrambi, perché uno sbaglierà su EOF.
Martin Ender,

9

MATL , 3 5 6 punti

L'idea di aggiungere spazi bianchi è stata presa dalla risposta di Bijan .

lv
 T1

Il codice, o qualsiasi sua permutazione, ne genera tre separati da newline.

Provalo online!

Spiegazione

  • La funzione ldi default spinge il numero uno nello stack.
  • Letterale 1fa lo stesso.
  • letterali Tspintetrue , che viene visualizzato come numero uno.
  • Spazio e newline sono separatori e qui non fanno nulla.
  • vconcatena l'intero stack finora in un vettore di colonna. Quindi, ad esempio, vdopo Tconcatenare i primi due numeri in una colonna (e quindi il numero successivo verrebbe inserito). Una iniziale vprodurrebbe un array vuoto.

Alla fine del codice, lo stack viene visualizzato implicitamente, con le seguenti regole:

  • Ogni elemento o matrice nello stack viene visualizzato su una riga diversa.
  • I vettori di colonna vengono visualizzati con ogni elemento su una riga diversa.
  • L'array vuoto non genera output.

Quindi qualsiasi permutazione dei caratteri di input produce 1tre volte in righe diverse.


Spiegazione? Sono curioso di sapere come funziona.
Compagno SparklePony

@Sparkle Aggiunta una spiegazione
Luis Mendo il

Bello! Volevo solo notare che avevo questo testo nella sfida Removing any part of the source code however should cause that specific output to not be produced.al momento della pubblicazione, non intendevo averlo aggiunto ed è stato rimosso. Forse questo ti aiuterà ad aumentare il punteggio un po 'forse
Albert Renshaw,

1
@AlbertRenshaw Grazie per l'heads-up! Altri due punti
Luis Mendo il

Ti sto accusando di aver rubato la mia idea. Non è un problema però.
Bijan,

6

Jelly , punteggio 53 101

¶ ¤$¥&+ABDFHNPQSUVX^_aborv|®²×ȧȯḄḅḌḞḢḤḷṀṂṚṛṠṢṪẠạị«»()kquƁƇƊƑƘⱮƝƤƬƲȤɓɗƒɦƙɱɲƥʠɼʂƭʋȥẸẈẒẎŻẹḥḳṇọụṿẉỵẓḋėġṅẏ

Usando solo personaggi che fanno parte della code-page di Jelly .

La gelatina ha un input implicito di 0, e la prima metà (fino e compresa ạị«») della stringa di codice sopra è costituita principalmente da atomi monadici (maiuscoli) e diadici (minuscoli e simboli) che quando viene dato uno zero o un elenco contenente solo uno zero ( o due di tali ingressi nel caso di diadi) restituiscono uno zero o un elenco contenente solo uno zero.

Le eccezioni sono:

  • Lo spazio: viene ignorato (anche se è nella tabella codici).

  • Il pilcrow separa i collegamenti (come fa un feed di riga, ma quello è davvero lo stesso byte), ma nessun altro byte farà riferimento comunque al codice prima di esso.

  • lo scarabeo, ¤ordina al parser di trattare tutto ciò che rimane a partire da un nilad (o costante) come una costante (e funziona come un primo atomo).

  • il Dollaro, $incarica il parser di trattare i due collegamenti alla sua sinistra come una monade (e, in qualche modo sorprendentemente, funziona come un primo atomo)

  • lo Yen, ¥allo stesso modo istruisce il parser a trattare i due collegamenti alla sua sinistra come una diade.

  • Il raccomandato, ®ricorda inizialmente il valore del registro 0(è il copyright della controparte ©, si rompe quando usato come il primo atomo in quanto è arity si trova dall'arità del link che rimane, che non è ancora impostato).

Il codice dalle parentesi, (e )senza sosta, sono attualmente punti di codice non utilizzati, questi tutti get analizzato e ogni causa una nuova catena (molto simile a un ritorno a capo avrebbe fatto, anche se non hanno l'effetto di creare legami richiamabili come una nuova riga, ma non è un problema qui perché nulla cerca di farlo).


1
È possibile aggiungere gratuitamente tutti i caratteri all'esterno della tabella codici, poiché l'interprete li rilascia prima di elaborare il codice. Tuttavia, non so ancora cosa significhi nulla.
Dennis

1
Penso che lo spirito della sfida sia probabilmente che i personaggi dovrebbero essere nella pagina. Ho chiesto di non zero e la risposta è stata quella di specificare un output minimo di 1 byte.
Jonathan Allan,

@Dennis qualche idea sulla terminologia corretta per ciò che accade con l'analisi tra parentesi?
Jonathan Allan,

Tutti i personaggi non utilizzati iniziano un nuovo collegamento, proprio come una nuova riga.
Dennis,

1
Chiamiamoli comportamento indefinito. : P
Dennis,

4

TI-Basic (serie 83), 93 punti (99 su una TI-84 Plus)

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZθnπeiAnsrandgetKeyZXsclZYsclXsclYsclXminXmaxYminYmaxTminTmaxθminθmaxZXminZXmaxZYminZYmaxZθminZθmaxZTminZTmaxTblStartPlotStartZPlotStartnMaxZnMaxnMinZnMinΔTblTstepθstepZTstepZθstepΔXΔYXFactYFactTblInputNI%PVPMTFVP/YC/YPlotStepZPlotStepXresZXresTraceStep

Tutte le cifre, tutte le variabili di un byte (compresi θ e n , le variabili indipendenti per polari della grafica e sequenziale), le costanti ¸, e , e io , alcuni non del tutto variabili ( Ans, rande getKey), e 59 diversi variabili della finestra (tutte quelle che sono garantite per essere definite).

La moltiplicazione implicita garantisce che il risultato sarà 0 quando lo prendiamo in qualsiasi ordine. Se questo è in esecuzione su un nuovo calcolatore, tutte le variabili saranno 0; anche in caso contrario, getKeysarà 0 perché non c'è tempo per premere un tasto prima che il programma restituisca un valore.

Su un TI-84 Plus o superiore, siamo in grado di ottenere più 6 punti sommando i token getDate, getTime, startTmr, getDtFmt, getTmFmt, isClockOn. Il risultato ora sarà sempre {0 0 0}perché getDatee getTimerestituisce elenchi di lunghezza 3 e la moltiplicazione implicita si distribuisce sugli elementi.

Penso che questi siano tutti i possibili token da usare: tutti i comandi effettivi sono prefisso, infisso o postfisso (nel senso che non funzioneranno all'inizio o alla fine del programma) e qualsiasi altra variabile potrebbe essere indefinita (e causare un errore quando Usato).


Questo è intelligente. Ahah non particolarmente impressionante, ma davvero intelligente! +1
Albert Renshaw,

3

(non concorrenziale) Brainf-ck, 63 byte

Bene, non so se questo è considerato un imbroglio, ma ...

.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

Il punto stampa il carattere corrente (0x00) e il resto dei caratteri non fa nulla. Questo potrebbe tecnicamente essere espanso all'infinito, quindi per favore fatemi sapere se questo è considerato un imbroglio.


Considererei un'uscita nulla
Albert Renshaw il

Oh, dovrei cancellare la mia risposta allora o contrassegnarla come non competitiva?
brianush1

1
Ci sono 97 caratteri tipizzabili, 7 dei quali non puoi usare (8-1), quindi direi 90.
Bijan

@ brianush1 puoi lasciarlo come non competitivo in modo che altri possano vederlo. Modificherò ulteriormente la domanda per spiegare che l'output deve essere almeno 1 byte
Albert Renshaw,

15
@AlbertRenshaw (scusate per tutti questi commenti) Se l'output deve essere 1 byte, il carattere NULL dovrebbe essere conteggiato, dato che è un byte, anche se uno con un valore di 0.
brianush1

3

Haskell, 3 punti

+ 1

Non importa quanto riorganizzato questo codice restituisce sempre la funzione che incrementa l'ingresso. Esempi di utilizzo in sostituzione:

>(+ 1) 1
2
>(1+ ) 1  
2
>( +1) 1
2

2

√ å ı ¥ ® Ï Ø ¿ , 128.234 (?) Punti

Sono arrivato a 128.234 con l'aiuto di @DestructibleLemon. Questo programma utilizza tutti i caratteri Unicode (128.237) tranne o, Oe ł. Stranamente, due di questi sono comandi di output.

Sicuramente, però, nessuna lingua potrebbe usare tutti quei personaggi, giusto? Bene, questa lingua ignora solo i comandi che non riconosce. Problema risolto.

Questa lingua, per impostazione predefinita, produrrà quanto segue:

===== OUTPUT =====



==================

che è nullo, non nullo, non vuoto e senza errori.

Nota: se ciò viola una regola non scritta, avvisami nei commenti e lo cambierò. Se conosci il mio punteggio (supponendo che sia consentito), pubblica anche nei commenti.


Che set di caratteri usa? utf 8? utf-16? Utilizza tutto l'unicode?
Limone distruttibile

@DestructibleLemon Guardando la pagina di github, sembra usare "CP-1252" per la codifica.
brianush1

@DestructibleLemon I comandi sono tutti in CP-1252 (Windows-1252) ma accetterà qualsiasi carattere Unicode come sintassi valida
caird coinheringaahing

Apparentemente, ci sono 128.237 caratteri unicode, quindi ne avresti 128.234? en.wikipedia.org/wiki/Unicode#cite_note-24
Limone distruttibile

Secondo altre risposte apparentemente ci sono 1.112.064 unicode, quindi non ne sono più sicuro
Destructible Lemon

1

J, 3 byte

 1

I caratteri 1, spazio e newline verranno sempre stampati 1.



1

dots , 1.114.111 caratteri (se si utilizza Unicode).

<87 dots here> Every Unicode character except NUL and . here

Spiegazione:

1                                           leading binary number
1010                                        010 increments the value under the pointer
1010111                                     111 prints out chr(1)

Quindi la stringa binaria risultante è 1010111, che convertita in decimale è 87, quindi abbiamo bisogno di 87 punti.

Ogni altro personaggio è un commento, quindi usiamo ogni personaggio tranne un NUL, perché Python3 smette di leggere il file e quindi un punto, perché i punti non sono commenti.


0

Preludio , punteggio 1.112.051

(Se si considera solo l'ASCII stampabile [\t\n -~], il punteggio è 84. Se consideriamo tutti i punti di codice Unicode , il punteggio è 1.112.051 .)

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

(quindi aggiungi tutti i caratteri [\u{7f}-\u{10ffff}] dopo di esso.)

Stampa sempre 0 .


Preludio è un linguaggio parallelo basato su stack, in cui lo stack è precompilato con un numero infinito di 0s.

  • +: Pop due valori (sempre 0), aggiungerli (0) e premere per impilare.
  • -: Pop due valori (sempre 0), sottrarli (0) e premere per impilare.
  • #: Pop un valore e scartalo.
  • !: Pop un valore e lo emette come un numero (sempre 0) (la specifica dice "carattere" ma l'interprete dice "numero"; in entrambi i casi, viene stampato un byte)
  • 0: Spinge 0.
  • ^, v , V: Spinge il valore superiore delle precedenti / successivi programmi paralleli ( "voci"), ma le pile di tutte le "voci" sono pieni di 0, in modo da spingere sempre 0.
  • altri personaggi: no-op.

Quindi ci sono solo 13 personaggi che dobbiamo evitare:

  • (, ): La parentesi non accoppiata causa errori
  • 1- 9: Vogliamo solo produrre 0.
  • ?: Non vogliamo inserire nulla.
  • *: Causa un controllo di coerenza molto complicato per il codice prima e dopo una riga composta da un solitario *. Quindi dobbiamo rimuovere la nuova riga o rimuovere il *. L'implementazione di riferimento utilizza Python 2 .readline()che una "nuova linea" potrebbe significare \ro \n. Quindi è meglio rimuovere il file *.

0

Deadfish , punteggio 86

o.ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghjklmnpqrtuvwxyz?!|[]_-();'"*&^$#@!1234567890+=<>,/\:

Se è illegale, allora c'è anche

o

(punteggio 1)

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.