+ pコードを解釈する


15

別の2文字の言語に対する最近の流行に触発されて、 ;#

イントロ

コミュニティのコンセンサスによると、このサイトで受け入れられる回答には、少なくとも次のプログラミング言語を使用する必要があります。

  1. 自然数が素数かどうかを判断できます
  2. 2つの自然数を加算できます
  3. 数字のリスト/タプル、および単一の数字を表すことができます

この課題のために、#3は無視します。したがって、このサイトで使用できる最も単純な言語(#3を無視)には、正確に2つのコマンドがisPrimeありaddます。解釈とバイトカウントを簡単にするisPrimeためにp、とaddに割り当てましょう+。したがって、言語があり+pます。あなたの課題は、いくつかの+pコードを解釈することです。

動作

  • + その add命令は、2つの数値をとり、それらを加算し、その結果を出力します
  • pisPrime命令は、単一の番号、および出力をとり1、それが素数であれば、そして0それがない場合には

ルール

  • 文字列を指定すると、その文字列を+pコードとして解釈するプログラム/関数を作成する必要があります。あなたは、十分に形成された入力(のみ取ることができる+p文字)。
  • 入力は柔軟です。プログラムを文字列、文字配列、コードポイントの整数配列などとして取り込むことができます。解釈されるプログラムの入力も柔軟です。整数配列を取り込んで、プログラムの実行中にエントリを使い果たすか、各命令(+およびp)が個別に入力を要求する場合があります。すべての命令に対して十分な入力があると仮定することができます。入力は、0〜200の数字で構成されることが保証されています(ただし、アルゴリズムは、正の整数入力に対して理論的に機能するはずです)。
  • 出力も柔軟です。結果を印刷したり、リストとして返したり、すべての結果を含む文字列を返したりすることができます。印刷または文字列として返す場合、出力は改行などの数字以外の一貫した区切り文字で区切る必要があります。タブ、スペース、または,文字。末尾のセパレータまたは末尾の空白がある場合があります。また、pの出力は、1またはではなく、作業中の言語で定義されているように、任意の真実または偽の値である可能性があります0
  • インタプリタは終了する場合と終了しない場合があります(完全なプログラムの場合)が、すべての命令が解釈された後に印刷を停止する必要があります。(区切り文字やヌル文字などを永久に出力し続けることはできません)。
  • これらの標準的な抜け穴はデフォルトで禁止されています
  • これはで、バイト数が最小の答えが勝ちます

テストケース

Program: +
Input: [56, 50]
Output: 106 
----------------------------------
Program: p
Input: [12]
Output: 0 
----------------------------------
Program: p
Input: [13]
Output: 1 
----------------------------------
Program: ++
Input: [172, 120, 33, 58]
Output: 292 91 
----------------------------------
Program: p
Input: [29]
Output: 1 
----------------------------------
Program: pp
Input: [176, 12]
Output: 0 0 
----------------------------------
Program: ++++p
Input: [32, 16, 69, 197, 73, 171, 21, 178, 72]
Output: 48 266 244 199 0 
----------------------------------
Program: pp+++p+pp+
Input: [151, 27, 119, 189, 198, 107, 174, 15, 166, 106, 134, 108, 169, 55, 42]
Output: 1 0 308 305 189 0 240 0 0 97 
----------------------------------
Program: p+p+++++++pp+p
Input: [143, 67, 30, 149, 178, 52, 112, 122, 55, 122, 142, 199, 20, 175, 138, 80, 116, 180, 50, 116, 15, 92, 74]
Output: 0 97 1 230 234 177 341 195 218 296 0 0 107 0 
----------------------------------
Program: ++p++p+pp+++++p+p+pp++
Input: [120, 177, 23, 116, 163, 52, 65, 98, 177, 16, 96, 131, 160, 48, 153, 0, 139, 33, 62, 49, 129, 86, 99, 135, 187, 80, 137, 130, 113, 136, 0, 1, 186, 100, 38, 153]
Output: 297 139 1 117 275 0 227 0 0 153 172 111 215 234 0 217 0 249 0 0 286 191 
----------------------------------
Program: ++p+++++p+p+++++++
Input: [181, 169, 6, 84, 68, 171, 129, 107, 106, 114, 197, 58, 11, 88, 156, 169, 43, 77, 49, 43, 102, 78, 93, 51, 91, 37, 64, 93, 82, 126, 181, 81, 44]
Output: 350 90 0 300 213 311 69 244 0 120 0 145 171 142 101 175 307 125 
----------------------------------
Program: ++p+
Input: [131, 127, 115, 40, 113, 196, 83]
Output: 258 155 1 279 
----------------------------------
Program: +ppp++p+ppp+p++++++++p+p+++pp+ppp++
Input: [6, 9, 187, 168, 96, 167, 178, 139, 86, 148, 99, 103, 166, 18, 119, 15, 132, 77, 16, 88, 139, 34, 58, 90, 43, 69, 68, 152, 59, 106, 134, 49, 155, 100, 52, 55, 27, 188, 41, 77, 23, 49, 171, 23, 193, 84, 111, 165, 80, 18, 63, 23, 116, 112, 119]
Output: 15 0 0 0 345 225 0 202 0 0 0 147 0 104 173 148 112 220 165 183 255 0 82 0 118 72 194 1 0 276 0 0 0 139 231 
----------------------------------
Program: ++++++++p++++++++++++
Input: [156, 5, 34, 25, 117, 98, 139, 131, 88, 82, 191, 13, 1, 170, 51, 116, 144, 85, 92, 170, 25, 94, 149, 131, 19, 161, 115, 160, 8, 6, 195, 101, 11, 185, 87, 50, 33, 140, 188, 135, 164]
Output: 161 59 215 270 170 204 171 167 0 177 195 243 150 276 168 201 112 272 83 328 299 
----------------------------------

