Crea un interprete; #


62

Di recente ho creato una nuova lingua chiamata ;#(pronunciata "Punto e virgola") che ha solo due comandi:

; aggiungine uno all'accumulatore

#modulo l'accumulatore per 127, converti in carattere ASCII e output senza una nuova riga. Successivamente, ripristinare l'accumulatore su 0. Sì, 127 è corretto.

Qualsiasi altro personaggio viene ignorato. Non ha alcun effetto sull'accumulatore e non dovrebbe fare nulla.

Il tuo compito è creare un interprete per questo linguaggio potente!

Dovrebbe essere un programma completo o una funzione che prenderà un ;#programma come input e produrrà l'output corretto.

Esempi

Output: Hello, World!
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Output: ;#
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Output: 2d{ (unprintable characters here; should have 4 `\000` bytes between the `d` and the `{` and 3 after the `{`)
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hafh;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;f;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###ffh#h#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ffea;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#au###h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;o

Output: Fizz Buzz output
Program: link below

Output: !
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Fizz Buzz fino a 100


1
È accettabile se un interprete non termina la sua esecuzione alla fine dell'input ma continua invece a eseguire il ciclo indefinitamente senza produrre output extra?
Leone,

5
Il secondo esempio mi fa riflettere su un programma per codificare un programma per produrre un output ... compilazione ricorsiva!
frarugi87,

@ Leo sì, va bene
caird coinheringaahing

1
@iamnotmaynard Semicolon Hash
caird coinheringaahing

2
Forse Wink Hash sarebbe più facile da dire
James Waldby - jwpat7,

Risposte:



17

JavaScript (ES6), 76 82 80 byte

s=>s.replace(/./g,c=>c=='#'?String.fromCharCode(a%(a=127)):(a+=(c==';'),''),a=0)

dimostrazione

Versione ricorsiva, 82 77 byte

5 byte salvati grazie a Neil

È probabile che questo si blocchi per input di grandi dimensioni come nell'esempio Fizz Buzz.

f=([c,...s],a=0)=>c?c=='#'?String.fromCharCode(a%127)+f(s):f(s,a+(c==';')):""

Penso che f(s,a+(c==';'))potrebbe eliminare tre byte dalla tua versione ricorsiva.
Neil,

@Neil In realtà salva 5 byte. :-)
Arnauld

Mi sento davvero sciocco ora. Inizialmente avevo una versione con errori e sottratto 2 byte per correggere il bug. Ma avevo contato male e la versione con errori in realtà ha salvato 7 byte ...
Neil

12

Retina , 336 63 67 65 66 62 59 byte

T`;#-ÿ`¯_
;{127}|;+$

(^|¯)
¯
+T`-~`_-`[^¯]
T\`¯`

Provalo online!

Versione leggibile usando un'ipotetica sintassi di escape:

T`;#\x01-ÿ`\x01¯_
;{127}|;+$

(^|¯)\x01\x01
¯\x02
+T`\x01-~`_\x03-\x7f`[^\x01¯]\x01
T\`¯`

Non stampa byte NUL, perché TIO non li consente nel codice sorgente. Stampa anche una nuova riga alla fine, ma immagino che non possa fare diversamente. Newline finale soppressa grazie a @Leo .

-273 (!) Byte grazie a @ETHproductions .

-2 byte grazie a @ovs .

-3 byte grazie a @Neil . Dai un'occhiata alla loro meravigliosa soluzione a 34 byte .


1
Oh mia parola Ma non puoi salvare mille byte con +T`\x01-~`_\x03-\x7f`[^\x01¯]\x01? (compresi gli non stampabili come singoli caratteri, ovviamente)
ETHproductions

@ETHproductions Certo che puoi. Grazie! :)
eush77,

1
Attualmente l'ultima lettera è sempre nell'output, anche se non vi è alcun trascinamento #nell'input. Puoi sistemarlo cambiando il tuo secondo stadio in(;{127}|;+$)
ovs

1
Ti serve il + `sulla terza riga? Quando rimuovi l'intera corrispondenza, non dovrebbe essere rimasto nulla da sostituire nella seconda iterazione.
Ovs,

