Woher kommst du?

9

INTERCAL ist eine wunderbare Sprache, aber es ist nicht immer einfach, den Code anderer Leute zu verstehen. Dies ist insbesondere dann der Fall, wenn sie die Anweisung COME FROM verwenden.

INTERCAL IST WÜTEND

Herausforderungsdefinition

  1. Schreiben Sie ein Programm oder eine Funktion , die den Quellcode eines INTERCAL-Programms als Text- / Datenstrom verwendet. Wenn Sie eine Funktion schreiben, wird empfohlen, dass Sie auch ein Programm zum Aufrufen der Funktion bereitstellen, das jedoch nicht für Ihre Punktzahl angerechnet wird.
  2. Die Funktionsausgabe ist ein Text- / Datenstrom der Sprünge, die das Programm gemäß den folgenden Anweisungen ausführt. Die Ausgabe muss nicht gedruckt werden, sondern muss ein einzelner Text sein, kein Array von Zeichenfolgen (zum Beispiel).
  3. Jede Ausgabezeile besteht aus der Anweisung COME FROM und der Zeilennummer der Anweisung COME FROM, die durch a getrennt ist ->. Ein Beispiel:

    (310)   DO .4 <- .3 -> 55
    
  4. Sie können diese Quellcodezeilen kürzen, dies ist jedoch nicht erforderlich.

  5. Die Testfälle bestehen nur aus nicht berechneten Beschriftungen (dh ganzzahligen Beschriftungen).
  6. Die Ausgabe muss nach der Quellcodereihenfolge der Anweisungen sortiert werden, die COME FROM sein sollen, nicht nach ihrer Bezeichnung oder der Reihenfolge der COME FROM-Anweisungen oder ihrer Bezeichnungen.
  7. Es ist möglich, dass mehrere Anweisungen von derselben Bezeichnung kommen. In solchen Fällen müssen die Zeilennummern von COME FROM sortiert und durch Kommas getrennt werden.
  8. Es ist möglich, dass eine Anweisung von selbst kommt.
  9. Einer COME FROM-Anweisung kann eine NOT-Anweisung vorangestellt werden. In solchen Fällen muss die Zeilennummer in eckige Klammern gesetzt werden.
  10. Die Wörter COME FROM können in einem Kommentar erscheinen und müssen ignoriert werden. Sie müssen die Datei nicht vollständig analysieren: Wenn auf sie eine Beschriftung (eine Zahl in Klammern) folgt, können Sie davon ausgehen, dass es sich um eine echte Aussage handelt.

Wertung

Die Teilnehmer werden nach der Charakterlänge ihres Programms oder ihrer Funktion bewertet .

Testfälle

Diese Testfälle stammen alle aus dem Calvinmetcalf / Intercal Github Repo . Obwohl jede nützliche Anwendung jede Eingabe sicher akzeptiert, müssen Sie für die Zwecke dieser Herausforderung nur diese fünf Testfälle berücksichtigen.

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

Fortsetzung.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
neugierigdannii
quelle
2
Es verwirrt mich, dass noch niemand eine Referenz zu Cotton Eyed Joe gemacht hat :-).
mınxomaτ
22
INTERCAL is a wonderful languagefür beleidigende Sprache herabgestimmt.
Fatalize
Sind Sie sicher, dass Sie nach Zeichenlänge punkten möchten? Herausforderungen werden hier normalerweise nach Bytelänge bewertet.
Fatalize
@Fatalize Ich habe in beide Richtungen darüber nachgedacht. Die allgemeinen Vorteile der Zeichenbewertung wie das Codieren großer Zahlen als Unicode-Zeichen sind wahrscheinlich nicht nützlich, aber ich dachte, wenn jemand die Bewertung nutzen kann, wäre ich interessiert zu sehen, was er tun kann.
neugierigdannii
Können wir annehmen, dass sich das Etikett am Anfang einer Zeile befindet? So, dass ^(\d+)das Etikett packt?
Orlp

Antworten:

2

JavaScript, 232 Bytes

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

Mit angerufen werden

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

Erläuterung

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()}
neugierigdannii
quelle
1
Das größte Problem hierbei ist die Berechnung der Zeilennummer, aber als Herausforderungsautor dachte ich, ich würde es als einfachen Versuch belassen, zu versuchen, zu schlagen.
neugierigdannii