# 4"16" 3//v\(@#/;\D"14"<;n4
#/*`3 afaaZ">;[77*,68*,@;'1,'1,q)(22)S# ␉␉␉␉ (
#yy␉;36!@
#`<` ␉
#=␉x
#<]+<[.>-]>[
#␉<
###xR+++++[D>+++++++L+++<-][<<<]>+.---.>][
#px%>~~~+␉+~*ttt*.x
#D>xU/-<+++L)
#R+.----.R␉>]|
#[#yy#yy0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#|␉
print((eval("1\x2f2")and(9)or(13 ) )-(0and 4)^1<<(65)>>(62))or'(\{(\{})(\{}[()])}\{}\{}\{})'#46(8+9+9+9+9+=!)#1111|=/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
__DATA__=1#//
#.\."12"␉*
###; console.log 39
""""#//
=begin␉//
#*/
#define␉z sizeof 'c'-1?"38":"37"
#include<stdio.h>
int main() /*/
#()`#`\'*/{puts(z);}/*'``
$'main'␉//
#-3o4o#$$$
<>"3"O.<␉>//
#
=end #//
"""#"#//
#0]#echo 21#/(\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE) a>>>
#>27.say# /7Jn~15o|
#8␛dggi2␛`␉|1|6$//''25 =#print(17) ###^_^_LEintnd"3"z!]/}23!@/*///Z222999"26
␉
è una scheda letterale, ␛
un carattere letterale ESC; Stack Exchange altererebbe il programma altrimenti. Ti consiglio di copiare il programma dalla casella "input" del link TIO qui sotto, se vuoi lavorare su di esso.
Provalo online!
Punteggio VIP (stampante a numeri interi versatili): 0,01329
Corri giù
Questo programma stampa 41 in Brainf ***, 40 in Minimal-2D, 39 in CoffeeScript, 38 in C, 37 in C ++, 36 in Labyrinth, 35 in INTERCAL, 34 in Rail, 33 in Incident, 32 in Whirl, 31 in SNUSP modulare, 30 in spazi bianchi, 29 in trigger, 28 in Brain-Flak, 27 in Perl 6, 26 in 05AB1E, 25 in Pip, 24 in Thutu, 23 in Hexagony, 22 in Sottocarico,21 in Nim, 20 a Prelude, 19 a Reng, 18 a Cardinal, 17 a Julia, 16 a Pyth, 15 a Haystack, 14 a Turtlèd, 13 a Ruby, 12 a Fission, 11 a Befunge-98, 10 a Befunge-93 , 9 in Perl 5, 8 in Retina, 7 in Japt, 6 in SMBF, 5 in Python 2, 4 in> <>, 3 in Minkolang, 2 in V / Vim e 1 in Python 3.
Verifica
La maggior parte delle lingue sono testate dal driver di test mostrato sopra. Puoi testare Reng qui e SNUSP modularequi ; producono rispettivamente 19 e 31, come richiesto.
Il driver di test è stato aggiornato per includere il tokenizer, finalmente. Tutto il codice C viene archiviato come argomento dal punto di vista di Bash Script. Ho anche modificato l'output per avvolgere orizzontalmente con uno spazio finale dopo ogni token anziché emettere in verticale. Questa era solo la mia preferenza, per farla corrispondere all'output degli spazi bianchi. Ma chiunque altro può cambiarlo se ha la sensazione che sia troppo confuso.
Ho anche apportato una regolazione al Test Driver per gestire la spaziatura delle colonne per il carattere UFT8 di Turtlèd nella carrellata. Quel disallineamento mi stava facendo impazzire! La "correzione" è piuttosto hack-ish poiché cerca solo una è e cambia la larghezza della colonna per quel caso, ma ottiene il lavoro fatto.
Spiegazione
Prima di tutto, voglio dire quanto è fantastica la versatile stampante a numeri interi di @ SnoringFrog snippet di codice di Rundown del punteggio di Rundown della dell'ultimo post. Ho calcolato le risposte prima di postare per un po ', e questo mi ha ispirato a mantenerlo piccolo. Penso che alla fine possiamo battere la risposta di @ sp3000.
Così ho iniziato a lavorare su questa risposta provando a cercare quello che potevo e ho avuto abbastanza successo. Ho anche avuto una risposta in un'altra lingua con un numero totale di byte inferiore a # 40. Ma mentre cercavo di giocare a golf in Minimal-2D, ho dovuto imparare BF in modo da poter lavorare meglio con i suoi derivati e nel processo ho trovato il record di @ Primo che ha battuto Hello, World! . Mi sono innamorato dell'eleganza.
Si è scoperto che Minimal-2D non era abbastanza efficiente da utilizzare la tecnica di inizializzazione del nastro utilizzata da @Primo, ma ora sono dell'opinione che probabilmente sarebbe comunque troppo pesante. Dopo tutto, stiamo solo provando a stampare un numero intero. Ma @Primo mi ha inviato lungo il percorso per imparare a moltiplicare in BF, che ho portato al codice Minimal-2D.
Quindi, dopo tutto questo, ho riletto il commento di @ SnoringFrog su come includere BF e ho capito che non solo potevo farlo, ma avrei potuto usare gran parte del codice Minimal-2D che avevo inserito nella risposta BF. Quindi ho scavato per rispondere con BF, ed eccoci qui.
Un'altra cosa prima di entrare nei dettagli. Ci sono state un paio di modifiche che ho fatto per motivi non legati al golf. Innanzitutto, ho spostato la maggior parte del codice @SnoringFrog aggiunto appena sotto i linguaggi 2D nelle prime righe. Per me, è una mossa strategica a lungo termine impedire ai lang 2D di attraversare il centro del poliglotta per prevenire, ove possibile, futuri bug. Il byte byte era basso per questa mossa, quindi ci sono andato.
In secondo luogo, durante i vari ri-fattori ho appreso che Begunges e Minkolang hanno prodotto uno spazio finale dopo output numerici e che questa era la causa dei byte null che abbiamo visto nel Test Driver per queste lingue. Ho risolto questi problemi emettendo il valore dello stack come codice ASCII (che non includeva la funzione spazio finale), anziché il valore direttamente. C'è stato un piccolo byte hit anche per questa modifica, ma ora l'output del Test Driver è così uniforme. Come non potrei?
SM / BF
Esaminiamo rapidamente le basi. Questi sono gli unici comandi validi per SMBF e BF:
> Move the pointer to the right
< Move the pointer to the left
+ Increment the memory cell under the pointer
- Decrement the memory cell under the pointer
. Output the character signified by the cell at the pointer
, Input a character and store it in the cell at the pointer
[ Jump past the matching ] if the cell under the pointer is 0
] Jump back to the matching [ if the cell under the pointer is nonzero
Entrambe le lingue hanno un nastro di memoria in cui i valori sono memorizzati e modificati. L'unica differenza di SMBF è che qualsiasi codice in esecuzione viene anche memorizzato sul nastro di memoria a sinistra del punto iniziale. Come sottolineato da @SnoringFrog, fare in modo che SMBF e BF producano risultati differenti dipende dal movimento del puntatore di memoria a sinistra dell'origine. Nell'interprete BF di Tio, il puntatore di memoria è in grado di spostarsi a sinistra dell'origine e troverà 0 anziché i codici ascii di Polyglot che SMBF vede. Ecco un esempio che può essere eseguito sia in SMBF che in BF per esemplificare la differenza.
All'inizio del poliglotta, i Befunges richiedono che nella >
seconda fila vengano eseguiti fino al completamento e Perl6 richiede che ciascuno >
sia preceduto da un <
. Quindi SM / BF inizia con il <>
lasciare il puntatore di memoria all'origine, quindi preme a [
che salta alcuni caratteri offensivi per entrambe le lingue ]
sulla sesta riga.
Successivamente, incrementiamo la cella di memoria di origine per entrambe le lingue e spostiamo il puntatore di memoria verso sinistra con +<
. (Per convenzione conversazionale, chiameremo la cella di memoria di origine come cella 0, celle a destra dell'origine 1, 2, ... E celle a sinistra -1, -2, ...). La cella -1 contiene il codice asci dell'ultimo carattere nel poliglotta in SMBF e 0 in BF, quindi quando [
si incontra il successivo , solo BF passa al successivo ]
mentre SMBF passa nel codice.
Mentre SMBF attraversa [.>-]
, stampa i 6 trovati alla fine del poliglotta e quindi sposta il puntatore della memoria sulla cella 0, riportando il suo valore su zero per uscire da ]
. Per rivedere, i nastri in questa pinta sono: le cellule negative di SMBF contengono il poliglotta, ed è 0 e le celle positive contengono zero. Le celle negative e positive di BF contengono zero mentre la sua cella di origine contiene 1.
Successivamente >
sposta SMBF nella cella 1 e BF nella cella 0 consentendo a BF di inserire il suo blocco di codice privato: [<+++++[>++++++++++<-][<<<]>+.---.>]
(Ho rimosso i caratteri non BF da questo). Qui, torniamo alla cella -1 e inizializziamo la nostra variabile di controllo del ciclo (cella -1) su un valore di 5. Quindi entriamo nel ciclo in cui aggiungiamo 10 alla cella 0 e diminuiamo la cella -1 cinque volte prima di uscire dal ciclo in cui indicheremo la cella -1 con un valore di 0.
Successivamente ci imbattiamo [<<<]
indicando uno zero, quindi BF non passa attraverso questo. Lo scopo qui è quello di bilanciare un numero di >
"precedenti <
" in modo che Perl6 non si guasti.
A questo punto la cella 0 è valutata 51. Il valore ascii di 4 è 52, quindi spostiamo il puntatore sulla cella 0 aggiungi 1, quindi stampiamo il valore. E infine, riduciamo la cella 0 al carattere ascii 1 e stampiamo di nuovo prima di impostare il puntatore di memoria sulla cella 1 (valore 0) per uscire oltre ]
.
SMBF e BF colpiscono entrambi l'ultimo [
alla riga 8 successiva mentre entrambi poggiano su un valore 0. Quindi entrambi saltano oltre il restante codice Minimal-2D fino a quando non ]
viene rilevato sulla riga 11. Ma questa è di breve durata perché la riga 12 inizia con un'altra [
che porta entrambe le lingue quasi alla fine del poliglotta dove non vengono incontrate ulteriori istruzioni.
refactors
Minimal-2D
La riscrittura di Minimal-2D doveva principalmente salvare alcuni byte in un modo simile al trucco di moltiplicazione di BF. Minimal-2D tuttavia non ha i caratteri [
e ]
per il controllo del loop. Invece ha questi comandi:
/ Skips next instruction if the data pointer is set to 0.
U Tells the program to switch to the up direction of processing instructions.
D Tells the program to switch to the down direction of processing instructions.
L Tells the program to switch to the left direction of processing instructions.
R Tells the program to switch to the right direction of processing instructions.
Questi possono essere usati per produrre la stessa struttura logica, sebbene in un maniero 2D, come quella di BF. Ad esempio, BF ++++++[>++++++<-]>.
è equivalente a questo in Minimal-2D.
Ecco una versione semplificata del codice Minimal-2D nel poliglotta, con tutto il codice estraneo rimosso e tutti i caratteri che trattengono il posto vengono sostituiti con #
.
###################D
###R+++++[D>+++++++L
###>
D>#U/-<+++L)
R+.----.R
La D
riga 1 invia il puntatore dell'istruzione alla L
riga 8 del poliglotta che invia il puntatore a sinistra. Qui impostiamo la variabile di controllo del ciclo (cella 0) su 7, spostiamo il puntatore di memoria sulla cella 1 ed entriamo in un ciclo. Nel ciclo, aggiungiamo 3 alla cella 1, diminuiamo la cella 0 quindi controlliamo se il valore della cella 0 è ancora zero. In caso contrario, aggiungiamo altri 8 alla cella 1, quindi diminuiamo e ricontrolliamo. Il risultato di questo loop è il valore della cella 1 impostato su 51 alla fine del loop (6 * 8 + 3).
Usciamo dal ciclo saltando il U
, spostando il puntatore di memoria sulla cella 1 e scendendo poi a destra sulla linea 11 del poliglotta. E infine, incrementiamo fino al valore ascii per 4, quindi diminuiamo fino al valore ascii per 0 prima di correre verso destra per terminare il programma.
Retina
Retina aveva molti requisiti con cui era difficile lavorare per tutti i derivati BF. Non gli piacciono quelli consecutivi +
o non corrispondenti ()
o []
. Ma questi sono davvero solo requisiti per ogni altra linea, quindi gran parte del lavoro per BF, SMBF e Minimal-2D ruotava attorno a mettere la maggior parte del codice su linee pari.
L'unico byte assegnato esclusivamente a Retina è però |
alla fine della riga 11. Per citare @ ais523 “la maggior parte delle regex che terminano con | corrisponderà a qualsiasi cosa ". Senza questo, Retina restituisce 0. Perché questo lo risolve, non lo so. Non ho dovuto scavare troppo in Retina, probabilmente perché ho evitato la lunga fila. Ma come Preludio, ho scoperto che non ho bisogno di capirlo tanto quanto ho bisogno di capire come eseguire il debug, che in questo caso consisteva principalmente nell'eliminare le linee (in multipli di 2) fino a quando non ho trovato la linea questo sta causando la sua rottura. Ho indovinato questa correzione sulla base del commento di @ ais523, e sono stato premiato. Sono troppo figo per la scuola, immagino.
Cardinale
Mi è capitato di apprezzare il posizionamento di @ SnoringFrog di Minimal-2D rispetto al codice di Cardinal. È una buona posizione considerando che Cardinal non disturba la Retina e sembra consentire un intreccio con Minimal-2D. Quindi, quando ho deciso di trapiantare Minimal-2D fino alla terra 2D, ho portato Cardinal per la corsa. Ci sono stati un paio di cambiamenti estetici a Cardinale però. In primo luogo, ho lanciato >
quasi all'inizio della sua dichiarazione #p x%>~~~+ +~*ttt*.x
per Minimal-2D per cambiare i puntatori di memoria all'interno del suo loop / Second, ho spostato tutto di un carattere a destra per dare spazio a Minimal-2D per uscire dal suo loop con grazia. In p
questa puntura è per questa imbottitura del personaggio.
Befunge / 98
I Befung sono in realtà il punto in cui ho iniziato a cercare di giocare a golf sul poliglotta, dal momento che il refattore C ++ ha cambiato tutto l'altro codice lang 2D, tranne questo. Nel tentativo di imparare WTF stava succedendo in questo codice, ho trovato questo nella documentazione di Begunge:
Il .
comando aprirà un valore dallo stack e lo emetterà come un numero intero decimale, seguito da uno spazio , un po 'come Forth. ,
aprirà un valore, lo interpreterà come il valore ASCII di un carattere e produrrà quel carattere ( non seguito da uno spazio ) .
Santa Talpa! Possiamo ripulire i byte null sull'output. Dopodiché, si trattava solo di capire come inserire i valori ASC più grandi e di separare il codice. Befunge-98 aveva un codice di salto che gli ;
diceva di saltare [77*,68*,@
dentro ;[77*,68*,@;'1,'1,q
, il che ci ha dato la segregazione.
Befunge-98 aveva anche un comando ( '
) per prendere il codice ASCII del carattere successivo. Quindi, '1,
prende il codice asci codice per il personaggio 1
, lo mette nello stack e quindi stampa il carattere ASCII per il valore più alto nello stack con ,
. Devo farlo due volte per stampare 11 e rilasciare a q
per uscire con grazia.
Befunge vera e propria è un po 'meno conveniente, ma solo giusto. Qui dobbiamo eseguire un calcolo per mettere il codice desiderato nello stack. Fortunatamente, i nostri codici sono stati facilmente moltiplicati con 7 * 7 e 6 * 8 prima dello stesso comando di output ,
. Quindi uscimmo da Befunge @
prima che il codice di suo fratello maggiore contaminasse l'output.
Minkolang
Dopo aver trovato una correzione per gli spazi finali del Befunge, mi sono piuttosto entusiasta all'idea di trovare anche una correzione Minkolang e la documentazione di Minkolang affermava che il comando di output che era stato utilizzato fino a quel momento funzionava allo stesso modo dell'interprete Befunge. O
mi è capitato di essere documentato come un altro comando di output, che non è stato descritto come condivisione di questo Begunge-ness, quindi ho appena fatto uno scatto al buio e ho provato a emettere la stringa "3"
. Vittoria impeccabile.
> <>
Una delle prime cose che ho visto quando ho spostato il codice Minimal-2D è stata la verifica che potevo spostare> <> insieme ad esso. Se avessi avuto a che fare con il transversalismo poliglotta 2D, avrei avuto a che fare con tutte le trasgressioni. Fondamentalmente ho tentato la fortuna di trovare la soluzione di mettere ;n4
alla fine della linea 1 e di spostarmi \D
indietro nella riga 1. A proposito, non sapevo che> <> potesse essere indirizzato verso il basso prima della risposta 40 poiché era così ben contenuto . Mi piacerebbe pensare che questo potrebbe essere usato in seguito per divergere> <> da un'altra lingua simile.
Perl6
Ho parlato di alcuni dei <>
problemi di bilanciamento di Perl6 altrove in questa risposta, quindi non ci riproverò. Ma voglio sottolineare che sono passato #>27.say#
alla penultima riga. Questo non ha uno scopo funzionale in questa risposta. In realtà ho fatto questa mossa per soddisfare una risposta diversa che ho finito per non usare in questo round. Ho deciso di lasciarlo solo perché ho intenzione di pubblicare quella risposta alla mia prossima opportunità e non volevo preoccuparmi di annullare e rifarlo.
Correzioni di bug
05as1e
05as1e sicuramente non mi è piaciuto il nuovo codice Begunge tanto quanto la vecchia versione. Suppongo che sia la ,
s poiché è l'unico personaggio rivoluzionario. In ogni caso, "
per nascondere i comandi offensivi , ho dovuto spostarmi indietro nella seconda riga e sapevo che "
doveva andare prima del percorso del codice Befunge poiché "
era un sì-op in entrambe le lingue. (Posso solo inventare termini come yes-op giusto?) La 2-dimensionalità della riga 2 è piuttosto rigida, ma sono stato in grado di spostare il <
precedente al percorso del codice di Begunge con il "
. L' <
però era un requisito di Perl6. (Deve avere un <
precedente tutto >
s.) Sono stato in grado di abbandonare quello <
in linea in una posizione divisa dall'istinto e dalla preconoscenza risolvendo 05ab1e e il disaccordo di Perl6.
vortice
Le modifiche di Befunge sulla linea 2 hanno aggiunto un extra 1
al poliglotta prima della linea Incidente / Vortice. Questo extra ha 1
causato Whirl per iniziare indicando le istruzioni sbagliate sulla ruota. Il primo 1
nella direttiva del preprocessore del C / C ++ era solo un riferimento al numero di riga nel codice, e questo poteva essere altrettanto facilmente qualsiasi altro numero di riga, quindi l'ho modificato arbitrariamente 4
per soddisfare Whirl.
Incidente
La stringa di detokenizing alla fine del poliglotta è ben nota a questo punto, quindi non ci entrerò. Ho rimosso dalla stringa ciò che potevo e ho aggiunto i nuovi token richiesti. Ci sono 2 personaggi detokenizing che non sono in questa stringa, tuttavia, che dovrei sottolineare. Primo, secondoR
in #R+.----.R >]|
è necessario qui perché è un punto di fusione di partenza, ed era più sicuro su questa linea, perché c'era già una rubrica punto di fusione di partenza nella stessa direzione. In secondo luogo, x
in #= x
è di rimuovere un token coinvolto in un ␉␊#
modello, che è diventato più comune.
Altri
Hexagony, Whitespace e Prelude avevano tutti i soliti piccoli aggiustamenti, ma niente di speciale da ricordare.
Pensieri finali
Questo è tutto ciò che ho per questa risposta. Per coloro che cercano un punto di partenza nella prossima risposta, suggerirei il male. Sembra fattibile, anche se non l'ho esaminato troppo da vicino, ma sospetto che non sarebbe troppo difficile integrarlo. So che ha un comando di salto che dovrebbe aiutare a saltare la maggior parte del poliglotta. In bocca al lupo.