你来自哪里?


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. 有可能使用COME FROM语句本身。
  9. COME FROM语句可以以NOT语句为前缀。在这种情况下,行号必须用方括号括起来。
  10. 单词COME FROM可以出现在注释中,必须忽略。您不需要完全解析文件:如果在文件后跟标签(括号中的数字),则可以认为它是一个真实的语句。

计分

参赛者将通过其程序或功能的字符长度进行评分。

测试用例

这些测试用例全部来自calvinmetcalf / intercal Github存储库。尽管任何有用的应用程序都可以安全地接受任何输入,但是出于此挑战的目的,您只需要考虑这五个测试用例。

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

密码

(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

延续

(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因冒犯性语言而被低估。
致命

您确定要按字符长度得分吗?挑战通常在此处按字节长度计分。
致命

@Fatalize我双向考虑过。字符计分的共同优点(例如将大量数字编码为Unicode字符)可能不会有用,但是我认为,如果有人可以利用计分,我很想知道他们可以做什么。
curiousdannii 2015年

我们可以假设标签在一行的开头吗?这样^(\d+)抢标签吗?
orlp 2015年

Answers:


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年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.