Звідки ти прийшов?


9

INTERCAL - чудова мова, але зрозуміти код інших людей не завжди легко. Особливо це стосується випадків, коли вони використовують оператор COME FROM.

ІНТЕРКАЛ МАДНІ

Визначення виклику

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

    (310)   DO .4 <- .3 -> 55
    
  4. Ви можете обрізати ці рядки вихідного коду, але це не обов'язково.

  5. Тестові випадки будуть складатися лише з не обчислених міток (тобто цілих міток).
  6. Вихід повинен бути відсортований за порядком вихідного коду висловлювань, які будуть ПРИЙДІТЬСЯ, а не їх міткою, а також порядком операторів COME FROM або їх міток.
  7. З однієї мітки МОЖЛИВО отримати кілька заяв. У таких випадках номери рядків ПРИЙДІТЬСЯ повинні бути відсортовані та розділені комами.
  8. Можливо, заява ПОВІДКЛЮЄТЬСЯ сам.
  9. Оператор COME FROM може бути префіксом оператора NOT. У таких випадках номер рядка повинен бути загорнутий у квадратні дужки.
  10. Слова ДОСЛІДЖУЮТЬСЯ в коментарі та їх слід ігнорувати. Вам не потрібно повністю розбирати файл: якщо за ними дотримується мітка (число в дужках), ви можете припустити, що це справжнє твердження.

Оцінка балів

Вступники оцінюватимуться за довжиною символів програми чи функції.

Тестові справи

Усі ці тестові випадки походять від 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

пас.і

(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

продовження.і

(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
Мене бентежить те, що ще ніхто не робив посилання на Cotton Eyed Joe :-).
mınxomaτ

22
INTERCAL is a wonderful languageприхильний до образливої ​​мови.
Фаталізувати

Ви впевнені, що хочете оцінити за довжиною символів? Тут виклики зазвичай оцінюються за довжиною байтів.
Фаталізувати

@Fatalize Я думав про це обома способами. Загальні переваги підрахунку символів, такі як кодування великої кількості як символів Unicode, ймовірно, не будуть корисними, але я подумав, що якщо хтось може скористатись скорингом, мені буде цікаво подивитися, що вони можуть зробити.
цікаводанні

Чи можна припустити, що мітка знаходиться на початку рядка? Такий, що ^(\d+)хапає етикетку?
orlp

Відповіді:


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

1
Найбільший розквіт тут - обчислення номера рядка, але, як автор виклику, я подумав, що залишив би це як легку спробу перемогти.
цікаводанні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.