D'où viens-tu?

9

INTERCAL est un langage merveilleux, mais il n'est pas toujours facile de comprendre le code des autres. C'est particulièrement le cas s'ils utilisent l'instruction COME FROM.

INTERCAL EST FOLIE

Définition du défi

  1. Écrivez un programme ou une fonction qui prend le code source d'un programme INTERCAL comme un flux de texte / données. Si vous écrivez une fonction, il est recommandé de fournir également un programme pour appeler la fonction, mais cela ne comptera pas dans votre score.
  2. La sortie de la fonction sera un flux de texte / données des sauts effectués par le programme, selon les instructions suivantes. La sortie n'a pas besoin d'être imprimée, mais elle doit être un texte unique, pas un tableau de chaînes (par exemple).
  3. Chaque ligne de sortie comprendra l'instruction qui sera COME FROM et le numéro de ligne de son instruction COME FROM, séparés par un ->. Un exemple:

    (310)   DO .4 <- .3 -> 55
    
  4. Vous pouvez couper ces lignes de code source, mais ce n'est pas nécessaire.

  5. Les cas de test seront uniquement constitués d' étiquettes non calculées (c'est-à-dire d'étiquettes entières).
  6. La sortie doit être triée par l'ordre du code source des instructions qui seront COME FROM, pas par leur étiquette, ni par l'ordre des instructions COME FROM ou leurs étiquettes.
  7. Il est possible que plusieurs instructions proviennent de la même étiquette. Dans de tels cas, les numéros de ligne COME FROM doivent être triés et séparés par des virgules.
  8. Il est possible qu'une instruction vienne de elle-même.
  9. Une instruction COME FROM peut être précédée d'une instruction NOT. Dans ce cas, le numéro de ligne doit être placé entre crochets.
  10. Les mots COME FROM peuvent apparaître dans un commentaire et doivent être ignorés. Vous n'avez pas besoin d'analyser complètement le fichier: s'ils sont suivis d'une étiquette (un nombre entre parenthèses), vous pouvez supposer qu'il s'agit d'une véritable déclaration.

Notation

Les participants seront notés par la longueur des caractères de leur programme ou fonction.

Cas de test

Ces cas de test proviennent tous du dépôt calvinmetcalf / intercal Github . Bien que toute application utile accepte en toute sécurité toute entrée, pour les besoins de ce défi, vous devez uniquement tenir compte de ces cinq cas de 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
curiousdannii
la source
2
Cela me déconcerte que personne ne fasse encore référence à Cotton Eyed Joe :-).
mınxomaτ
22
INTERCAL is a wonderful languagedownvoted pour un langage offensant.
Fatalize
Êtes-vous sûr de vouloir marquer par la longueur des caractères? Les défis sont généralement marqués par longueur d'octets ici.
Fatalize
@Fatalize, j'y ai pensé dans les deux sens. Les avantages communs de la notation de caractères comme le codage de grands nombres en caractères unicode ne seront probablement pas utiles, mais je pensais que si quelqu'un pouvait profiter de la notation, je serais intéressé de voir ce qu'ils peuvent faire.
curiousdannii
Pouvons-nous supposer que l'étiquette est au début d'une ligne? Tels que ^(\d+)saisit l'étiquette?
orlp

Réponses:

2

JavaScript, 232 octets

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

Être appelé avec

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

Explication

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()}
curiousdannii
la source
1
Le plus gros ballonnement ici est de calculer le numéro de ligne, mais en tant qu'auteur du défi, je pensais que je le laisserais comme une tentative facile d'essayer de battre.
curiousdannii