あなたの出身地はどちらですか?


9

INTERCALは素晴らしい言語ですが、他の人のコードを理解するのは必ずしも容易ではありません。これは、COME FROMステートメントを使用する場合に特に当てはまります。

インターカルは狂気

チャレンジの定義

  1. INTERCALプログラムのソースコードをテキスト/データストリームとして取得するプログラムまたは関数を記述します。関数を作成する場合は、関数を呼び出すプログラムも提供することをお勧めしますが、スコアにはカウントされません。
  2. 関数の出力は、以下の指示に従って、プログラムが行うジャンプのテキスト/データストリームになります。出力印刷する必要ありませんが、(たとえば)文字列の配列ではなく、単一のテキストである必要があります。
  3. 出力の各行は、COME FROMになるステートメントと、そのCOME FROMステートメントの行番号で構成され、で区切られます->。例:

    (310)   DO .4 <- .3 -> 55
    
  4. ソースコードのこれらの行をトリミングできますが、そうする必要はありません。

  5. テストケースは、計算されていないラベル(つまり、整数ラベル)のみで構成されます。
  6. 出力は、COME FROMになるステートメントのソースコードの順序で並べ替える必要があります。ラベルではなく、COME FROMステートメントまたはそのラベルの順序ではありません。
  7. 複数のステートメントが同じラベルから来る可能性があります。このような場合は、COME FROM行番号を並べ替えて、コンマで区切る必要があります。
  8. ステートメントがそれ自体から来る可能性があります。
  9. COME FROMステートメントの前にNOTステートメントを付けることができます。このような場合、行番号は角括弧で囲む必要があります。
  10. COME FROMという単語はコメントに含めることができ、無視する必要があります。ファイルを完全に解析する必要はありません。ラベル(括弧内の数字)が後に続く場合は、それが実際のステートメントであると想定できます。

得点

応募者は、プログラムまたは機能のキャラクターの長さによって採点されます。

テストケース

これらのテストケースはすべて、calvinmetcalf / intercal Github repoからのものです。有用なアプリケーションはすべての入力を安全に受け入れますが、この課題では、これらの5つのテストケースのみを説明する必要があります。

rot13.i

(10) PLEASE DON'T GIVE UP -> 87
(33) DON'T GIVE UP -> 92

primes.i

(15)    DO (13) NEXT -> 26
(16)    DO .12 <- .1 -> 6
(23)    DO (21) NEXT -> 3

unlambda.i

(7202)  DO RETRIEVE .203+,202 -> 75
(4202)  DO ,202SUB.201.202#7 <- ,201SUB.201.202#7 -> 108
(6202)  DO ,201SUB.201.202#7 <- ,202SUB.201.202#7 -> 117
(4203)  DO READ OUT ,201SUB.201.202#7 -> 133
(4302)  DO .302 <- .2 -> 181
(5410)  DO ,400SUB#124 <- #4 $ #17 -> 293
(3410)  PLEASE (4410) NEXT -> 288
(5402)  DO (412) NEXT -> 328
(4412)  PLEASE (3412) NEXT -> 334
(3423)  DO FORGET #2 -> 375
(4404)  DO RETRIEVE .311+.312 -> 411
(5404)  PLEASE DO (414) NEXT -> 430
(4434)  DO FORGET #1 -> 441
(3454)  DO (103) NEXT -> 451
(5502)  DO .512 <- .312 -> 520
(8503)  PLEASE RETRIEVE .311+.312 -> 621
(7503)  DO (302) NEXT -> 515
(3622)  DO (302) NEXT -> 514
(603)   PLEASE FORGET #2 -> 622

pass.i

(10)    DO  NOTHING -> 5, 11
(20)    PLEASE  (100) NEXT -> 6
(30)    PLEASE  (200) NEXT -> 12
(103)   DO  (104) NEXT -> 27
(104)   DO  (105) NEXT -> 19
(1) DO  (2) NEXT -> 36
(2) DO  (105) NEXT -> 194
(202)   DO NOT  .2 <- #2 AGAIN -> [196]
(203)   DO  (204) NEXT -> 167
(204)   DO  (205) NEXT -> 159

継続.i

(8201)  DO NOTHING -> 165, 271
(8202)  PLEASE NOTE Fork threads, one dormant, one alive -> 53, 58
(8211)  DO COME FROM (8211) -> 60
(8216)  DO NOTHING -> 71
(8215)  DO NOTHING -> 68
(8217)  DO COME FROM (8217) AGAIN -> 118
(8299)  DO COME FROM (8299) AGAIN -> 141
(8274)  DO (8273) NEXT ONCE -> 158
(8259)  PLEASE DO NOTHING -> 166
(8276)  DO COME FROM (8276) AGAIN -> 199
(8278)  PLEASE DO COME FROM (8278) AGAIN -> 237

2
まだコットンアイドジョーのリファレンスを誰も作成していないことは、私を困惑させます:-)。
mınxomaτ

22
INTERCAL is a wonderful language攻撃的な言葉に反対票を投じました。
15

文字の長さでスコアを付けてもよろしいですか?チャレンジは通常、ここではバイト長でスコアリングされます。
15

@Fatalize両方の方法で考えました。Unicodeの文字として大きな数値をエンコードするような文字スコアリングの一般的な利点はおそらく役に立たないでしょうが、誰かがスコアリングを利用できるなら、何ができるかを知りたいと思います。
curiousdannii

ラベルが行の先頭にあると想定できますか?^(\d+)ラベルをつかむような?
orlp

回答:


2

JavaScript、232バイト

function c(d){for(var l,o,f,c,p=/^.(\d+).+?$/gm,a=/(T\s+)?C.{7}M .(\d+)/g,r='';l=p.exec(d);)for(f=0;o=a.exec(d);)o[2]==l[1]&&(c=d.slice(0,o.index).split('\n').length,r+=f++?', ':'\n'+l[0]+' -> ',r+=o[1]?'['+c+']':c);return r.trim()}

と呼ばれる

var data = require( 'fs' ).readFileSync( process.argv[2] ).toString();
console.log( c( data ) );

説明

function c(d){
    for(
        // Initialise variables
        var l,o,f,c,p=/^.(\d+).+?$/gm,a=/(T\s+)?C.{7}M .(\d+)/g,r='';
        // Find lines beginning with a label
        l=p.exec(d);)
            for(
                // Reset a have-we-output-this-line flag
                f=0;
                // Find CALL FROM statements
                o=a.exec(d);)
                    // Filter to CALL FROM statements which have the current line
                    o[2]==l[1]&&(
                        // Calculate the line number of this CALL FROM statement
                        c=d.slice(0,o.index).split('\n').length,
                        // Concat the output for this line
                        r+=f++?', ':'\n'+l[0]+' -> ',r+=o[1]?'['+c+']':c);
    // Trim an initial new line
    return r.trim()}

1
ここで最大の膨らみは行番号の計算ですが、挑戦作者として、私はそれを簡単に倒そうとする試みとして残したいと思いました。
curiousdannii 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.