文字列操作インタープリター


11

概要

文字のみを使用して、新しい文字列操作言語が作成されました$+#-!*|@>!あなたの仕事は、できる限り少ないバイトでインタプリタを実装することです。

入力

文字列。この言語の1行です。これは、合理的な方法(stdin、関数パラメーター、コマンドライン引数など)で、または事前定義された変数として使用できます。プログラムがユーザー入力を要求する場合は、stdinから要求するすべてのユーザー入力を受け入れます。以下を参照してください。あなたはそれが有効なプログラムであると仮定するかもしれません。

出力

言語が出力するものは何でも、以下の仕様。妥当な方法(stdout、関数出力など)で文字列、または変数値を出力する必要があります。言語が明示的に出力する場合、これ stdoutに移動する必要があります。標準的な抜け穴は禁止されています。

言語仕様

処理と構文

この言語は、文字列操作のみを行うため、処理の非常に単純な形式です。空の文字列("")で始まり、各用語で変更されます。用語は、1つまたは2つの部分で構成されます。関数(下)と、場合によってはその動作を編集するパラメーター(下)が続きます。用語はパイプ(|)で区切られます。あなたはそれが空のプログラムではなく、どの用語も空ではないと仮定するかもしれません。プログラムの最後に値を出力する必要があります。

関数

以下に示すように、この言語には6つの関数しかありません。各関数は、1つまたはゼロのパラメーターを受け入れます。

  • + 文字列を連結します(1つの文字列パラメーターを取り、それを現在の値に連結します)
  • ! 現在の値の文字順を逆にします(パラメータなし)
  • * 文字列を繰り返します(1つの整数パラメーターを取り、現在の値を何回も繰り返します)
  • - 値のすべての出現を削除します(1つの文字列パラメーターを取り、現在の値からすべての出現を削除します)
  • $ [pseudo-]現在の値をランダムにシャッフルします(パラメーターなし)
  • <現在の値をstdout(パラメータなしで)出力します

これらは関数に渡される可能性のある値であり、それらに一致する正規表現で表されます。

  • @[^|]*パイプ以外の文字を含む文字列リテラル。空の場合があります。
  • #[0-9]+ 整数リテラル
  • >の次の行stdin。で使用する場合*、整数に変換します。

テストケース

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

テストケース2はランダムであるため、その中の文字の順列はすべて有効であることに注意してください。また、表の出力は改行で区切られていますが、プログラムで同じようにする必要はありません。各場合の最後の値は最終出力です。

例(ゴルフなし)pythonインタープリター

オンラインでお試しください!IMOまたはIDLEを使用して実行すると、IMOが向上します。(私はそれを424バイトにまで減らしましたが、もっと多くのことができると確信しています)。


2
入力を既に変数に入れることを許可することは、出力を1つに入れることと同様に非標準です。
ジョナサンアラン

あなたの例<は、遭遇するたびに改行を印刷するようです。これは必須ですか?
無知の

プログラムには改行が含まれますか?可能であれば、Chas Brownの答え
無知の

2
今後の質問については、面倒なI / O形式を避けてください。入力をstdinに制限すると、一部の言語で余分なバイトが必要になり、課題に大きな負担がかかりません。
アーナルド

1
@digEmAll追加したものは+@>#どうですか?私も使用しました#
アルテミスはまだ

回答:


3

ルビー -palF\|146142バイト

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

オンラインでお試しください!

ポートオブチャスブラウンのPython回答。出力後に改行を印刷しません。

いつものように、Ruby 2.6バージョンは、無限の範囲のインデックス付け(i[2..])で2バイト短くなります。


6

R287の 286 273 269バイト

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}

オンラインでお試しください!

  • -1 @Kirill Lに感謝
  • -4 @Giuseppeに感謝

展開されたコードと説明:

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

パイソン2215の 219 209 208バイト

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

オンラインでお試しください!

-4 raw_inputは必須です。

無知の体現のおかげで9バイト。Ascii-onlyから1バイト。


質問で指定されているように、プログラム以外の入力は標準入力からのものでなければなりません。
アルテミスはまだSEを信用していない

私はPython 3を使用していますが、私が知っている限り、入力の使用にはが必要raw_inputです。正しい私、私が間違っている場合...
アルテミスはまだSE信頼していない

Py 2.7ドキュメントによると:input([prompt])eval(raw_input(prompt))と同等です。この関数はユーザーエラーをキャッチしません。入力が構文的に有効でない場合、SyntaxErrorが発生します。
アルテミスはまだ

ですから、あなたが提起している問題はここにあるようなもので、入力文字列を引用する必要があります-「真の」標準入力の場合のように引用符で囲まないのではありません。繰り返しますが、通常、I / Oルールは少し緩いです。しかし、私は修正します。
チャスブラウン

変えてくれてありがとう。あなたは+1とにかく...のPython 3に変更し、ブラケットのためのあなたの古いコード+ 3つのバイトを使用して、いくつかのバイトを保存しますが、可能性
アルテミスはまだSE信頼していない



1

Javascript、292 267バイト

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


テストケース6はまったく機能しません...
ArtemisはまだSEを信頼していません

1
@ArtemisFowl、ありがとう、正規表現が正しく機能していなかったため、split..joinに切り替えると数バイト節約できました。
ヨハンデュトワ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.