¿De donde vienes?

9

INTERCAL es un lenguaje maravilloso, pero no siempre es fácil entender el código de otras personas. Este es particularmente el caso si usan la declaración COME FROM.

INTERCAL ES LOCURA

Definición de desafío

  1. Escriba un programa o función que tome el código fuente de un programa INTERCAL como una secuencia de texto / datos. Si escribe una función, se recomienda que también proporcione un programa para llamar a la función, pero no contará para su puntaje.
  2. La salida de la función será un flujo de texto / datos de los saltos que realiza el programa, de acuerdo con las siguientes instrucciones. La salida no necesita ser impreso, pero sí necesidad de ser un solo texto, no una matriz de cadenas (por ejemplo).
  3. Cada línea de salida consistirá en la instrucción que será COME FROM y el número de línea de su instrucción COME FROM, separados por a ->. Un ejemplo:

    (310)   DO .4 <- .3 -> 55
    
  4. Puede recortar estas líneas de código fuente, pero no es necesario.

  5. Los casos de prueba solo consistirán en etiquetas no calculadas (es decir, etiquetas enteras).
  6. La salida debe ordenarse por el orden del código fuente de las declaraciones que serán COME FROM, no su etiqueta, ni el orden de las declaraciones COME FROM o sus etiquetas.
  7. Es posible que varias declaraciones provengan de la misma etiqueta. En tales casos, los números de línea COME FROM deben ser ordenados y separados por comas.
  8. Es posible que una declaración provenga de sí misma.
  9. Una declaración COME FROM puede tener como prefijo una declaración NOT. En tales casos, el número de línea debe estar entre corchetes.
  10. Las palabras VENIDAS pueden aparecer en un comentario y deben ignorarse. No necesita analizar completamente el archivo: si van seguidos de una etiqueta (un número entre paréntesis), puede suponer que es una declaración real.

Puntuación

Los participantes serán calificados por la longitud del personaje de su programa o función.

Casos de prueba

Todos estos casos de prueba provienen del repositorio calvinmetcalf / intercal Github . Aunque cualquier aplicación útil aceptará con seguridad cualquier entrada, para los propósitos de este desafío, solo necesita tener en cuenta estos cinco casos de prueba.

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

continuación.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
curioso
fuente
2
Me desconcierta que nadie haya hecho una referencia a Cotton Eyed Joe todavía :-).
mınxomaτ
22
INTERCAL is a wonderful languagerechazado por lenguaje ofensivo.
Fatalize
¿Seguro que quieres puntuar por longitud de caracteres? Los desafíos generalmente se puntúan por bytes de longitud aquí.
Fatalize
@Fatalize Lo pensé en ambos sentidos. Las ventajas comunes de la puntuación de caracteres como la codificación de grandes números como caracteres Unicode probablemente no serán útiles, pero pensé que si alguien puede aprovechar la puntuación, me interesaría ver qué pueden hacer.
curiousdannii
¿Podemos suponer que la etiqueta está al comienzo de una línea? Tal que ^(\d+)agarra la etiqueta?
orlp

Respuestas:

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

Para ser llamado con

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

Explicación

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()}
curioso
fuente
1
La mayor hinchazón aquí es calcular el número de línea, pero como autor del desafío, pensé en dejarlo como un intento fácil de tratar de vencer.
curiousdannii