Da dove vieni?


9

INTERCAL è un linguaggio meraviglioso, ma non è sempre facile comprendere il codice di altre persone. Questo è particolarmente vero se usano l'istruzione COME FROM.

INTERCAL È MADNESS

Definizione della sfida

  1. Scrivi un programma o una funzione che prende il codice sorgente di un programma INTERCAL come flusso di testo / dati. Se si scrive una funzione, si consiglia di fornire anche un programma per chiamare la funzione, ma non verrà conteggiato ai fini del punteggio.
  2. L'output della funzione sarà un flusso di testo / dati dei salti eseguiti dal programma, secondo le seguenti istruzioni. L'output non deve essere stampato, ma deve essere un singolo testo, non una matrice di stringhe (ad esempio).
  3. Ogni riga di output sarà costituita dall'istruzione che verrà COME DA e dal numero di riga della sua istruzione COME DA, separati da una ->. Un esempio:

    (310)   DO .4 <- .3 -> 55
    
  4. Puoi tagliare queste righe di codice sorgente, ma non è necessario.

  5. I casi di test saranno costituiti solo da etichette non calcolate (ovvero, etichette intere).
  6. L'output deve essere ordinato in base all'ordine del codice sorgente delle istruzioni che verranno COME FROM, non alla loro etichetta, né all'ordine delle istruzioni COME FROM o delle loro etichette.
  7. È possibile che più istruzioni provengano dalla stessa etichetta. In tali casi, i numeri di riga COME FROM devono essere ordinati e separati da virgole.
  8. È possibile che un'affermazione venga DALLA stessa.
  9. Un'istruzione COME FROM può essere preceduta da un'istruzione NOT. In tali casi il numero di riga deve essere racchiuso tra parentesi quadre.
  10. Le parole COME FROM possono apparire in un commento e devono essere ignorate. Non è necessario analizzare completamente il file: se sono seguiti da un'etichetta (un numero tra parentesi), si può presumere che sia un'affermazione reale.

punteggio

Ai partecipanti verrà assegnato un punteggio in base alla lunghezza dei caratteri del loro programma o funzione.

Casi test

Questi casi di test provengono tutti dal repo Github calvinmetcalf / intercal . Sebbene qualsiasi applicazione utile accetti in modo sicuro qualsiasi input, ai fini di questa sfida è necessario tenere conto solo di questi cinque casi di test.

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
Mi sorprende che nessuno abbia ancora fatto un riferimento a Cotton Eyed Joe :-).
mınxomaτ,

22
INTERCAL is a wonderful languagedeclassato per linguaggio offensivo.
Fatalizza il

Sei sicuro di voler segnare per lunghezza dei personaggi? Le sfide di solito vengono segnate in base alla lunghezza dei byte qui.
Fatalizza il

@Fatalize Ci ho pensato in entrambi i modi. I vantaggi comuni del punteggio dei personaggi come la codifica di grandi numeri come caratteri unicode probabilmente non saranno utili, ma ho pensato che se qualcuno potesse sfruttare il punteggio sarei interessato a vedere cosa possono fare.
curiousdannii,

Possiamo supporre che l'etichetta sia all'inizio di una riga? Tale che ^(\d+)afferra l'etichetta?
orlp,

Risposte:


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

Per essere chiamato con

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

Spiegazione

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
Il gonfiamento più grande qui è il calcolo del numero di riga, ma come autore della sfida ho pensato di lasciarlo come un semplice tentativo di provare a battere.
curiousdannii,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.