Interprete di manipolazione delle stringhe


11

Sommario

È stato creato un nuovo linguaggio di manipolazione delle stringhe, usando solo i caratteri $+#-!*|@>! Il tuo compito è implementare un interprete per il minor numero di byte possibile.

Ingresso

Una stringa, che è una singola riga di questa lingua. Questo può essere preso in qualsiasi modo ragionevole (stdin, parametro di funzione, argomento della riga di comando ecc.) O come variabile predefinita. Se il programma richiede input utente, accetta tutti gli input utente richiesti da stdin e nient'altro, vedi sotto. Puoi presumere che sia un programma valido.

Produzione

Qualunque sia la lingua prodotta, le specifiche di seguito. È necessario generare una stringa, in qualsiasi modo ragionevole (stdout, output di funzione, ecc.) O un valore variabile. Quando la lingua viene emessa in modo esplicito, questo deve passare a stdout. Le scappatoie standard sono vietate.

Specifiche linguistiche

Elaborazione e sintassi

Il linguaggio ha una forma molto semplice di elaborazione in quanto esegue solo la manipolazione di stringhe: inizia con una stringa vuota ( "") e la modifica con ogni termine. Un termine è composto da una o due parti: una funzione (sotto) seguita eventualmente da un parametro (sotto), che modifica il suo comportamento. I termini sono separati da pipe ( |). Puoi presumere che non sarà un programma vuoto e nessun termine sarà vuoto. Dovresti emettere il valore alla fine del programma.

funzioni

La lingua ha solo 6 funzioni, come mostrato di seguito. Ogni funzione accetta uno o zero parametri.

  • + concatena le stringhe (accetta un parametro stringa, lo concatena al valore corrente)
  • ! inverti l'ordine dei caratteri del valore corrente (nessun parametro)
  • * ripeti la stringa (accetta un parametro intero, ripete il valore corrente più volte)
  • - rimuove tutte le occorrenze di un valore (accetta un parametro stringa, rimuove tutte le occorrenze di un valore dal valore corrente)
  • $ [pseudo-] mescola casualmente il valore corrente (nessun parametro)
  • <emette il valore corrente su stdout(nessun parametro)

Valori

Questi sono i valori che possono essere passati alle funzioni, rappresentati da regex che li corrisponderebbe:

  • @[^|]*una stringa letterale, incluso qualsiasi carattere diverso da pipe. Potrebbe essere vuoto.
  • #[0-9]+ un intero letterale
  • >la riga successiva di stdin. Se utilizzato con *, converti in intero.

Casi test

╔════════════════════════╤═════════════╤══════════════╗
║code                    │input        │output        ║
╟────────────────────────┼─────────────┼──────────────╢
║+>|!|+@hello|*>         │13           │31hello31hello║
║                        │2            │              ║
╟────────────────────────┼─────────────┼──────────────╢
║+>|+@abcdefg|$          │hello        │hcloeebafdlg  ║
╟────────────────────────┼─────────────┼──────────────╢
║+@how areyou|-@o|->     │w            │h areyu       ║
╟────────────────────────┼─────────────┼──────────────╢
║+@out|<|*#3             │             │out           ║
║                        │             │outoutout     ║
╟────────────────────────┼─────────────┼──────────────╢
║+>                      │what ever 345│what ever 345 ║
╟────────────────────────┼─────────────┼──────────────╢
║+@$pe<i@l|<|-@$pe<i@l|+>│A|$o $pe<!@| │$pe<i@l       ║
║                        │             │A|$o $pe<!@|  ║
╟────────────────────────┼─────────────┼──────────────╢
║<|+>|!|<                │input text   |              ║
║                        │             │txet tupni    ║ 
║                        │             │txet tupni    ║
╟────────────────────────┼─────────────┼──────────────╢
║+@>#                    │             |>#            ║
╚════════════════════════╧═════════════╧══════════════╝

Si noti che il caso di test 2 è casuale, quindi qualsiasi permutazione dei caratteri al suo interno è valida. Inoltre, gli output nella tabella sono separati da nuove righe, ma il tuo programma non deve fare lo stesso. L'ultimo valore in ogni caso è l'output finale.

Interprete python di esempio (senza golf)