多くの非常に長いテストケース

テストケースの生成に使用されるJavaコード

以下は、解釈されない、Java化されていないJava関数+pです。

public static void interpret(String program, int[] input) {
    int index = 0;
    for (char inst : program.toCharArray()) {
        switch (inst) {
            case '+':
                System.out.print((input[index++] + input[index++]) + " ");
                break;
            case 'p':
                int n = input[index++];
                System.out.print((isPrime(n) ? 1 : 0) + " ");
                break;
        }
    }
}

public static boolean isPrime(long n) { //Taken from /programming//a/2385999/4484294
    if (n < 2) return false;
    if (n == 2 || n == 3) return true;
    if (n % 2 == 0 || n % 3 == 0) return false;
    long sqrtN = (long) Math.sqrt(n) + 1;
    for (long i = 6L; i <= sqrtN; i += 6) {
        if (n % (i - 1) == 0 || n % (i + 1) == 0) return false;
    }
    return true;
}

注:検索クエリを使用prime AND add AND interpret is:questionすると、この質問に重複はないようです。ある場合は、ごめんなさい。


あなたの出力では、psの結果はセパレータなしで連結されていますが、これは意図されていますか?
ガボールフェケテ

ヒューリスティックプライムテストを使用できますか?すなわちisprimeジュリアで。
Rɪᴋᴇʀ

私はその流行を始めました!しかし...それは何をしましたか?ロボット...いいえ!
15:19にコメアリンガーアーイング

興味深いことに、私が作っ正反対挑戦へ
coinheringaahing caird

@GáborFekete彼らは?彼らは...私には罰金を見て
ソクラテスのフェニックス

回答:


31

05AB1E、5バイト

vy.V,

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

説明

この挑戦は手袋のように05AB1Eに適合しました:)

vy      # for each instruction in the program
  .V    # execute as 05AB1E code
    ,   # print

6
間違いなく仕事に最適なツール。
エリックアウトゴルファー

1
これはチートに見える...私は本当に意味します。
クリストファー

@Christopher:幸いなことに05AB1EaddisPrime+p意味します :)
Emigna

@Emigna 05AB1Eを使用したことがないので、私には何もわかりませんでした!賢い答え:)
ソクラテスフェニックス

@エミグナ待ってエニグマ?
クリストファー

7

Python 2、135 133バイト

l,p=input()
i=j=0
while len(l)-i:print(int(all(l[i]%k for k in range(2,l[i])))if p[j]=='p'else l[i]+l[i+1]);i+=1+'p+'.find(p[j]);j+=1

-kundorのおかげで2バイト


i,j=0,0冗長ですか?そうi,j=0でしょ?
パベル

