Откуда ты?

9

INTERCAL - замечательный язык, но не всегда легко понять код других людей. Это особенно верно, если они используют оператор COME FROM.

Интеркаль безумие

Определение проблемы

  1. Напишите программу или функцию, которая использует исходный код программы INTERCAL в качестве потока текста / данных. Если вы пишете функцию, рекомендуется также предоставить программу для вызова функции, но она не будет учитываться при подсчете очков.
  2. Вывод функции будет потоком текста / данных о переходах, которые делает программа, в соответствии со следующими инструкциями. Вывод не должен быть напечатан, но это должен быть один текст, а не массив строк (например).
  3. Каждая строка вывода будет состоять из оператора COME FROM и номера строки его оператора COME FROM, разделенных символом ->. Пример:

    (310)   DO .4 <- .3 -> 55
    
  4. Вы можете обрезать эти строки исходного кода, но это не обязательно.

  5. Тестовые случаи будут состоять только из невычисленных меток (т. Е. Целочисленных меток).
  6. Вывод должен быть отсортирован по порядку исходного кода операторов, которые будут COME FROM, а не по их меткам, ни по порядку операторов COME FROM, ни по их меткам.
  7. Возможно, что несколько операторов ПРИХОДЯТ ОТ одной и той же метки. В таких случаях номера строк COME FROM должны быть отсортированы и разделены запятыми.
  8. Возможно утверждение, чтобы прийти от самого себя.
  9. Оператору COME FROM может предшествовать оператор NOT. В таких случаях номер строки должен быть заключен в квадратные скобки.
  10. Слова COME FROM могут появляться в комментарии и должны игнорироваться. Вам не нужно полностью разбирать файл: если за ним следует метка (число в скобках), то вы можете предположить, что это реальное утверждение.

счет

Участники будут оцениваться по длине символа их программы или функции.

Контрольные примеры

Все эти тесты взяты из 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
curiousdannii
источник
2
Меня сбивает с толку тот факт, что никто еще не упомянул Джона Коттон Глаза :-).
minxomaτ
22
INTERCAL is a wonderful languageпонижен за оскорбительные выражения.
Роковой
Вы уверены, что хотите набрать длину символов? Проблемы обычно оцениваются по длине в байтах.
Роковой
@Fatalize Я думал об этом в обоих направлениях. Общие преимущества оценки символов, такие как кодирование больших чисел в виде символов Юникода, вероятно, не будут полезны, но я подумал, что если кто-то сможет воспользоваться преимуществами оценки, мне будет интересно посмотреть, что они могут сделать.
curiousdannii
Можем ли мы предположить, что метка находится в начале строки? Такой, что ^(\d+)хватит ярлык?
2015 года

Ответы:

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()}
curiousdannii
источник
1
Самое большое раздувание здесь - это вычисление номера строки, но, как автор задания, я подумал, что оставлю это как простую попытку попытаться победить.
curiousdannii