Provalo online! IMO meglio se lo esegui tramite IDLE o qualunque cosa tu usi. (L'ho passato a golf a 424 byte dopo, ma sono sicuro che molto si può fare di meglio).


2
Consentire l'input di essere già in una variabile non è standard, così come consentire all'output di essere in una variabile.
— Jonathan Allan,

I tuoi esempi sembrano stampare una riga ogni volta che <si incontrano. È obbligatorio?
— Incarnazione dell'ignoranza il

Il programma avrà nuove righe? Perché se può, invalida la risposta di Chas Brown
— Incarnazione dell'ignoranza il

2
Per le tue domande future, perche evitando ingombranti formati di I / O . Limitare l'input a stdin costa byte extra in alcune lingue e non porta molto alla sfida.
— Arnauld

1
@digEmAll Com'è quello che ho appena aggiunto +@>#? Ho usato anche io #.
— Artemis non si fida ancora del

Risposte:


3

Rubino -palF\| , 146 142 byte

r='';$F.map{|i|x=i[1]!=?>?i[2..-1]:gets.chomp;eval %w[r.reverse! r*=x.to_i 0 $><<r r=r.chars.shuffle*'' r.gsub!x,'' r+=x][i[0].ord*5%11]};$_=r

Provalo online!

La risposta di Python di Port of Chas Brown . Non stampa newline dopo l'output.

Come al solito, la versione 2.6 di Ruby sarà più corta di 2 byte con indicizzazione di intervallo infinito ( i[2..]).


6

R , 287 286 273 269 byte

function(C,x='',`[`=gsub,`!`=intToUtf8,`?`=utf8ToInt){for(k in el(strsplit(C,'\\|'))){B=eval(parse(t='^.'['','(?<=.)>$'['readLines(,1)','[@#](.+)'['"\\1"',k],,T]]));x=switch((?substr(k,1,1))%%13-2,strrep(x,B),paste0(x,B),,B['',x,f=T],!rev(?x),print(x),,!sample(?x))};x}

Provalo online!

  • -1 grazie a @Kirill L.
  • -4 grazie a @Giuseppe

Codice non spiegato e spiegazione:

function(C){                                      # C is the string manipulation expression
  x = ''                                          # initialize x = ''
  tokens = el(strsplit(C,'\\|'))                  # split C by pipe '|'
  for(k in tokens){                               # for each token k
    arg2 = k
    arg2 = gsub('[@#](.+)','"\\1"',k)             # replace @X or #X with "X" (in quotes)
    arg2 = gsub('(?<=.)>$','"readLines(,1)"',
                 arg2,perl=T)                     # replace > with readLines(,1)
    arg2 = gsub('^.','',arg2)                     # remove the first character
    B = eval(parse(t=arg2))                       # evaluate the string : this will be our 
                                                  # second argument B
    A = substr(k,1,1)                             # take the first character : 
                                                  # i.e. the main command (+,-,! etc)
    x = switch(A,                                 # switch on the main command, execute the 
            '+'=paste0(x,B),                      # corresponding expression and 
            '!'=intToUtf8(rev(utf8ToInt(x))),     # store the result into x
            '*'=strrep(x,B),                      # Note: in the actual code we switch on
            '-'=B['',x,f=T],                      # the utf8 value MOD 13-2 of the command
            '$'=intToUtf8(sample(utf8ToInt(x))),
            '<'=print(x)
        )
    }
    x                                             # return x (and print it implicitly)
}

3

Python 2 , 215 219 209 208 byte

from random import*
I=raw_input;o=''
for t in I().split('|'):p=t[1:]=='>'and I()or t[2:];exec"o=o[::-1] o*=int(p) 0 print(o) o=''.join(sample(o,len(o))) o=o.replace(p,'') o+=p".split()[ord(t[0])*5%11]
print o

Provalo online!

-4 perché raw_inputè richiesto.

9 byte grazie a Embodiment of Ignorance ; 1 byte solo da Ascii .


Gli input diversi dal programma devono provenire da stdin, come specificato nella domanda.
— Artemis non si fida ancora del

Uso Python 3, ma per quanto ne sapevo, richiede l'utilizzo dell'input raw_input. Correggimi se sbaglio ..
— Artemis non si fida ancora del

Secondo i documenti di Py 2.7: input([prompt])Equivalente a eval (raw_input (prompt)). Questa funzione non rileva errori dell'utente. Se l'input non è sintatticamente valido, verrà generato un SyntaxError.
— Artemis non si fida ancora del

Quindi, il problema che stai sollevando è qualcosa di simile qui , in cui le stringhe di input dovrebbero essere citate - piuttosto che non quotate come in una situazione di "vero" stdin. Ancora una volta, di solito le regole I / O sono un po 'lassiste; ma lo modificherò.
— Chas Brown,

Grazie per aver cambiato. Puoi salvare alcuni byte cambiando in Python 3 e usando il tuo vecchio codice + 3 byte tra parentesi, ma ... +1 comunque
— Artemis non si fida ancora del


1

Perl 5 -MList::Util=shuffle -pF/\|/ , 220 217 210 183 byte

map{$,=s/..//r;$\=reverse$\if/^!/;$,ne""||chomp($,=<>),$\=~s/\Q$,//g if/^-/;say$\if/^</;$\=join"",shuffle$\=~/./g if/^\$/;$\.=$,eq""?<>=~s/\n//r:$,if/^\+/;$\x=$,eq""?<>:$,if/^\*/}@F}{

Provalo online!


1

Javascript, 292 267 byte

f=(p)=>{c='';p.split`|`.map(l=>{v=l.substr(2);v=l[1]=='#'?parseInt(v):l[1]=='>'?prompt():v;c={'+':_=>c+v,'-':_=>c.split(v).join``,'*':_=>c.repeat(v),'$':_=>[...c].sort(_=>.5-Math.random()).join``,'!':_=>[...c].reverse().join``,'<':_=>alert(c)||c}[l[0]]();});return c}

JSFiddle


Il caso di test 6 non funziona del tutto ...
— Artemis non si fida ancora del

1
@ArtemisFowl, grazie, il regex non funzionava correttamente e il passaggio a split..join ha salvato un paio di byte.
— Johan du Toit,
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.