Nereden geldin?


9

INTERCAL harika bir dildir, ancak diğer insanların kodlarını anlamak her zaman kolay değildir. Bu özellikle COME FROM deyimini kullanıyorlarsa geçerlidir.

INTERCAL YAPILIR

Zorluk tanımı

  1. INTERCAL programının kaynak kodunu metin / veri akışı olarak alan bir program veya işlev yazın . Bir işlev yazarsanız, işlevi çağırmak için bir program da sağlamanız önerilir, ancak puanınıza sayılmaz.
  2. İşlev çıkışı, aşağıdaki talimatlara göre, programın yaptığı atlamaların bir metin / veri akışı olacaktır. Çıkış etmez basılması gerekmektedir, ancak tek bir metin değil, (örneğin) dizeleri bir dizi için ihtiyacı da artar.
  3. Her çıkış satırı, a ile ayrılmış COME FROM ifadesinden ve COME FROM ifadesinin satır numarasından oluşur ->. Bir örnek:

    (310)   DO .4 <- .3 -> 55
    
  4. Bu kaynak kodu satırlarını kesebilirsiniz, ancak gerekli değildir.

  5. Test senaryoları yalnızca hesaplanmamış etiketlerden (yani tamsayı etiketler) oluşur.
  6. Çıktı, etiketleri değil, COME FROM ifadelerinin veya etiketlerinin sırası değil, COME FROM olacak ifadelerin kaynak kodu sırasına göre sıralanmalıdır.
  7. Birden fazla ifadenin aynı etiketten gelmesi mümkündür. Bu gibi durumlarda COME FROM satır numaraları sıralanmalı ve virgülle ayrılmalıdır.
  8. Bir ifadenin kendisinden gelmesi mümkündür.
  9. Bir COME FROM deyiminin önüne NOT deyimi gelebilir. Bu gibi durumlarda, satır numarası köşeli parantez içine alınmalıdır.
  10. COME FROM kelimeleri bir yorumda görünebilir ve yok sayılmalıdır. Dosyayı tam olarak ayrıştırmanıza gerek yoktur: eğer bunları bir etiket (parantez içinde bir sayı) izliyorsa, bunun gerçek bir ifade olduğunu varsayabilirsiniz.

puanlama

Katılımcılar, programlarının veya işlevlerinin karakter uzunluğuna göre puanlandırılacaktır .

Test senaryoları

Bu test vakalarının tümü calvinmetcalf / intercal Github repo'dan gelir . Yararlı herhangi bir uygulama herhangi bir girişi güvenli bir şekilde kabul etse de, bu meydan okuma için sadece bu beş test vakasını dikkate almanız gerekir.

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
Henüz kimsenin Cotton Eyed Joe referansı yapmadığını hayrete düşürüyor :-).
mınxomaτ

22
INTERCAL is a wonderful languagesaldırgan dil için indirildi.
Eylül'ü

Karakter uzunluğuna göre puan vermek istediğinizden emin misiniz? Buradaki zorluklar genellikle bayt uzunluğu ile puanlanır.
Eylül'ü

@Fatalize İki şekilde düşündüm. Büyük sayıları unicode karakterler olarak kodlamak gibi karakter puanlamanın ortak avantajları muhtemelen yararlı olmayacaktır, ancak birisi puanlamadan yararlanabiliyorsa ne yapabileceklerini görmek isteyeceğimi düşündüm.
curiousdannii

Etiketin bir satırın başında olduğunu varsayabilir miyiz? Öyle ki ^(\d+)etiket yakalar?
orlp

Yanıtlar:


2

JavaScript, 232 bayt

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

İle aranacak

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

açıklama

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
Buradaki en büyük şişkinlik, satır numarasını hesaplamaktır, ancak meydan okuma yazarı olarak, onu yenmeye çalışmak için kolay bir girişim olarak bırakacağımı düşündüm.
curiousdannii
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.