Darimana asalmu?

9

INTERCAL adalah bahasa yang luar biasa, tetapi tidak selalu mudah untuk memahami kode orang lain. Ini khususnya terjadi jika mereka menggunakan pernyataan COME FROM.

INTERCAL ADALAH KELEBIHANAN

Definisi tantangan

  1. Tulis program atau fungsi yang mengambil kode sumber program INTERCAL sebagai aliran teks / data. Jika Anda menulis suatu fungsi, disarankan agar Anda juga menyediakan program untuk memanggil fungsi tersebut, tetapi itu tidak akan dihitung dalam skor Anda.
  2. Output fungsi akan menjadi aliran teks / data dari lompatan yang dibuat oleh program, sesuai dengan instruksi berikut. Outputnya tidak perlu dicetak, tetapi harus berupa teks tunggal, bukan array string (misalnya).
  3. Setiap garis output akan terdiri dari pernyataan yang akan COME FROM dan nomor baris pernyataan COME FROM, dipisahkan oleh a ->. Sebuah contoh:

    (310)   DO .4 <- .3 -> 55
    
  4. Anda dapat memangkas baris kode sumber ini, tetapi tidak perlu.

  5. Kasing uji hanya akan terdiri dari label nonkomputasi (yaitu label integer).
  6. Output harus diurutkan berdasarkan urutan kode sumber pernyataan yang akan DATANG DARI, bukan label mereka, maupun urutan pernyataan DATANG DARI atau label mereka.
  7. Dimungkinkan untuk beberapa pernyataan untuk DATANG DARI label yang sama. Dalam kasus seperti itu, nomor baris COME FROM harus diurutkan, dan dipisahkan dengan koma.
  8. Mungkin untuk pernyataan DATANG DARI itu sendiri.
  9. Pernyataan COME FROM dapat diawali dengan pernyataan BUKAN. Dalam kasus seperti itu, nomor baris harus dibungkus dengan tanda kurung.
  10. Kata-kata COME FROM dapat muncul dalam komentar dan harus diabaikan. Anda tidak perlu mem-parsing file sepenuhnya: jika mereka diikuti oleh label (angka dalam tanda kurung) maka Anda dapat menganggap itu adalah pernyataan nyata.

Mencetak gol

Peserta akan dinilai berdasarkan panjang karakter dari program atau fungsi mereka.

Uji kasus

Semua test case ini berasal dari calvinmetcalf / intercal Github repo . Meskipun aplikasi yang bermanfaat akan menerima input apa pun dengan aman, untuk keperluan tantangan ini Anda hanya perlu memperhitungkan lima kasus uji ini.

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

lanjutan.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
sumber
2
Ini membingungkan saya bahwa belum ada yang membuat referensi Cotton Eyed Joe :-).
mınxomaτ
22
INTERCAL is a wonderful languagedownvoted untuk bahasa ofensif.
Fatalkan
Apakah Anda yakin ingin mencetak menurut panjang karakter? Tantangan biasanya dicetak oleh panjang byte di sini.
Fatalkan
@Fatalize Saya memikirkannya sama-sama. Keuntungan umum dari penilaian karakter seperti penyandian angka besar sebagai karakter unicode mungkin tidak akan berguna, tetapi saya berpikir bahwa jika seseorang dapat mengambil keuntungan dari penilaian saya akan tertarik untuk melihat apa yang dapat mereka lakukan.
curiousdannii
Bisakah kita berasumsi bahwa labelnya ada di awal baris? Seperti itu yang ^(\d+)mengambil labelnya?
orlp

Jawaban:

2

JavaScript, 232 byte

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

Untuk dipanggil dengan

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

Penjelasan

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
sumber
1
Mengasapi terbesar di sini adalah menghitung nomor baris, tetapi sebagai penulis tantangan saya pikir saya akan meninggalkannya sebagai upaya mudah untuk mencoba untuk mengalahkan.
curiousdannii