Interpreter Manipulasi String

11

Ringkasan

Bahasa manipulasi string baru telah dibuat, hanya menggunakan karakter $+#-!*|@>! Tugas Anda adalah mengimplementasikan juru bahasa untuk itu dalam sesedikit mungkin byte.

Memasukkan

String, yang merupakan satu baris dari bahasa ini. Ini dapat diambil dengan cara yang masuk akal (stdin, parameter fungsi, argumen baris perintah, dll.), Atau sebagai variabel yang telah ditentukan. Jika program meminta input pengguna, terima semua input pengguna yang diminta dari stdin dan tidak lebih, lihat di bawah. Anda dapat menganggap itu adalah program yang valid.

Keluaran

Apapun bahasa yang akan ditampilkan, spesifikasi di bawah ini. Anda harus mengeluarkan string, dengan cara apa pun yang masuk akal (stdout, keluaran fungsi, dll.), Atau nilai variabel. Saat bahasa dikeluarkan secara eksplisit, ini harus menuju ke stdout. Celah standar dilarang.

Spesifikasi Bahasa

Pemrosesan dan Sintaks

Bahasa ini memiliki bentuk pemrosesan yang sangat sederhana karena hanya memanipulasi string: dimulai dengan string kosong ( ""), dan mengubahnya dengan setiap istilah. Suatu istilah terdiri dari satu atau dua bagian: fungsi (di bawah) diikuti oleh kemungkinan parameter (di bawah), yang mengedit perilakunya. Ketentuan dipisahkan oleh pipa ( |). Anda mungkin menganggap itu bukan program yang kosong, dan tidak ada istilah yang kosong. Anda harus menampilkan nilai di akhir program.

Fungsi

Bahasa hanya memiliki 6 fungsi, seperti yang ditunjukkan di bawah ini. Setiap fungsi dapat menerima satu atau nol parameter.

  • + concatenate strings (mengambil satu parameter string, menggabungkannya ke nilai saat ini)
  • ! membalikkan urutan karakter dari nilai saat ini (tanpa parameter)
  • * ulangi string (ambil satu parameter integer, ulangi nilai saat ini yang berkali-kali)
  • - menghapus semua kemunculan suatu nilai (mengambil satu parameter string, menghapus semua kemunculan dari nilai saat ini)
  • $ [pseudo-] mengacak nilai saat ini secara acak (tanpa parameter)
  • <output nilai saat ini ke stdout(tanpa parameter)

Nilai-nilai

Ini adalah nilai-nilai yang dapat diteruskan ke fungsi, diwakili oleh regex yang akan cocok dengan mereka:

  • @[^|]*string literal, termasuk karakter apa pun selain pipa. Mungkin kosong.
  • #[0-9]+ sebuah literal integer
  • >baris berikutnya stdin. Jika digunakan dengan *, konversikan ke integer.

Uji Kasus

╔════════════════════════╤═════════════╤══════════════╗
║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    ║
╟────────────────────────┼─────────────┼──────────────╢
║+@>#                    │             |>#            ║
╚════════════════════════╧═════════════╧══════════════╝

Perhatikan bahwa test case 2 adalah acak, sehingga permutasi karakter di dalamnya valid. Juga, output dalam tabel dipisahkan oleh baris baru, tetapi program Anda tidak harus melakukan hal yang sama. Nilai terakhir dalam setiap kasus adalah hasil akhir.

Contoh (Un-golfed) juru bahasa python

Cobalah online! IMO lebih baik jika Anda menjalankannya melalui IDLE atau apa pun yang Anda gunakan. (Saya menurunkannya menjadi 424 byte setelahnya, tapi saya yakin Anda bisa melakukan lebih baik).

Artemis masih tidak percaya pada SE
sumber
2
Mengizinkan input sudah ada dalam variabel adalah tidak standar, seperti halnya memungkinkan output berada dalam satu variabel.
Jonathan Allan
Contoh Anda tampaknya mencetak baris baru setiap kali <ditemukan. Apakah ini wajib?
Perwujudan Ketidaktahuan
Akankah program memiliki baris baru di dalamnya? Karena jika itu bisa, itu membatalkan jawaban Chas Brown
Perwujudan Ketidaktahuan
2
Untuk pertanyaan Anda di masa mendatang, harap pertimbangkan untuk menghindari format I / O yang rumit . Membatasi input ke stdin membutuhkan byte tambahan dalam beberapa bahasa dan tidak membawa banyak tantangan.
Arnauld
1
@digEmAll Bagaimana yang baru saja saya tambahkan +@>#,? Saya #juga menggunakan .
Artemis masih tidak percaya

Jawaban:

3

Ruby -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

Cobalah online!

Port of Chas Brown menjawab Python . Tidak mencetak baris baru setelah keluaran.

Seperti biasa, versi Ruby 2.6 akan lebih pendek 2 byte dengan pengindeksan rentang tanpa akhir ( i[2..]).

Kirill L.
sumber
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}

Cobalah online!

  • -1 terima kasih kepada @Kirill L.
  • -4 Terima kasih kepada @Giuseppe

Kode dan penjelasan yang belum dibuka:

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)
}
menggali semua
sumber
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

Cobalah online!

-4 karena raw_inputdiperlukan.

9 byte berkat Perwujudan Ketidaktahuan ; 1 byte dari Ascii-only .

Chas Brown
sumber
Input selain dari program harus dari stdin, seperti yang ditentukan dalam pertanyaan.
Artemis masih tidak percaya
Saya menggunakan Python 3, tetapi sejauh yang saya tahu, bahwa penggunaan input membutuhkan raw_input. Perbaiki saya jika saya salah ..
Artemis masih tidak percaya
Menurut Py 2.7 docs: input([prompt])Setara dengan eval (raw_input (prompt)). Fungsi ini tidak menangkap kesalahan pengguna. Jika input tidak valid secara sintaksis, sebuah SyntaxError akan dimunculkan.
Artemis masih tidak percaya
Jadi, masalah yang Anda ajukan adalah sesuatu seperti di sini , di mana string input perlu dikutip - daripada dikutip seperti dalam situasi stdin 'benar'. Sekali lagi, biasanya aturan I / O agak longgar; tapi saya akan modifikasi.
Chas Brown
Terima kasih telah berubah. Anda dapat menyimpan beberapa byte dengan mengubah ke Python 3 dan menggunakan kode lama Anda + 3 byte untuk tanda kurung, tapi ... +1 lagian
Artemis masih tidak mempercayai SE
2

C # (Visual C # Interactive Compiler) , 305 byte

a=>{string s="",d,g;foreach(var c in a.Split('|')){g=$"{c,2}";d=g[1]==62?ReadLine():g.Substring(2);var z=c[0]%14;s=z<1?string.Concat(Enumerable.Repeat(s,int.Parse(d))):z<2?s+d:z<4?s.Replace(d,""):z<5?s:z<6?string.Concat(s.Reverse()):string.Concat(s.OrderBy(_=>Guid.NewGuid()));Write(z==4?s:"");}return s;}

Cobalah online!

Perwujudan Ketidaktahuan
sumber
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}{

Cobalah online!

Xcali
sumber
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

Johan du Toit
sumber
Test case 6 tidak berfungsi ...
Artemis masih tidak percaya
1
@ArtemisFowl, Terima kasih, regex tidak berfungsi dengan benar dan beralih ke split..join menyelamatkan beberapa byte.
Johan du Toit