String Manipulation Interpreter


11

özet

Yalnızca karakterler kullanılarak yeni bir dize düzenleme dili oluşturuldu $+#-!*|@>! Senin görevin mümkün olduğunca az bayt içinde bir tercüman uygulamaktır.

Giriş

Bu dilin tek bir satırı olan bir dize. Bu herhangi bir makul yolla (stdin, fonksiyon parametresi, komut satırı argümanı vb.) Veya önceden tanımlanmış bir değişken olarak alınabilir. Program kullanıcı girişi isterse , stdin'den istediği tüm kullanıcı girişlerini kabul edin ve daha fazlasını yapın, aşağıya bakın. Bunun geçerli bir program olduğunu varsayabilirsiniz.

Çıktı

Dil ne olursa olsun, aşağıdaki özellikler. Bir dizeyi makul bir şekilde (stdout, işlev çıktısı, vb.) Veya değişken bir değeri çıkarmalısınız. Dil açıkça verir, bu olmalıdır Stdout'a gidin. Standart boşluklar yasaklanmıştır.

Dil Özellikleri

İşleme ve Sözdizimi

Dil, yalnızca dize manipülasyonu yaptığı için çok basit bir işleme biçimine sahiptir: boş bir dize ( "") ile başlar ve her terimle değiştirir. Bir terim bir veya iki bölümden oluşur: bir işlev (aşağıda) ve ardından davranışını düzenleyen bir parametre (aşağıda). Terimler borularla ( |) ayrılır . Bunun boş bir program olmayacağını ve hiçbir terimin boş olmayacağını varsayabilirsiniz. Programın sonunda değeri çıkarmalısınız.

Fonksiyonlar

Dilin aşağıda gösterildiği gibi sadece 6 işlevi vardır. Her işlev bir veya sıfır parametresini kabul eder.

  • + dizeleri bitiştir (bir dize parametresi alır, geçerli değere birleştirir)
  • ! geçerli değerin karakter sırasını tersine çevir (parametre yok)
  • * dizeyi tekrarla (bir tamsayı parametresi alır, geçerli değeri birçok kez tekrarlar)
  • - bir değerin tüm tekrarlamalarını kaldırır (bir dize parametresi alır, tüm tekrarlamalarını geçerli değerden kaldırır)
  • $ [sözde-] geçerli değeri rastgele karıştırır (parametre yok)
  • <geçerli değeri stdout(parametre yok)

Değerler

Bunlar, işlevlere iletilebilen ve bunlarla eşleşen regex ile temsil edilen değerlerdir:

  • @[^|]*borular dışında herhangi bir karakter içeren bir dize değişmezi. Boş olabilir.
  • #[0-9]+ bir tam sayı değişmezi
  • >sonraki satırı stdin. İle kullanılırsa *, tamsayıya dönüştürün.

Test Durumları

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

Test durumu 2'nin rastgele olduğunu, bu nedenle içindeki karakterlerin tüm permütasyonlarının geçerli olduğunu unutmayın. Ayrıca, tablodaki çıktılar yeni satırlarla ayrılır, ancak programınızın aynı şeyi yapması gerekmez. Her durumda son değer son çıktı.

Örnek (Golfsiz) python yorumlayıcısı

Çevrimiçi deneyin! IDO veya kullandığınız herhangi bir yöntemle çalıştırırsanız IMO daha iyi olur. (Sonra 424 bayt aşağı golf, ama eminim çok daha iyi yapabilirim).


2
Girdinin zaten bir değişkente olmasına izin vermek ve çıktının birde olmasına izin vermek standart değildir.
Jonathan Allan

Örnekleriniz her <karşılaşıldığında yeni satır yazdırıyor gibi görünüyor . Bu zorunlu mu?
Cehaletin Somutlaştırılması

Programın içinde yeni satırlar olacak mı? Çünkü eğer yapabilirse, Chas Brown'un cevabını geçersiz kılar
Cehaletin Somutlaşması

2
Gelecek sorularınız için lütfen hantal I / O formatlarından kaçınmayı düşünün . Girdiyi stdin ile sınırlamak bazı dillerde fazladan bayt maliyeti ve zorluğa fazla bir şey getirmez.
Arnauld

1
@digEmAll Az önce eklediğim kişi nasıl +@>#? Ben de kullandım #.
Artemis hala

Yanıtlar:


3

Yakut -palF\| , 146142 bayt

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

Çevrimiçi deneyin!

Port of Chas Brown'un Python cevabı . Çıktıdan sonra satırsonu yazdırmaz.

Her zamanki gibi Ruby 2.6 sürümü sonsuz aralık indeksleme ( i[2..]) ile 2 bayt daha kısa olacaktır .


6

R , 287 286 273 269 bayt

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}

Çevrimiçi deneyin!

  • @Kirill L. sayesinde -1
  • -4 @Giuseppe sayesinde

Kaydedilmemiş kod ve açıklama:

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

Piton 2 , 215 219 209 208 bayt

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

Çevrimiçi deneyin!

-4 çünkü raw_inputgereklidir.

Cehalet Düzeni sayesinde 9 bayt ; Yalnızca Ascii'den 1 bayt .


Program dışında girdi, soruda belirtildiği gibi stdin'den olmalıdır.
Artemis hala

Python 3 kullanıyorum, ama bildiğim kadarıyla, bu girdi kullanımı gerekiyor raw_input. Yanlışsam beni düzeltin ..
Artemis hala SE

Py 2.7 belgelerine göre: Değerlendirmeye input([prompt])eşdeğerdir (raw_input (istemi)). Bu işlev kullanıcı hatalarını yakalamaz. Giriş sözdizimsel olarak geçerli değilse, bir SyntaxError öğesi yükseltilir.
Artemis hala SE

Yani, ortaya koyduğunuz sorun , 'gerçek' bir stdin durumunda olduğu gibi alıntılanmak yerine, girdi dizelerinin alıntılanması gereken burada olduğu gibi bir şeydir . Yine, genellikle G / Ç kuralları biraz gevşektir; ama değiştireceğim.
Chas Brown

Değiştiğin için teşekkürler. Python 3'e geçip parantez için eski kodunuzu + 3 bayt kullanarak birkaç bayt kaydedebilirsiniz, ancak ... +1
yine de


1

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

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}{

Çevrimiçi deneyin!


1

JavaScript, 292 267 bayt

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


Test örneği 6 pek işe yaramıyor ...
Artemis hala SE

1
@ArtemisFowl, Teşekkürler, normal ifade düzgün çalışmıyor ve bölmeye geçiyor ... katılmak birkaç bayt kurtardı.
Johan du Toit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.