어디에서 왔습니까?


9

INTERCAL은 훌륭한 언어이지만 다른 사람들의 코드를 이해하는 것이 항상 쉬운 것은 아닙니다. COME FROM 문을 사용하는 경우에 특히 그렇습니다.

INTERCAL IS MADNESS

도전 정의

  1. INTERCAL 프로그램의 소스 코드를 텍스트 / 데이터 스트림으로 사용 하는 프로그램 또는 함수 를 작성하십시오 . 함수를 작성하는 경우 함수를 호출하는 프로그램도 제공하는 것이 좋지만 점수에는 포함되지 않습니다.
  2. 기능 출력은 다음 지침에 따라 프로그램이 수행 한 점프의 텍스트 / 데이터 스트림입니다. 출력물을 인쇄 할 필요 는 없지만 문자열 배열이 아닌 단일 텍스트 여야합니다 (예 :).
  3. 각 출력 라인은 COME FROM이 될 명령문과 COME FROM 명령문의 라인 번호로 구성됩니다 ->. 예를 들면 :

    (310)   DO .4 <- .3 -> 55
    
  4. 이러한 소스 코드 줄을 다듬을 수 있지만 반드시 그럴 필요는 없습니다.

  5. 테스트 사례는 계산되지 않은 레이블 (예 : 정수 레이블) 로만 구성됩니다 .
  6. 출력은 레이블이 아닌 COME FROM이 될 명령문의 소스 코드 순서 나 COME FROM 문 또는 레이블의 순서에 따라 정렬되어야합니다.
  7. 여러 명령문이 동일한 레이블에서 COME FROM으로 올 수 있습니다. 이러한 경우 COME FROM 행 번호를 정렬하고 쉼표로 구분해야합니다.
  8. 명령문이 COME FROM 자체로 오는 것이 가능합니다.
  9. COME FROM 문 앞에 NOT 문이 붙을 수 있습니다. 이러한 경우 줄 번호는 대괄호로 묶어야합니다.
  10. COME FROM이라는 단어는 주석에 나타날 수 있으며 무시해야합니다. 파일을 완전히 구문 분석 할 필요는 없습니다. 파일 뒤에 레이블 (괄호 안의 숫자)이 있으면 실제 명령문이라고 가정 할 수 있습니다.

채점

참가자는 프로그램이나 기능 의 문자 길이 에 따라 점수가 매겨집니다 .

테스트 사례

이 테스트 사례는 모두 calvinmetcalf / intercal Github 저장소에서 제공 됩니다. 유용한 응용 프로그램은 모든 입력을 안전하게 받아들이지 만이 문제의 목적을 위해이 5 가지 테스트 사례 만 설명하면됩니다.

rot13.i

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

소수 .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

continuation.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불쾌감을주는 언어로
페이탈 라이즈

문자 길이로 점수를 매기고 싶지 않습니까? 챌린지는 일반적으로 여기에서 바이트 길이로 점수가 매겨집니다.
페이탈 라이즈

@Fatalize 나는 두 가지 방법에 대해 생각했습니다. 유니 코드 문자로 큰 숫자를 인코딩하는 것과 같은 문자 스코어링의 일반적인 이점은 유용하지 않을 수 있지만 누군가가 스코어링을 활용할 수 있다면 그들이 할 수있는 일에 관심이 있다고 생각했습니다.
curiousdannii

레이블이 줄의 시작이라고 가정 할 수 있습니까? 그런 ^(\d+)라벨 을 잡아?
orlp

답변:


2

자바 스크립트, 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.