1
Penso di poterlo fare in 34 byte: T`;#\x01-ÿ`\x80\x7F_ \x80+$(riga vuota) \+T`\x7Fo`\x01-\x80_`\x80[^\x80](usando escape esadecimali per rappresentare non stampabili). Output \ x7F anziché null.
Neil,

12

Java 8, 100 byte

s->{int i=0;for(byte b:s.getBytes()){if(b==59)i++;if(b==35){System.out.print((char)(i%127));i=0;}}};

Provalo online!


3
Benvenuti nel sito! :)
DJMcMayhem

Ho aggiunto un link a un interprete online con l'esempio FizzBuzz per te (il testo del link era troppo lungo per adattarsi a un commento)
Jonathan Allan,

Java utilizza UTF-16 per i suoi programmi . Quindi, questi non sono 100 byte ma 100 caratteri .
G.Broser dice di reintegrare Monica

5
@GeroldBroser Unicode è un set di caratteri: UTF-8 e UTF-16 sono due codifiche di quel set di caratteri. Il sorgente ASCII è perfettamente valido come programma Java e ho molti file sorgente Java codificati in ASCII (che è anche valido UTF-8, quindi anche una codifica Unicode).

1
Interamente golfato, per 81 byte come Consumer<char[]>:s->{char i=0;for(int b:s){if(b==59)i++;if(b==35){System.out.print(i%=127);i=0;}}}
Olivier Grégoire

11

Japt , 18 byte

®è'; %# d}'# ë ¯J

Dopo c'è un carattere \ x7f non stampabile %#. Provalo online!

Come funziona

®   è'; %#   d}'# ë ¯  J
mZ{Zè'; %127 d}'# ë s0,J
                         // Implicit: operate on input string
mZ{           }'#        // Split the input at '#'s, and map each item Z to
   Zè';                  //   the number of semicolons in Z,
        %127             //   mod 127,
             d           //   turned into a character.
m              '#        // Rejoin the list on '#'. At this point the Hello, World! example
                         // would be "H#e#l#l#o#,# #W#o#r#l#d#!#" plus an null byte.
                  ë      // Take every other character. Eliminates the unnecessary '#'s. 
                    ¯J   // Slice off the trailing byte (could be anything if there are
                         // semicolons after the last '#').
                         // Implicit: output result of last expression

1
D'oh, avrei dovuto controllare le risposte! Ho appena trascorso un po 'di tempo su questo solo per scoprire che mi hai battuto a pugni. q'# ®è'; u# dì¯Jfunziona anche per lo stesso punteggio.
Shaggy,

11

Python , 65 byte

Questo è un golf di questa risposta precedente.

lambda t:''.join(chr(x.count(';')%127)for x in t.split('#')[:-1])

Provalo online! python2

Provalo online! python3

Spiegazione

Questa è una risposta piuttosto semplice, determiniamo quanti ;s sono tra ciascuno #e stampiamo la chrmod 127. L'unica cosa che potrebbe essere un po 'strana è la [:-1]. Dobbiamo eliminare l'ultimo gruppo perché non ci sarà più #dopo.

Per esempio

;;#;;;;#;;;;;#;;;

Sarà suddiviso in

[';;',';;;;',';;;;;',';;;']

Ma non vogliamo l'ultimo ;;;perché non c'è nessun #dopo per stampare il valore.


1
Ero impegnato a cercare di ottenere tutti i test in un collegamento TIO. Era chr per chr tranne te x.
Jonathan Allan,

9

> <> , 35 byte

>i:0(?;:'#'=?v';'=?0
^   [0o%'␡'l~<

Provalo online! Sostituisci con 0x7F ^?o "elimina".

Anello principale

>i:0(?;:'#'=?v      
^            <

Questo prende un carattere di input ( i), controlla se è minore di zero, cioè EOF ( :0() e termina il programma se è ( ?;). Altrimenti, controlla se l'ingresso è uguale a #( :'#'=). In tal caso, diramare verso il basso e riavviare il ciclo ( ?v... ^ ... <).

Contro logica

              ';'=?0
              

Controlla se l'ingresso è uguale a ;( ';'=). In tal caso, premere a 0. Altrimenti, non fare nulla. Questo riavvia il ciclo principale.

Logica di stampa

>       '#'=?v      
^   [0o%'␡'l~<

Quando il carattere di input è #, ~fai uscire l'input dallo stack ( ), ottieni il numero di membri sullo stack ( l), premi 127 ( '␡') e prendi il modulo ( %). Quindi, emettilo come carattere ( o) e avvia un nuovo stack ( [0). Questo "azzera" il contatore. Quindi, il ciclo si riavvia.


3
Scarso> <>. È triste :0(:(
caird coinheringaahing

9

Python 3, 69 byte

Migliorato, grazie a @Wheat Wizard, @Uriel

print(''.join(chr(s.count(';')%127)for s in input().split('#')[:-1]))

3
Benvenuti in Puzzle di programmazione e Code Golf! L'obiettivo qui è rendere il codice il più breve possibile (in byte), quindi è necessario includere il conteggio dei byte nell'intestazione :).
Adnan,

Grazie per aver spiegato, non lo sapevo. Ci lavorerò allora.
MrGeek,

2
È possibile rimuovere lo spazio dopo la :s.
Pavel,

1
Conto 74 byte. tio.run/nexus/…
Dennis

2
Inoltre, ';'==csalva uno spazio, ma non usare affatto le ifistruzioni sarebbe ancora più breve.
Dennis,

9

Röda , 44 39 38 byte

5 byte salvati grazie a @fergusq

{(_/`#`)|{|d|d~="[^;]",""chr #d%127}_}