1
@フェニックス:いいえ、それは動作しません。でもできi=j=0ます。
ニックマッテオ


5

Haskell、88 79バイト

('+':r)!(a:b:c)=a+b:r!c
('p':r)!(a:c)=min(foldr((*).mod a)1[2..a-1])1:r!c
_!e=e

"commands" ! [args] 使用するため。

  • @Laikoniのおかげで9バイトを節約(#56433)

私はまだHaskellを学んでいます。ゴルフのヒントは大歓迎です!


関数に中置表記法を使用するためのこのヒントは、いくつかのバイトを節約できます。また、ベースケースi _[]=[]を最後のパターンマッチングルールになるように移動してからi _ e=e、に短縮したり_!e=e、中置表記法に切り替えた後などに短縮したりすることもできます。
ライコニ

(min$product ...することができますmin(product ...
ライコニ

product$map(mod a)に短縮できますfoldr((*).mod a)1
ライコニ

4

Ruby 2.4、77 + 7 = 84バイト

-rprimeフラグを使用します。

->g,i{g.chars.map{|c|c==?p?i.shift.prime?? 1:0: c==?+?i.shift(2).sum: p}-[p]}

4

Perl 6、70バイト

{@^b.rotor($^a.comb.map(1+(*ne'p'))).map({$_-2??.[0].is-prime!!.sum})}

最初に、rotorメソッドを使用して、プログラムの次の文字が存在するかどうかに応じて、入力リストをサイズ1または2のチャンクに分割しますp。次に、そのチャンクリストがマッピングされます。サイズ2のチャンクは合計され、サイズ1のチャンクは、素数性についてテストされた唯一の要素を持ちます。



3

C#、130 129バイト

p=>d=>{var i=0;p.Any(c=>{Console.Write((c==43?d[i++]+d[i]:Enumerable.Range(2,d[i]-2).Any(x=>d[i]%x==0)?0:1)+" ");return++i<0;});}

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

  • 関数をカリー化して1バイトを節約しました(Cyoceに感謝)

必ずどのようにC#が動作しますが、変更することができない(p,d)=>ためにp=>d=>バイトを保存し、カリー化関数を作るために?
チョイス

そう、ありがとう。(これは、バイト数に含まれるべきであるか必要なC#の定型の多くの議論の余地はあるが、ええ、あなたはそれを書くことができます(リンクTIOを参照してください)。。)
Mormegil

2

PowerShell 3 +、151 121バイト

$r,$v=$args;$p={0-notin((2..(($n=0+"$args")-1)|%{$n%$_}))};$i=0;$r|%{if($_-eq"p"){&p $v[$i]}else{$v[$i]+$v[($i+=1)]}$i++}

PowerShellには主要なビルトイン機能がないため、独自にロールバックする必要がありました。私の最初のバージョンはひどいものだったので、モジュラスの結果の中で0をテストする他のほとんどのバージョンから取ったので、大幅に節約できます。また、の-notin代わりにを使用して数バイトを節約しました-notcontainsが、PowerShell v2がリリースされたことを意味します。

コメントベースの説明

# $r is the program code. Assumed char array
# $v is the remaining variables in an assumed integer array.
$r,$v=$args
# Anonymous function to determine if a number is a prime or not.
# Test all potential factors. Check if any 0 modulus remainders are present
$p={0-notin((2..(($n=0+"$args")-1)|%{$n%$_}))}
# $i is an index for tracking location in $v
$i=0
# Cycle each of the instructions
$r|%{if($_-eq"p"){
        # Call the prime checking anonymous function on this number
        &p $v[$i]
    }else{
        # Add the next two numbers. Adjust the index accordingly. 
        $v[$i]+$v[($i+=1)]

    }
    # Next number in list. 
    $i++  
}
    # Next number in list. 
    $i++  
}


0

QBasic、122バイト

INPUT p$
FOR i=1TO LEN(p$)
INPUT x
IF"+"=MID$(p$,i,1)THEN INPUT y:?x+y:ELSE f=0:FOR j=2TO x:f=f-(x MOD j=0):NEXT:?f=1
NEXT

コードを入力行として取得し、次に各入力番号を独自の行に取得します。出力は、計算されるとすぐに印刷されるため、入力に散在しています。真理値は-1; falseyは0です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.