Bạn từ đâu đến?


9

INTERCAL là một ngôn ngữ tuyệt vời, nhưng không phải lúc nào cũng dễ hiểu mã của người khác. Điều này đặc biệt đúng với trường hợp họ sử dụng câu lệnh COME TỪ.

INTERCAL LÀ MADNESS

Định nghĩa thách thức

  1. Viết chương trình hoặc hàm lấy mã nguồn của chương trình INTERCAL làm luồng văn bản / dữ liệu. Nếu bạn viết một hàm, bạn cũng nên cung cấp một chương trình để gọi hàm đó, nhưng nó sẽ không được tính vào điểm số của bạn.
  2. Đầu ra chức năng sẽ là một luồng văn bản / dữ liệu của các bước nhảy mà chương trình thực hiện, theo các hướng dẫn sau đây. Đầu ra không cần phải được in, nhưng nó cần phải là một văn bản, không phải là một chuỗi các chuỗi (ví dụ).
  3. Mỗi dòng đầu ra sẽ bao gồm câu lệnh sẽ COME TỪ và số dòng của câu lệnh COME TỪ của nó, cách nhau bởi a ->. Một ví dụ:

    (310)   DO .4 <- .3 -> 55
    
  4. Bạn có thể cắt các dòng mã nguồn này, nhưng không cần thiết.

  5. Các trường hợp thử nghiệm sẽ chỉ bao gồm các nhãn không được tính toán (nghĩa là nhãn số nguyên).
  6. Đầu ra phải được sắp xếp theo thứ tự mã nguồn của các câu lệnh sẽ COME TỪ, không phải nhãn của chúng, cũng như thứ tự của các câu lệnh COME TỪ hoặc nhãn của chúng.
  7. Có thể cho nhiều câu lệnh COME TỪ cùng một nhãn. Trong những trường hợp như vậy, các số dòng COME TỪ phải được sắp xếp và phân tách bằng dấu phẩy.
  8. Có thể cho một tuyên bố để COME TỪ chính nó.
  9. Câu lệnh COME TỪ có thể được bắt đầu bằng câu lệnh KHÔNG. Trong những trường hợp như vậy, số dòng phải được bọc trong dấu ngoặc vuông.
  10. Các từ COME TỪ có thể xuất hiện trong một bình luận và phải được bỏ qua. Bạn không cần phải phân tích cú pháp đầy đủ tệp: nếu chúng được theo sau bởi một nhãn (một số trong ngoặc đơn) thì bạn có thể cho rằng đó là một tuyên bố thực sự.

Chấm điểm

Những người tham gia sẽ được ghi điểm bởi độ dài ký tự của chương trình hoặc chức năng của họ.

Các trường hợp thử nghiệm

Những trường hợp thử nghiệm này đều đến từ repo Github calvinmetcalf / intercal . Mặc dù bất kỳ ứng dụng hữu ích nào cũng sẽ chấp nhận một cách an toàn bất kỳ đầu vào nào, vì mục đích của thử thách này, bạn chỉ cần tính đến năm trường hợp thử nghiệm này.

thối13.i

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

số nguyên tố.i

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

unambda.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

vượt qua

(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

tiếp tục.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
Nó gây trở ngại cho tôi rằng chưa có ai tham khảo Cotton Eyed Joe :-).
mınxomaτ

22
INTERCAL is a wonderful languagehạ cấp cho ngôn ngữ gây khó chịu.
Gây tử vong vào

Bạn có chắc chắn muốn ghi điểm theo chiều dài nhân vật? Các thách thức thường được ghi bằng độ dài byte ở đây.
Gây tử vong vào

@Firthize Tôi nghĩ về cả hai cách. Những lợi thế chung của việc ghi điểm nhân vật như mã hóa số lượng lớn như các ký tự unicode có thể sẽ không hữu ích, nhưng tôi nghĩ rằng nếu ai đó có thể tận dụng việc ghi điểm tôi sẽ quan tâm để xem họ có thể làm gì.
tò mò

Chúng ta có thể cho rằng nhãn ở đầu một dòng không? Như vậy mà ^(\d+)lấy nhãn?
orlp

Câu trả lời:


2

JavaScript, 232 byte

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()}

Được gọi với

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

Giải trình

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
Sự phình to nhất ở đây là tính toán số dòng, nhưng với tư cách là tác giả thử thách tôi nghĩ tôi sẽ bỏ nó như một nỗ lực dễ dàng để cố gắng đánh bại.
tò mò
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.