繰り返しを解釈する!


11

この課題は、繰り返しに関する2チャレンジシリーズの最初の課題です。2つ目はすぐにアップします。

繰り返し(私がちょうど作っ何か)と呼ばれる言語では、無限の文字列が構成さ12345678901234567890...と、1234567890永遠に繰り返すことを。

数値を出力するには、次の構文を使用できます。

  • +-*/:これにより、繰り返し数字の文字列に演算子が挿入されます。
    • 例:
      • +-> 1+2= 3(間にandを+挿入)+12
      • +*-> 1+2*3= 1+6= 7(2つの演算子が現在使用されていることを除いて、上記と同じです)
      • /-> 1/2= 0(繰り返しは整数除算を使用)
      • //-> 1/2/3= 0/3= 0(繰り返しは複数の減算と除算で「左の関連付け」を使用します)
    • 各演算子は、c' がない限り、左に1桁の数字が挿入されるように挿入されます(以下を参照)。
  • c:文字列の次の数字と連結します。
    • 例:
      • c+-> 12+3= 15(をc「継続」1し、次の数字と連結して2、を形成します12
      • +c-> 1+23=24
      • ccc -> 1234
  • ():数字を処理するための括弧。
    • 例:
      • (c+)*-> (12+3)*4= 15*4= 60(繰り返しは操作の順序を使用します)
      • (c+)/c-> (12+3)/45= 15/45=0
      • (cc+c)/-> (123+45)/6= 168/6=28
  • s:番号をスキップします(無限の文字列から番号を削除します)。
    • s+-> 2+3= 5sスキップ1
    • csc- > 124(第一cconcats 12sスキップ3、および最終cconcats 124
    • +s+-> 7(最初に+追加12てmakeに3sスキップ3して、最後に+追加34てmakeに7
    • cs*(++)-> 12*(4+5+6)= 12*15=180

上記の例では、無限文字列内の有限の桁数のみが使用されています。使用される桁数はと同等number of operators, concats and skips + 1です。

タスクは、繰り返しコードの文字列が与えられると、結果を出力します。

入力と出力の例は次のとおりです。

++ -> 6
- -> -1
(-)* -> -3
cscc -> 1245
(cc+c)/ -> 28
cc+c/ -> 130
cs*(++) -> 180

これはコードゴルフなので、バイト単位の最短コードが勝ちです!

仕様:

  • 結果が決して上にならないことが保証され2^31-1ます。
  • また、入力がシンボルのみで構成されることも保証されます+-*/cs()
  • 空のプログラムが出力されます1

何について~の?私たちをぶら下げたままにしないでください。
ロバートフレイザー

@RobertFraserおっと、それは間違いでした-cは元々〜でしたが、私はそれを完全に修正していないようです。
clismique

1
@TonHospelおお、あなたはそこに良い点を持っています。「s」記号は、本質的に無限の文字列から関連付けられている数値を完全に削除するため、両方のシナリオでyesです。
clismique

2
あなたの仕様では、しかし、言うs+され2+3、その最初の例として。それでもs私を悩ませ続けています。どのように+s()+拡大するのだろうか。もしそうであれば1+(2)+4、その後(の前に来る2が、sでも前に来る(一見まだスキップ3、ありません2。ただし、結果がaである場合1+(3)+4、aの効果はその後に続くsものに依存します(と比較+s+
Ton Hospel

1
scである23s+ありますか1+3?DOESはsスキップ1になりましたか2?すべての例では、オペランドの最初の操作を使用1して2...そうscでなければなりません13
タイタス

回答:


4

JavaScript(ES6)、110バイト

s=>eval((" "+s)[R='replace'](/[^\)](?!\()/g,x=>x+i++%10,i=1)[R](/c| (\ds)+|s\d/g,"")[R](/\d+\/\d+/g,"($&|0)"))

非常に簡単ですが、整数除算により25バイトが追加されます。何らかの理由で、JSの正規表現は文字列の先頭と最初の文字の両方に一致しないため、数バイトも追加されます。

使い方

  1. 入力の前にスペースを追加します。
  2. )aの直前ではない各文字(を除く)に次の数字を追加し(ます。
  3. それぞれcs先頭の数字+ (1s2-> 2)、および各s+数字(3s4-> 3)を削除します。
  4. 各除算操作をint-divisionに変換します(1/2-> (1/2|0))。
  5. 評価して戻ります。

OK ...あなたのプログラムにはバグが...持ってss+戻って6それが復帰することを意図しています、7(2 sのスキップを1して2ので、+追加3して4)。
clismique

@ Qwerp-Derpありがとう、修正。
ETHproductions

/^|,|$/gどちらのマッチも同じインデックスを持つため、次のようなものは最初に一度だけマッチします。$マッチには他の可能なマッチよりも大きいインデックスがあるため、同じ問題はありません。
ニール

0

バッチ、332バイト

@echo off
set s=
set e=
set d=
set r=
set/ps=
:d
set/ad=-~d%%10
:l
if "%s%"=="" goto g
set c=%s:~0,1%
set s=%s:~1%
if %c%==( set e=%e%(&goto l
if %c%==) set r=%r%)&goto l
if %c%==s goto d
if %c%==c set c=
if "%r%"=="" set/ar=d,d=-~d%%10
set e=%e%%r%%c%
set/ar=d
goto d
:g
if "%r%"=="" set/ar=d
cmd/cset/a%e%%r%

の動作によりs、これは非常に厄介になります。(多分csに評価すべき13-sする-2?)変数:

  • s 入力文字列(何も入力しないとset / pは変数を変更しないため、明示的に空白にされます)
  • e通常の整数算術の部分式(set/aの形式として渡すことができますeval
  • d 無限の数字列の次の数字
  • r最新のオペレーターの右側。(最初に来る必要があるため、これをすぐに連結することはできませんsが、増分しないように保存する必要があります。幸いなことに、処理が)少し簡単になります。
  • c 現在のキャラクター。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.