คุณมาจากที่ไหน?


9

INTERCAL เป็นภาษาที่ยอดเยี่ยม แต่ไม่ใช่เรื่องง่ายที่จะเข้าใจรหัสของผู้อื่น โดยเฉพาะอย่างยิ่งในกรณีที่พวกเขาใช้คำสั่ง COME FROM

INTERCAL คือ MADNESS

นิยามการท้าทาย

  1. เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ซอร์สโค้ดของโปรแกรม INTERCAL เป็นสตรีมข้อความ / ข้อมูล หากคุณเขียนฟังก์ชั่นขอแนะนำให้คุณให้โปรแกรมเรียกฟังก์ชั่นด้วย แต่จะไม่นับรวมคะแนนของคุณ
  2. ฟังก์ชั่นเอาท์พุทจะเป็นข้อความ / ข้อมูลสตรีมของการกระโดดที่โปรแกรมทำขึ้น เอาต์พุตไม่จำเป็นต้องพิมพ์ แต่จำเป็นต้องเป็นข้อความเดียวไม่ใช่อาร์เรย์ของสตริง (ตัวอย่าง)
  3. ->บรรทัดของการส่งออกแต่ละคนจะประกอบด้วยคำสั่งซึ่งจะมาจากไหนและจำนวนบรรทัดของมาจากคำสั่งแยกจากกันโดย ตัวอย่าง:

    (310)   DO .4 <- .3 -> 55
    
  4. คุณสามารถตัดซอร์สโค้ดของบรรทัดเหล่านี้ได้ แต่ไม่จำเป็น

  5. กรณีทดสอบจะประกอบด้วยป้ายกำกับที่ไม่ได้คำนวณเท่านั้น(เช่นป้ายกำกับเลขจำนวนเต็ม)
  6. ผลลัพธ์จะต้องเรียงตามคำสั่งรหัสแหล่งที่มาของคำสั่งซึ่งจะมาจากไม่ใช่ฉลากของพวกเขาหรือคำสั่งของคำสั่ง COME FROM หรือป้ายกำกับของพวกเขา
  7. เป็นไปได้สำหรับหลาย ๆ คำสั่งที่จะมาจากเลเบลเดียวกัน ในกรณีเช่นนี้จะต้องเรียงลำดับหมายเลขโทรศัพท์ COME FROM และคั่นด้วยเครื่องหมายจุลภาค
  8. มันเป็นไปได้สำหรับคำสั่งที่จะมาจากตัวเอง
  9. คำสั่ง COME FROM อาจถูกนำหน้าด้วยคำสั่ง NOT ในกรณีเช่นนี้หมายเลขบรรทัดต้องอยู่ในวงเล็บเหลี่ยม
  10. คำมาจากสามารถปรากฏในความคิดเห็นและจะต้องละเว้น คุณไม่จำเป็นต้องแยกวิเคราะห์ไฟล์ทั้งหมด: หากพวกเขาตามด้วยเลเบล (ตัวเลขในวงเล็บ) จากนั้นคุณสามารถสันนิษฐานได้ว่ามันเป็นข้อความจริง

เกณฑ์การให้คะแนน

ผู้เข้าประกวดจะได้คะแนนตามความยาวของตัวละครของโปรแกรมหรือฟังก์ชั่น

กรณีทดสอบ

กรณีทดสอบเหล่านี้ทั้งหมดมาจากcalvinmetcalf / INTERCAL Github repo แม้ว่าแอปพลิเคชั่นที่มีประโยชน์จะยอมรับการป้อนข้อมูลใด ๆ อย่างปลอดภัย แต่สำหรับวัตถุประสงค์ของการท้าทายนี้คุณต้องมีเพียงบัญชีสำหรับกรณีทดสอบทั้งห้านี้

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

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 languagedownvoted สำหรับภาษาที่ไม่เหมาะสม
ทำให้เสียชีวิต

คุณแน่ใจหรือว่าต้องการให้คะแนนตามความยาวตัวอักษร? ความท้าทายมักจะทำคะแนนโดยความยาวไบต์ที่นี่
ทำให้เสียชีวิต

@ ทำให้ฉันคิดถึงมันทั้งสองทาง ข้อได้เปรียบทั่วไปของการให้คะแนนตัวละครเช่นการเข้ารหัสจำนวนมากเป็นตัวละครยูนิโค้ดอาจจะไม่เป็นประโยชน์ แต่ฉันคิดว่าถ้าใครบางคนสามารถใช้ประโยชน์จากการให้คะแนนฉันจะสนใจเพื่อดูว่าพวกเขาสามารถทำอะไรได้บ้าง
อยากรู้อยากเห็น dannii

เราสามารถสมมติได้ว่าฉลากอยู่ที่จุดเริ่มต้นของบรรทัดหรือไม่? เช่นนั้น^(\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
สิ่งที่ใหญ่ที่สุดในที่นี้คือการคำนวณหมายเลขบรรทัด แต่ในฐานะผู้ประพันธ์ที่ท้าทายฉันคิดว่าฉันจะปล่อยให้มันเป็นความพยายามที่ง่ายที่จะเอาชนะ
อยากรู้อยากเห็น dannii
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.