Provalo online!

Funzione anonima che accetta l'input dal flusso.


Se non è necessario ignorare altri personaggi, ottengo questo:

Röda , 20 byte

{(_/`#`)|chr #_%127}

8

Rubino, 41 35 34 caratteri

( 40 34 33 caratteri codice + 1 carattere opzione riga di comando)

gsub(/.*?#/){putc$&.count ?;%127}

Grazie a:

  • Giordania per aver suggerito di usare putcper non aver bisogno di una conversione esplicita con .chr(6 caratteri)
  • Kirill L. per aver trovato la parentesi non necessaria (1 carattere)

Esecuzione di esempio:

bash-4.4$ ruby -ne 'gsub(/.*?#/){putc$&.count ?;%127}' < '2d{.;#' | od -tad1
0000000    2  etb    d  nul  nul  nul  nul    {  nul  nul  nul
          50   23  100    0    0    0    0  123    0    0    0
0000013

Provalo online!


Doh. Anche se ho fatto C nei miei primi anni, mi ero completamente dimenticato putc(). Grazie, @Jordan
manatwork

1
Con mia sorpresa, puoi effettivamente rilasciare le parentesi dopo il conteggio per salvare un byte
Kirill L.

Bella cattura, @KirillL., Grazie.
arte

7

05AB1E , 16 15 14 byte

Codice:

'#¡¨ʒ';¢127%ç?

Spiegazione:

'#¡              # Split on hashtags
   ¨             # Remove the last element
    ʒ            # For each element (actually a hacky way, since this is a filter)
     ';¢         #   Count the number of occurences of ';'
        127%     #   Modulo by 127
            ç    #   Convert to char
             ?   #   Pop and print without a newline

Utilizza la codifica 05AB1E . Provalo online!


7

Gelatina , 13 byte

ṣ”#Ṗċ€”;%127Ọ

Provalo online!

Come funziona

ṣ”#Ṗċ€”;%127Ọ  Main link. Argument: s (string)

ṣ”#            Split s at hashes.
   Ṗ           Pop; remove the last chunk.
    ċ€”;       Count the semicola in each chunk.
        %127   Take the counts modulo 127.
            Ọ  Unordinal; cast integers to characters.

1
La parola semicolanon esiste, lo è semicolons.
Erik the Outgolfer,


Hmm, strana parola.
Erik the Outgolfer,

@EriktheOutgolfer Qualcuno su Wikizionario probabilmente stava cercando di rendere il plurale latino valido il in inglese, ma gli errori di ortografia di cola e semicola dovrebbero essere vietati .
Cor

7

codice macchina x86 su MS-DOS - 29 byte

00000000  31 d2 b4 01 cd 21 73 01  c3 3c 3b 75 06 42 80 fa  |1....!s..<;u.B..|
00000010  7f 74 ed 3c 23 75 eb b4  02 cd 21 eb e3           |.t.<#u....!..|
0000001d

Assemblaggio commentato:

bits 16
org 100h

start:
    xor dx,dx       ; reset dx (used as accumulator)
readch:
    mov ah,1
    int 21h         ; read character
    jnc semicolon
    ret             ; quit if EOF
semicolon:
    cmp al,';'      ; is it a semicolon?
    jne hash        ; if not, skip to next check
    inc dx          ; increment accumulator
    cmp dl,127      ; if we get to 127, reset it; this saves us the
    je start        ; hassle to perform the modulo when handling #
hash:
    cmp al,'#'      ; is it a hash?
    jne readch      ; if not, skip back to character read
    mov ah,2        ; print dl (it was choosen as accumulator exactly
    int 21h         ; because it's the easiest register to print)
    jmp start       ; reset the accumulator and go on reading

6

05AB1E , 25 21 19 byte

-2 byte grazie ad Adnan

Îvy';Q+y'#Qi127%ç?0

Spiegazione:

Î                       Initialise stack with 0 and then push input
 v                      For each character
  y';Q+                 If equal to ';', then increment top of stack
       y'#Qi            If equal to '#', then
            127%        Modulo top of stack with 127
                ç       Convert to character
                 ?      Print without newline
                  0     Push a 0 to initialise the stack for the next print

Provalo online!


1
Penso che puoi sostituirlo i>}con +.
Adnan,

6

Retina , 34 byte

T`;#-ÿ`_
\+T`o`-_`[^]|$

Provalo online! Include test case. Modifica: salvato 2 byte con l'aiuto di @MartinEnder. Nota: il codice include non stampabili e l'utilizzo di &#x;codici genera risultati errati poiché il browser utilizza Windows-1252 anziché ISO-8859-1. Spiegazione: La prima riga pulisce l'input: ;viene modificato in \x80, #in \x7F(a causa delle limitazioni del TIO) e tutto il resto viene eliminato. Quindi ogni volta che vediamo un \x80non prima di un altro \x80, lo eliminiamo e incrementiamo ciclicamente il codice di ogni carattere successivo. Questo è ripetuto fino a quando non ce ne sono più . Con fughe per la leggibilità:\x80 caratteri. Il codice originale che supporta byte nulli sottrae sostanzialmente 1 dai byte non stampabili, tranne nella prima riga dove \xFFè invariato e \x7Fdiventa\x00

T`;#\x00-\xFF`\x7F\x00_
\+T`\x7Eo`\x00-\x7F_`\x7F[^\x7F]|\x7F$

È possibile salvare un byte combinando le ultime due fasi con \x80([^\x80]|$)nell'ultima fase.
Martin Ender,

@MartinEnder Grazie! In modo fastidioso, \s+T`\x7Fo`\x01-\x80_`\x80(?!\x80).?salva anche solo un byte.
Neil,

Ah, ma [^\x80]|\x80$salva due byte, credo.
Neil,

Ah bello, sì, l'ultimo funziona. Avevo anche provato lo sguardo negativo, ma sè fastidioso.
Martin Ender,

6

R, 97 90 86 84 byte

Una funzione:

function(s)for(i in utf8ToInt(s)){F=F+(i==59);if(i==35){cat(intToUtf8(F%%127));F=0}}

All'avvio di R, Fviene definito come FALSE(numerico 0).

Ungolfed:

function (s)
    for (i in utf8ToInt(s)) {
        F = F + (i == 59)
        if (i == 35) {
            cat(intToUtf8(F%%127))
            F = 0
        }
    }

Questo non dovrebbe essere R + pryr?
L3viathan,

@ L3viathan Poiché pryrè un pacchetto R, è ancora codice R.
Sven Hohenstein,

È il codice R, ma richiede l'installazione di una libreria aggiuntiva.
L3viathan,

@ L3viathan Pensi che la mia risposta non sia valida? Devo evitare l'uso di pacchetti aggiuntivi?
Sven Hohenstein,

2
@BLT Non c'è differenza. A mio avviso, non è un problema utilizzare pacchetti aggiuntivi creati prima della sfida. Questo è vero per tutte le lingue. In Python devi usare importmentre in R puoi usare ::per accedere direttamente alla funzione nei pacchetti. Qui puoi vedere spesso l'uso di pacchetti aggiuntivi (ad esempio, per Python e Java). Tuttavia, ho cambiato il mio precedente post perché non voglio impegnarmi in una discussione.
Sven Hohenstein,

5

Python, 82 byte

lambda t:''.join(chr(len([g for g in x if g==';'])%127)for x in t.split('#')[:-1])

1
@WheatWizard poiché hai già pubblicato questo come risposta, credo che l'azione giusta per me sarebbe quella di votarlo invece di aggiornarlo
Uriel

4

TeX semplice, 156 byte

\newcount\a\def\;{\advance\a by 1\ifnum\a=127\a=0\fi}\def\#{\message{\the\a}\a=0}\catcode`;=13\catcode35=13\let;=\;\let#=\#\loop\read16 to\>\>\iftrue\repeat

Leggibile

\newcount\a

\def\;{
  \advance\a by 1
  \ifnum \a=127 \a=0 \fi
}
\def\#{
  \message{\the\a}
  \a=0
}

\catcode`;=13
\catcode35=13

\let;=\;
\let#=\#

\loop
  \read16 to \> \>
  \iftrue \repeat

Può stampare caratteri simbolicamente?
eush77,


4

Perl, 25 byte

$_=chr(y%;%%%127)x/#/

Esegui con perl -043pe(contato come 4 byte, poiché perl -eè standard).

Spiegazione: -043imposta il terminatore di linea su #(ASCII 043). -pscorre le "linee" di input (in realtà stringhe # -delimate, ora). y%;%%conta il numero di ;in ogni "linea". x/#/si assicura che non stampiamo un carattere aggiuntivo per i programmi che non finiscono con un # (come il terzo testcase). %127dovrebbe essere abbastanza ovvio. $_=è la solita caldaia.


Impressionarne uno, anche se c'è un problema tecnico: ;;#;;;perché genera # 5 anziché # 2.
arte

Come hai ottenuto questo risultato? echo -n ';;#;;;' | perl -043pe '$_=chr(y%;%%%127)x/#/' | xxdemette correttamente 00000000: 02sulla mia macchina. Se hai interrotto 043o stai utilizzando una tabella codici in cui #non è ASCII 043, ciò spiegherebbe il tuo risultato.
Grimmy,

1
Ops. Scusa, ho avuto un refuso nel mio test. Il tuo codice funziona perfettamente.
arte

4

CJam, 27 byte

0q{";#"#") 127%co0 "S/=~}%;

Spiegazione:

0                            e# Push 0
 q                           e# Push the input
  {                          e# For each character in the input:
   ";#"#                     e#   Index of character in ";#", -1 if not found
        ") 127%co0 "S/       e#   Push this string, split on spaces
                      =      e#   Array access (-1 is the last element)
                       ~     e#   Execute as CJam code. ")" increments the accumulator,
                             e#     and "127%co0" preforms modulo by 127, converts to character, pops and outputs, and then pushes 0.
                        }%   e# End for
                          ;  e# Delete the accumulator

Soluzione alternativa, 18 byte

q'#/);{';e=127%c}%

Spiegazione:

q                   e# Read the whole input
 '#/                e# Split on '#'
    );              e# Delete the last element
      {             e# For each element:
       ';e=         e#   Count number of ';' in string
           127%     e#   Modulo by 127
               c    e#   Convert to character code
                }%  e# End for

Gatto d'affari che non ignora i caratteri non validi.
Esolanging Fruit,

perché è necessario ;eliminare l'accumulatore?
caird coinheringaahing

@RandomUser Quindi non finisce per essere emesso alla fine con la stringa.
ETHproductions

4

F #, 79 91 93 byte

let rec r a=function|[]->()|';'::t->r(a+1)t|'#'::t->printf"%c"(char(a%127));r 0 t|_::y->r a y

Ungolfed

let rec run acc = function
    | [] -> ()
    | ';'::xs ->
        run (acc + 1) xs
    | '#'::xs ->
        printf "%c" (char(acc % 127))
        run 0 xs
    | x::xs -> run acc xs

Provalo online!

Modifica: stava trattando qualsiasi altro carattere diverso da ';' come '#'. Modificato in modo che ignori i caratteri non validi.

Alternativa

F #, 107 104 byte

let r i=
 let a=ref 0
 [for c in i do c|>function|';'->a:=!a+1|'#'->printf"%c"(!a%127|>char);a:=0|_->()]

L'uso della cella di riferimento consente di risparmiare 3 byte

Ungolfed

let run i =
    let a = ref 0;
    [for c in i do
        match c with
        | ';' -> a := !a + 1
        | '#' ->
            printf "%c" (char(!a % 127))
            a := 0
        |_->()
    ]

Provalo online


4

Processing.js (versione Khanacademy), 118 byte

var n="",a=0;for(var i=0;i<n.length;i++){if(n[i]===";"){a++;}if(n[i]==="#"){println(String.fromCharCode(a%127));a=0;}}

Provalo online!

Poiché la versione di elaborazione utilizzata non ha alcun metodo di input, l'input viene inserito in n.


Potresti tecnicamente forgiare il tuo metodo di input con keyTyped=function(){ ... }: P
ETHproductions

@ETHproductions Questo è uno sguardo di disgusto.
Christopher,

@RandomUser yay! L'ho fatto! Mi piace rispondere in Elaborazione (controlla le mie risposte)
Christopher,

2
@RandomUser Non solo 1000 rep .. ma 2 ^ 10 rep (͡ ° ͜ʖ ͡ °)

@Midnightas Ohhh yeah
Christopher

4

Labyrinth , 61 47 byte

_36},)@
;    {
; 42_-
"#-  1
_ ; 72
_ ) %
"""".

Provalo online!

Spiegazione

immagine con codice colore del codice soluzione

L'esecuzione del codice inizia nell'angolo in alto a sinistra e il primo punto e virgola scarta uno zero implicito dallo stack e continua verso destra.

arancia

  • _36spinge 36 nella pila. Questo serve per confrontare l'input con#
  • } sposta la parte superiore della pila nella pila secondaria
  • , spinge il valore intero del personaggio nello stack
  • )incrementa lo stack (se è la fine dell'input, questo renderà lo stack 0 e il flusso del programma procederà @all'uscita e uscirà )
  • { sposta la parte superiore della pila secondaria nella parte superiore della pila principale
  • -pop y, pop x, premi x - y. Questo serve per confrontare l'input con #(35 in ascii). Se l'input era #il codice continuerà alla sezione viola (poiché la parte superiore dello stack è 0, l'IP continua nella direzione in cui si stava muovendo prima), altrimenti continuerà alla sezione verde.

Viola

  • 127 spingere 127 nello stack
  • % pop x, pop y, premi x% y
  • . pop la parte superiore della pila (l'accumulatore) e l'output come personaggio

Da qui il codice grigio ci porta nell'angolo in alto a sinistra del programma senza nulla in pila.

verde

  • _24 spingere 24 sulla pila
  • -pop x, pop y, premi xy. 24 è la differenza tra #e ;quindi questo controlla se l'input era ;. Se fosse ;il codice continua dritto verso ). Altrimenti passerà al valore #che spinge l'altezza dello stack (sempre un numero positivo, costringendo il programma a girare a destra al prossimo incrocio e perdere il codice che aumenta l'accumulatore)
  • ; scartare la parte superiore della pila
  • ) incrementare la parte superiore dello stack che è uno zero implicito oppure è uno zero precedentemente incrementato che funge da accumulatore per l'output

Da qui il codice grigio ci porta nell'angolo in alto a sinistra del programma con lo stack con solo l'accumulatore su di esso.

Grigio

Le virgolette sono no-op, _inserisce uno 0 nello stack e ;scarta la parte superiore dello stack. Tutto questo è solo un codice per forzare il flusso di controllo nel modo giusto e scartare qualsiasi cosa in più dalla cima dello stack.


Per curiosità, come hai generato l'immagine esplicativa? L'hai creato tu stesso?
Stefnotch,

2
@Stefnotch, ho usato un editor di testo per mettere una scheda tra ogni carattere e poi ho incollato il codice in Microsoft Excel che ha messo ciascun carattere nella sua cella. Ho selezionato tutte le celle per dare loro uguale larghezza e altezza. Quindi ho regolato i colori e i bordi e ho preso uno screenshot.
Robert Hickman,

3

MATL , 29 byte

';#'&mXz!"@o?T}vn127\c&YD]]vx

L'input è una stringa racchiusa tra virgolette singole.

Provalo online!

Il programma FizzBuzz è troppo lungo per gli interpreti online; vederlo funzionare offline in questo gif:

inserisci qui la descrizione dell'immagine

Spiegazione

Il valore dell'accumulatore viene implementato come numero di elementi nello stack. Ciò rende il programma più lento rispetto a se il valore dell'accumulatore fosse un singolo numero nello stack, ma salva alcuni byte.

';#'       % Push this string
&m         % Input string (implicit). Pushes row vector array of the same size with 
           % entries 1, 2 or 0 for chars equal to ';', '#' or others, respectively
Xz         % Remove zeros. Gives a column vector
!          % Transpose into a row vector
"          % For each entry
  @        %   Push current entry
  o?       %   If odd
    T      %     Push true. This increases the accumulator (number of stack elements)
  }        %   Else
    v      %     Concatenate stack into a column vector
    n      %     Number of elements
    127\   %     Modulo 127
    c      %     Convert to char
    &YD    %     Display immediately without newline
  ]        %   End
]          % End
vx         % Concatenate stack and delete. This avoids implicit display

3

Alice , 22 byte

I!?';-n+?h$'@u%?'#-n$O

Provalo online!

Spiegazione

Manteniamo in pila solo un singolo contatore di quanti ;ne abbiamo incontrati. Quando lo stack è vuoto (ad es. All'inizio del programma), questo è implicitamente uno 0.

I!?';-n+?h$'@u%?'#-n$O
I                      Push codepoint of next char from input
 !?                    store it on the tape and reload it right away
   ';-n+               add 1 to the counter if this char is a semicolon,
                       0 otherwise
        ?h$'           If the input char was -1 (EOF) execute the next command,
                       otherwise push its codepoint
            @          Terminate the program (or push 64)
             u         Set all bits up to the most significant as equal to 1
                       this turns 64 (1000000b) into 127 (1111111b)
              %        Compute modulo
               ?       reload the input char from the tape
                '#-n$O if it is a hash, pop the counter and print
                       the corresponding character
                       wrap back to the start of the line

Una versione più breve ma non terminante di questo programma è disponibile qui .



Ci scusiamo per la formattazione errata, l'ho postato dal mio telefono, lo riparerò non appena avrò le mani su un pc
Leo

I programmi devono terminare se non diversamente specificato nella sfida.
Martin Ender,

È possibile salvare un byte utilizzando uno 0x7F letterale invece di ~hperò.
Martin Ender,

@MartinEnder ha terminato. Non sono riuscito a inserire uno 0x7F nel codice, ma penso che questa modifica alternativa sia comunque più interessante :)
Leo,

3

JS (ES6), 97 92 byte

c=>(a=0,y="",c.split``.map(x=>x=="#"?(a%=127,y+=String.fromCharCode(a),a=0):x==";"?a++:0),y)

Ho cercato di adottare un approccio diverso rispetto alla risposta di Shaggy . Oh bene.


3

; # + , 59 byte, non competitivo

La lingua è stata creata dopo questa sfida.

;;;;;~+++++++>~;~++++:>*(~<:-+!(<-;->(;))::<+-::!(<#>)-:-*)

Provalo online! L'input termina con un byte nullo.

Spiegazione

La generazione è la stessa di Generate; # codice risposta . L'unica differenza qui è l'iterazione.

Iterazione

*(~<:-+!(<-;->(;))::<+-::!(<#>)-:-*)
*(                                *)   take input while != 0
  ~                                    swap
   <                                   read value from memory (;)
    :                                  move forward to the accumulator memory spot (AMS)
     -                                 flip Δ
      +                                subtract two accumulators into A
       !                               flip A (0 -> 1, else -> 0)
        (     (;))                     if A is nonzero, or, if A == ';'
         <                             read from AMS
          -;-                          increment
             >                         write to AMS
                  ::                   move to cell 0 (#)
                    <                  read value from memory (#)
                     +                 subtract two accumulators into A
                      -                flip Δ
                       ::              move to AMS
                         !(   )        if A == '#'
                           <           read from AMS
                            #          output mod 127, and clear
                             >         write to AMS
                               -:-     move back to initial cell

3

Bash + coreutils, 46 39 byte

tr -dc \;#|sed 'y/;/1/;s/#/.ZC7%P/g'|dc

Provalo online!

Spiegazione

(Grazie Cows Quack per -7 byte!)

La trporzione rimuove tutti i caratteri estranei (potrei inserirlo sedesattamente nello stesso byte, ma poi non gestisce correttamente il carattere di avanzamento riga, dal momento sedche li lascia entrare e dcarriva solo al primo avanzamento riga ?)

sedprende il resto e costruisce un dcprogramma:

Stringhe di ;diventano stringhe di 1(un lungo letterale)

#diventa .ZC7%P(se segue una stringa di 1, .è un punto decimale per un no-op. Ma se è all'inizio del programma, o seguendo un altro #, è un valore letterale 0. Quindi prende la lunghezza del numero, lo modifica, e stampa l'ASCII corrispondente.)


Non è necessario per sfuggire alla ;parte interna '...'e può semplicemente cambiare dc -ez?a dc. Oltre a ciò, invece di ;aggiungere 1 allo stack, puoi raggrupparli e ottenere la loro lunghezza usando Zper raggiungere questo tio.run/##S0oszvj/… .
Kritixi Lithos,

@Cowsquack Bene, grazie! (ed è dc -ez?stata una conseguenza della necessità di avere uno zero in più per avviare il programma) Ma il tuo programma aggiunge un output aggiuntivo stderrin entrambi i casi consecutivi #o di input che non termina con #(in entrambi i casi, intendo dopo che i caratteri estranei sono stati rimossi) . Non so se esiste un consenso, ma sento che l'output aggiuntivo invalida la soluzione. Tuttavia, ho adattato la tua idea e ho chiuso a un solo byte in più del tuo suggerimento senza dclanciare errori!
Sophia Lechner,

Secondo questo stderr può essere ignorato a meno che la sfida non lo dichiari esplicitamente come tale, quindi è molto utile per dc. Si noti inoltre che questa soluzione attuale non riesce con #s consecutivi a causa Zdi 0è 1, quindi genera 0x01 anziché 0x00 (anch'io sono caduto nella stessa trappola, ma il mio browser visualizza non stampabili come i loro codici esadecimali, quindi l'ho colto).
Kritixi Lithos,

3

C, 65 64 60 byte

(-2 grazie a ceilingcat)

c;f(char*s){for(c=0;*s;s++)c+=*s-35?*s==59:-putchar(c%127);}

Dovrai inizializzare ca zero per rendere riutilizzabile la funzione .
Conor O'Brien,

@ ConorO'Brien Fixed. Sfortunatamente non sono riuscito a trovare qualcosa di più breve del semplice aggiungere in c=0, e non vorrei imbrogliare copiando dalla risposta di Dennis.
hvd,

@ceilingcat Grazie ancora, sono stato in grado di rimuovere altri tre byte dopo quello. Questo usa un trucco nella risposta di Dennis (controllato dopo la modifica), ma questa volta è passato così tanto tempo che me ne sono dimenticato tutto e me ne sono inventato da solo.
hvd,
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.