Mengatasi ukuran cluster

37

Muak dengan keandalan penyimpanan flash, Anda memutuskan untuk menyimpan semua program Anda di salah satu disket 1.440 KiB tua yang bagus itu. Namun, setelah menyalin bahkan tidak 3.000 program, disk penuh. Bagaimana itu mungkin? Terampil dalam seni kode golf seperti Anda, sebagian besar program Anda bahkan tidak sepanjang 100 byte, jadi harus ada banyak ruang tersisa ...

Setelah bertanya tentang hal itu di Super User, Anda menemukan bahwa Anda telah dirugikan oleh ukuran cluster sistem file , plot jahat dari desainer FAT12 yang membuat sebagian besar floppy Anda tidak digunakan dan memaksa Anda untuk membeli lebih dari yang sebenarnya Anda butuhkan.

Beli lebih banyak disket? Tak pernah! Ukuran cluster tidak akan terlalu menjadi masalah jika kita hanya menyimpan banyak program dalam satu file, yang dimungkinkan karena kompiler / juru bahasa yang berbeda akan berperilaku berbeda untuk kode sumber yang sama.

Tugas

Tulis polyglot yang cocok dalam satu cluster (512 byte atau kurang) dan selesaikan sebanyak mungkin tugas berikut.

  1. Baca semua input dan cetak.

  2. Cetak Halo, Dunia! .

  3. Baca baris / argumen ( nama ) sebagai masukan dan cetak Selamat Ulang Tahun, [nama]! .

  4. Baca semua input dan cetak tab I love! jika mengandung satu atau lebih tabulasi (0x09) dan saya benci spasi! jika tidak.

  5. Baca dua baris / argumen dan cetak nilai yang benar jika yang kedua adalah substring yang pertama dan nilai yang salah jika tidak.

  6. Baca baris / argumen dan cetak nilai kebenaran jika karakternya berada dalam urutan yang benar-benar naik dan nilai yang salah jika tidak.

  7. Baca baris / argumen dan karakter dan cetak indeks semua kejadian karakter itu.

  8. Baca baris / argumen dan cetak salah satu karakter dengan jumlah kemunculan tertinggi.

  1. Baca dua bilangan bulat antara 0 dan 255 dan cetak jumlahnya.

  2. Baca bilangan bulat tunggal antara 0 dan 255 dan cetak hasil bagi dan sisa pembagiannya sebesar 7 .

  3. Baca bilangan bulat tunggal antara 1 dan 255 dan cetak nilai kebenaran jika itu adalah angka komposit (bukan 1 atau prima) dan nilai palsu jika tidak.

  4. Baca bilangan bulat tunggal antara 1 dan 255 dan cetak nilai kebenaran jika itu adalah kekuatan 2 dan nilai palsu jika tidak.

  5. Baca dua bilangan bulat antara 0 dan 255 dan cetak yang lebih besar.

  6. Baca bilangan bulat desimal antara 0 dan 255 cetak representasi heksadesimalnya.

  7. Baca bilangan bulat tunggal antara 0 dan 255 dan cetak bobot Hamming-nya (jumlah 1-bit).

  8. Baca satu bilangan bulat n antara 1 dan 13 dan mencetak F n , yang n th nomor Fibonacci .

    Misalnya, untuk input 13, cetak 233.

  1. Baca baris / argumen input dan bingkai itu.

    Misalnya, untuk input Programming Puzzles & Code Golf, cetak ini:

    +---------------------------------+
    | Programming Puzzles & Code Golf |
    +---------------------------------+
    
  2. Baca blok karakter persegi panjang dan putar seperempat putaran searah jarum jam.

    Misalnya untuk input

    tye
    xll
    epb
    tma
     id
     sa
    s e
    i r
    hsn
    Tiu
    

    cetak ini:

    This  text
    is  simply
    unreadable
    
  3. Baca bilangan bulat antara 1 dan 40 dan cetak berlian dengan panjang sisi itu.

    Misalnya, untuk input 3, cetak ini:

      /\
     /  \
    /    \
    \    /
     \  /
      \/
    
  4. Cetak ini:

    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    

Mencetak gol

Jawaban yang berhasil memasukkan jumlah program terbanyak dalam satu file yang sesuai dengan cluster 512 byte tunggal menang. Dasi dipecah oleh jumlah byte (lebih rendah lebih baik).

Aturan tambahan

  • Untuk setiap tugas yang Anda klaim untuk skor Anda, file yang sama (byte per byte) harus merupakan program lengkap - dalam bahasa pilihan Anda - yang menyelesaikan tugas khusus ini.

  • Setiap tugas harus diselesaikan dalam bahasa yang berbeda.

    Bahasa dianggap berbeda jika bukan versi yang berbeda dari bahasa yang sama. Misalnya, hanya ada satu JavaScript, satu Python dan satu TI-BASIC, tetapi C, C ++, Octave, dan MATLAB adalah empat bahasa yang berbeda.

  • Bahasa yang dipilih untuk setiap tugas harus memenuhi definisi bahasa pemrograman kami yang biasa .

    Selain itu, bahasa tersebut harus sudah diterbitkan dan diimplementasikan sebelum 9 September 2015.

  • Kompiler / juru bahasa Anda mungkin tidak memerlukan tanda non-standar untuk menghasilkan perilaku yang diharapkan.

    Pengecualian untuk aturan ini mencakup bendera yang diperlukan untuk menentukan bahasa tertentu, untuk membaca program dari file (tunggal) atau untuk menekan banner.

  • Input untuk setiap tugas terdiri dari karakter ASCII yang dapat dicetak (0x20 hingga 0x7E) dan linefeeds (0x0A), dan panjangnya tidak akan melebihi 255 byte.

  • Semua bilangan bulat dapat dibaca dalam desimal atau unary, kecuali dinyatakan sebaliknya dalam tugas.

  • Perilaku untuk input yang tidak valid tidak ditentukan.

  • Anda dapat membaca input dari STDIN (atau alternatif terdekatnya) atau sebagai argumen baris perintah.

    Jika suatu tugas membutuhkan membaca dua potong input, Anda dapat membacanya - dalam urutan apa pun - dipisahkan oleh pembatas satu byte pilihan Anda, sebagai argumen baris perintah yang terpisah atau satu dari STDIN dan yang lainnya sebagai argumen baris perintah.

    Jika salah satu dari potongan input adalah satu baris, satu-satunya pembatas yang mungkin adalah linefeed.

  • Cetak hasilnya ke STDOUT (atau alternatif terdekat). Semua output ke STDERR akan diabaikan.

  • Untuk setiap tugas, aturan standar berlaku.

    Secara khusus, ini termasuk celah yang dilarang secara default , dengan pengecualian hard-coding output , yang secara eksplisit diizinkan untuk tantangan ini.

Dennis
sumber
1
Apakah JavaScript dan CoffeeScript cukup berbeda untuk dianggap sebagai bahasa yang berbeda?
Downgoat
Ya, itu dianggap berbeda.
Dennis
17
tantanganmu # 4 adalah omong kosong> :(
Gagang pintu
Kutipan: Semua output ke STDERR akan diabaikan. Apakah ini berarti bahwa ketika kita memanggil skrip / program dengan 2>/dev/nulldan mendapatkan output yang benar untuk stdout, tidak apa-apa? Hanya untuk memastikan.
Cabbie407
2
@ Cabbie407 Tepatnya. Per konsensus tentang meta , aturan ini sebenarnya berlaku secara default untuk semua tantangan. Saya hanya ingin memastikan bahwa semua orang menyadarinya.
Dennis

Jawaban:

17

12 bahasa, 418 byte

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
 \@-[I love tabs!]o#
  \ >qi---@
( @-[ ]e<''';print hex(
input())#-[I hate spaces!]o#"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"))?(!?)
'''=#print(([1 1;1 0]^int(readline()))[1,2])
#=
Tr is here.
>Tr, Hello, World!
>X Tr
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#=#.91<0#'''#";

Ini tantangan yang menyenangkan. Semakin sulit untuk memasukkan lebih banyak bahasa, tetapi dengan banyak byte yang tersisa saya mungkin bisa melakukan satu lagi.

Manfaatkan bahasa 2D secara serampangan. Perhatikan bahwa karakter di antara baris [ ]on- @-[ ]e<line adalah tab. Juga, ini membutuhkan \nakhir baris agar TRANSCRIPT berfungsi.

Pendahuluan (Tugas 1 / Kucing)

( 
      )?(!?)

?(!?)hanyalah terjemahan langsung dari ,[.,]dalam BF. Prelude ()loop bertindak seperti []loop BF , jadi semuanya mulai dari (di kolom paling kiri hingga )sebelum program inti tidak dieksekusi.

Aturan sintaks Prelude berarti bahwa tanda kurung harus dicocokkan (membaca kolom ke kiri ke kanan), dan hanya ada satu tanda kurung per kolom. Selain itu, bahasa ini cukup mudah untuk digunakan.

Pastikan NUMERIC_OUTPUTdiatur ke Falsejika Anda menggunakan juru bahasa Python.

TRANSCRIPT (Tugas 2 / Halo dunia)

Tr is here.
>Tr, Hello, World!
>X Tr

TRANSCRIPT adalah esolang tematis berdasarkan fiksi interaktif. Jalur yang tidak dikenali oleh TRANSCRIPT diabaikan, sehingga mudah untuk masuk.

Tr is here.mendeklarasikan Trvariabel string, dan baris kedua mengatur isi variabel menjadi Hello, World!. X Tr( Xuntuk memeriksa) kemudian mengeluarkan string.

Meskipun TRANSCRIPT sangat mudah untuk digunakan, ini adalah bahasa yang sangat bertele-tele, jadi saya membuatnya mengambil tantangan termudah.

Fission (Tugas 3 / Pesan Ulang Tahun)

R"Happy Birthday, "[?S"!"*
                   \!/

yang mencetak bagian pertama, memasukkan input dengan loop 2D kecil, kemudian mengeluarkan tanda seru tambahan. Yang Rmenandakan bahwa sebuah atom mulai di sini bergerak ke kanan, yang berguna karena program ini dapat dipindahkan di mana saja.

Rail (Tugas 4 / Tab)

$'main'
 \@-[I love tabs!]o#
  \ >qi---@
  @-[ ]e<
         -[I hate spaces!]o#

Seperti halnya Fission, Rail adalah bahasa 2D yang memiliki keuntungan karena dapat dipindahkan ke mana saja. Eksekusi dimulai dari $dari mainfungsi, menuju tenggara.

Pertama-tama kita turun \s, belok kiri -, memukul [<tab>]yang mendorong tab. e<kemudian cabang berdasarkan EOF - jika EOF, kita kepala ke bawah dan mencetak "I hate spaces!"sebelum berhenti, kalau tidak kita menuju ke atas. Jika kita menuju ke atas, kita membaca char berikutnya dan membandingkannya dengan tab, sekali lagi bercabang - jika tab, kepala ke atas dan cetak "I love tabs!"sebelum berhenti, lain kepala ke bawah dan lanjutkan loop input.

Program ini cukup mahal, tetapi karena TRANSCRIPT mengambil Hello World, sulit untuk memilih dan tugas yang sesuai untuk Rail.

> <> (Tugas 6 / Masukan naik)

"1\"#      \""" "" "


>0[0>i:0(?v:{)?v0n;
       ;n1< .95<


        .91<

Mencetak 1jika benar-benar naik, 0sebaliknya.

> <> adalah bahasa 2D lain, dan eksekusi dimulai dari kiri atas. "..."adalah mode string, mendorong karakter dalam satu per satu. Setelah string pertama yang kita tekan #, yang memantulkan IP ke kiri, mendorong lebih banyak string dan membungkus (> <> adalah toroidal) sebelum memukul \, sebuah cermin yang memantulkan kita ke atas.

Di bagian bawah program adalah .91<, yang mengirim kami ke (9, 1), di mana program inti berada. Setelah ini 0[menghapus semua sampah dari string, 0mendorong nol untuk mewakili karakter yang terakhir dibaca, dan setelah ini hanya membaca karakter satu per satu, memastikan kita masih naik.

Mungkin lebih baik untuk memindahkan program inti ke bawah daripada melakukan teleportasi, tetapi saya akan mengatasinya nanti jika perlu.

Befunge (Tugas 9 / Tambahan)

"1\"# &&+.@

Diuji dengan penerjemah yang ditemukan di sini . Ini adalah program yang cukup mudah, dengan mulai mendorong tali yang tidak berguna dan #melompati ruang. Setelah itu baru program inti &&+.@.

Labyrinth (Tugas 10 / Divmod oleh 7)

"1
 =
 '
 <
""'("']
 ?
 :_7/!\_7%!@

Dengan mudah, 'dan "ada NOP di Labyrinth yang bertindak seperti jalan setapak di labirin. Saya akan melewatkan navigasi yang berantakan, tetapi pada dasarnya ada banyak berbalik dan berkeliaran di sekitar terjadi sebelum kita menekan ?, yang merupakan awal dari program inti.

Program ini tidak cukup rata untuk menghitung Prelude (mis. ?Adalah input baca di Prelude).

Python 2 (Tugas 14 / Heksadesimal)

"1\"# &&+.@\""" "" "
#=
''''
xxx
xxx''';print hex(
input())#xxx
'''
xxx
xxx'''#";

The xxxs mewakili bagian yang tidak relevan komentar oleh string multiline atau komentar. Di antara keduanya print hex(input()), progam inti. Ini output dengan yang terkemuka 0x, tapi saya berasumsi tidak apa-apa (jika tidak, maka itu adalah perbaikan yang mudah pula).

Baris pertama adalah string "1\"# &&+.@\""diikuti oleh dua " "s. Tiga string ini disatukan oleh parser, dan dibiarkan tidak digunakan (baris pertama ini bekerja sama untuk Ruby dan Julia nanti).

GolfScript (Tugas 15 / Berat Hamming)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}

Baris pertama mendorong tiga string, dan baris kedua adalah komentar. ''''mendorong dua string lagi, lalu <<melakukan dua perbandingan ( sdiabaikan). Akhirnya, ""'("'dorong dua string lainnya.

Semua ini adalah sampah kemudian dihapus dengan membungkusnya dalam sebuah array dan mendapatkan elemen pertama ( ]0=), yang merupakan input awalnya pada stack. Kami kemudian mengevaluasi input dengan ~, berubah menjadi biner dengan 2basejumlah bit kemudian {+}*. Berikutnya tidak }ada tandingannya, dan komentar luar biasa dari sisa program.

Julia (Tugas 16, Fibonacci)

"1\"# &&+.@\""" "" "
#=
xxx
xxx=#print(([1 1;1 0]^int(readline()))[1,2])
#=
xxx
xxx=#.91<0#xxx

#=memulai komentar multiline dan =#mengakhiri komentar multiline. Program inti menggunakan eksponensial matriks untuk menghitung angka Fibonacci (diambil dari Rosetta ).

Ruby (bingkai Tugas 17 / ASCII)

"1\"# &&+.@\""" "" "
#=
''''
<<s
xxx
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#xxx

Program ini mengasumsikan bahwa input tidak berakhir dengan baris baru tambahan.

Kami memiliki string yang tidak berguna, komentar, string yang tidak berguna kemudian heredoc yang berkomentar sebagian besar program. Setelah itu adalah program inti, diikuti oleh #komentar satu baris .

CJam (Tugas 19 / Diamond)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("xxx
"
R"xxx"[?S"!"*"
xxx
xxx"ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"xxx
xxx
xxx";

Dua string ruang pada akhir baris pertama adalah untuk memenuhi CJam, karena #=dua operator biner. Saya tidak akan terlalu banyak detail dengan yang satu ini, tetapi pada dasarnya itu berantakan, dengan program inti menjadi belaka

ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>

diantara.

Perbedaan utama antara GolfScript dan CJam adalah bahwa, di CJam, kutipan tunggal 'tidak memulai dan mengakhiri string, tetapi sebaliknya mendorong karakter berikutnya ke stack. Ini berarti bahwa dalam CJam

'("'

mendorong a (lalu mulai string dengan "(karakter pertama adalah '), sedangkan di atas hanya string tunggal lurus dalam GolfScript.

Cobalah online . 1>digunakan alih-alih (untuk menjelaskan Prelude.


Berikut 12 bahasa, 373 byte . Beberapa tugas telah berpindah, TRANSCRIPT telah dihapus (itu membuat Rail terlalu mahal) dan Skema (ayam) telah ditambahkan. Ini hanya lapangan golf saya untuk pembaruan yang akan datang karena memperbarui posting utama selamanya.

"1\"09!#.&&+.@"" "" "#|"
#=
''''
<<s
11]0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
(-[Hello, World!]o#''';print(input()in input());'''"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"=#print(([1 1;1 0]^int(readline()))[1,2])#=)?(!?)
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a# =##'''#";e# |#(print(format"~x"(eval(read))))

Saya bisa menyimpan beberapa byte untuk Julia karena komentar multiline yang tidak dikuatkan meningkatkan kesalahan pada STDERR.

Sp3000
sumber
Hal yang bagus. Apa tugas TRANSCRIPT?
Cabbie407
@ Cabbie407 Saya masih mencoba untuk mengoptimalkan bahasa mana mendapatkan tugas mana, tetapi saat ini TRANSCRIPT telah mengambil Hello World, dan Rail telah berubah menjadi tugas tab.
Sp3000
Ah, sekarang saya bisa melihatnya ;)saya menunda-nunda mengubah apa pun dalam jawaban saya, karena deskripsi panjang. lol
Cabbie407
26

7 8 9 10 bahasa, 398 431 447 507 byte

Ini mungkin yang paling cocok untuk solusi saya saat ini.

#if      + 0+0/*^",v  +- '[.,][[" ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
a=0--0;b=input();print(sorted(set(b))==list(b));[[""""                 ^ <
print("Hello, World!")--[[vv? +<
#endif/*  >.!0 + +1ffr"!"~< */
#include<stdio.h>/*>:1 +?!^>i:1^*/
int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1//**/1==2
){printf("%x",/*>&:7/.7%.@*/i);}else{for(;--i-1>0;a=b,b=c)c=a +b;printf("%d",b);}}/*]]--"""]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J "` + +,*.]]]*/SSSTNSSNSNSTNTTTTTSSSTNSNSTNTTTTTTSSTNTTSNSSNNSSSNTTTTNSTNNNN

Baris terakhir berisi kode Whitespace yang dikodekan sehingga SE tidak memakannya. Untuk menjalankan kode, ganti semua Sdengan spasi, Tdengan tab dan Ndengan baris baru.

C89, tugas 16

Inilah yang dilihat oleh kompiler:

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1/ 1==2
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Segala sesuatu yang lain dilucuti sebagai komentar atau di dalam #if 0.

C ++, tugas 14

Saya menggunakan trik yang dicuri dari sini untuk membedakan antara C89 dan C ++.

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Lua, tugas 2

Inilah struktur dasarnya.

#comment
a=0--comment
print("Hello, World!")--[[
... multiline comment ...
]]--comment

Brainfuck, tugas 1

Saya hanya harus memastikan tidak ada loop atau nyasar yang tak terbatas .,ditemukan. Komentar multiline Lua juga dua kali lipat sebagai komentar BF. Semuanya terpisah dari 2 karakter pertama adalah loop NOP besar.

++,+-[.,][[,+++.+<--[[<,--[[+<>.++<<.>>+>,,,,,>..--->,+,]]--]]+++-+[++,.]]]

Python, tugas 6

Sekali lagi, saya menggunakan fitur khusus bahasa untuk NOP atau mengomentari kode lainnya.

#comment
a=0--0;b=input();print(sorted(b)==list(b));[["""
... multiline string ...
"""]];#comment

Pyth, tugas 17

Pyth bagus untuk hal ini. Dibutuhkan yang pertama #sebagai while True:loop yang keluar secara diam-diam karena kesalahan . Jadi, saya hanya membuat sebagian besar kode string (untuk menghindari ;s mengakhiri loop awal), kemudian hanya mengakhiri loop, keluar dari yang lain yang dibuat oleh komentar Python dan melakukan tugas. Ini dia dengan semua string non-kosong diganti dengan " string ", itu masih setara secara fungsional:

#if      + 0+0/*^" string " ,yadhtrib yppaH" string """" string "Hello, World!" string "!"  string "%d"  string "%x" string "%d" string """]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J " string

> <>, tugas 3

Yang ini sangat menarik. Eksekusi memantul di dalam kode, menggunakan lompatan di mana diperlukan untuk mengatasi hambatan. Bagian yang relevan:

#                  v            " ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
                   i                                                   ^ <
                   !      vv? +<
          >.!0 + +1ffr"!"~<
                   >:1 +?!^>i:1^

Starry , tugas 9

Di sini saya harus mulai masuk ke bahasa "buang semua karakter kecuali". Ada lagi yang dilucuti, sepertinya:

      + +*,  + '., , + + +. +*                  ,  +*  . + + *.* +*  ,,,,**,*..*, +,* + + +* + ` + +,*.*

Kode melewatkan sebagian besar tanda baca dengan lompatan untuk menghindari kesulitan, hanya menggunakan awal dan akhir kode. Kode ini secara fungsional setara dengan

      + +*,  + + +,*.*

Befunge-98, tugas 10

Bekerja serupa dengan> <> satu. Untungnya, #adalah cermin di> <> dan lompatan di Befunge, sehingga kita dapat menerapkan perilaku yang berbeda. Juga 0/0 == 0,.

#if      + 0+0/*^
                >&:7/.7%.@

Spasi , tugas 13

Ini adalah hal terakhir yang saya cocokkan. Beberapa baris pertama hanya mendorong nol ke stack, karena mereka hanya berisi spasi dan baris baru dari kode "normal". Kode dikodekan; ganti semua Sdengan spasi, Tdengan tab dan Ndengan baris baru.

SSSSSSSSSSSSSSSN
SSSSSSSSSSSSSSSSSSN
SSN
SSSSSN
SN
SSN
SSSSSSSSSSSTN
SSN
SN
STN
TTTTTSSSTN
SN
STN
TTTTTTSSTN
TTSN
SSN
N
SSSN
TTTTN
STN
N
N
PurkkaKoodari
sumber
9

17 versi Pip yang berbeda, 383 byte (tidak valid)

Sementara pertanyaan ini di-sandbox, saya menyisir semua revisi bahasa saya, Pip, dan muncul dengan polyglot menggunakan 17 di antaranya. Sedihnya, versi-versi dengan bahasa yang sama tidak diizinkan oleh peraturan tantangan sekarang, tetapi dengan izin Dennis dan penafian saya tetap memposting pekerjaan saya.

Kode mentah

I!ga:0m@0:0v:uIN[(oTM0,0i)EN1N1Y1RCkw(hR`1.+0``&2o`)@>3@AB0`u`rZ4AB6({a}V7)BN8AZ9@m]Iv<2W##YqlPByc:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}m:'+.'-X#a+2.'+.n."| "Iv=5La{i+:oSio}j:ak:bPv=11?a>1&0INa%(2,a)[((J_M ZRVl)|0)Jnl?lJnlcJnd.n.RVdm.a.RVmih:$+TBa({j@aEQk}FI0,#a).saTB16a>b?abh=1ua//7.s.a%7a+bbINa"Happy Birthday, ".a.'!"Hello, World!"]@v

Strateginya

Di Pip, huruf kecil adalah variabel. Huruf besar lebih rumit: mereka dipecah menjadi menjalankan paling banyak dua karakter, yang bisa operator atau variabel. Jika token huruf besar tidak secara khusus didefinisikan sebagai variabel atau operator, itu diasumsikan sebagai variabel yang tidak ditentukan, yang mengevaluasi nihil.

Jadi, untuk membedakan antara dua versi Pip, saya hanya perlu menemukan beberapa operator variabel atau alfabet yang ditambahkan di yang lebih baru dari keduanya. Di yang lebih tua, itu akan menjadi nol. Kode v:uIN[...]mengumpulkan daftar besar yang berisi salah satu pemeriksaan ini untuk setiap versi yang ingin saya uji, mencari tahu berapa banyak nil yang ada dalam daftar itu ( uvariabel secara eksplisit diinisialisasi ke nil), dan menyimpan nomor dalam v(untuk "versi") .

Setelah beberapa perhitungan lain, ada daftar besar lain yang menghitung hasil untuk 17 tugas dari tantangan dan digunakan vuntuk memilih satu berdasarkan versi apa ini.

Versi dan tugas

0.15.09.04

Diagnostik: (oTM0,0i)(memperbaiki bug dengan operator Tri di Mmana pemangkasan 0 karakter dari setiap ujung string akan memberikan string kosong sebagai gantinya; pengindeksan ke string kosong memberikan nihil)

Tugas 18: Iv<2W##YqlPBy(setup: baca semua baris dari stdin jika vkurang dari 2) diikuti oleh ((J_M ZRVl)|0)Jn(membalikkan daftar baris, transpos, dan bergabung kembali ke string)

0.15.08.06

Diagnostik: EN1(ditambahkan ENoperator umerate)

Tugas 1: Iv<2W##YqlPBy(kode pengaturan yang sama seperti di atas) diikuti oleh l?lJnl(gabung di baris baru)

0.15.08.03

Diagnostik: 1N1(ditambahkan Nsebagai versi singkat dari INoperator)

Tugas 20: c:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0(pengaturan: buat daftar yang berisi bagian papan catur atas dan bawah dan simpan di c) diikuti oleh cJn(gabung di baris baru)

0.15.08.01

Diagnostik: Y1(tambah Yoperator pergelangan kaki)

Tugas 19: Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}(setup: jika v3, bangun setengah dari berlian di d) diikuti oleh d.n.RVd(mundur untuk bagian bawah dan bergabung di baris baru)

0.15.06.19

Diagnostik: RCk(menambahkan Random COperator hoice)

Tugas 17: m:'+.'-X#a+2.'+.n."| "(setup: build +----+\n| string in m) diikuti oleh m.a.RVm(bungkus input masuk mdan mundur dari m)

0.15.06.12

Diagnostik: k( kvariabel yang diinisialisasi ke ", "; sebelumnya tidak ditentukan dan dengan demikian nihil)

Tugas 16: Iv=5La{i+:oSio}(jika v5, hasilkan angka Fibonacci i) diikuti olehi

0.15.06.08 (catatan: nomor versi tidak diubah hingga komit berikut)

Diagnostik: w( wvariabel yang diinisialisasi ke `\s+`)

Tugas 15: h:$+TBa(konversi input ke biner dan jumlah digit; simpan hasilnya huntuk tugas 12 nanti)

0.15.05.29

Diagnostik: (hR`1.+0``&2o`)@>3@AB0

Versi ini ditambahkan &sebagai pola penggantian untuk seluruh string yang cocok dalam penggantian regex (terinspirasi oleh sed). Kode di atas mengambil h( 100) dan menggantinya dengan `&2o`(yaitu "1002o"dalam versi yang lebih baru tetapi hanya "&2o"dalam versi yang lebih lama). Itu kemudian mengiris semua karakter setelah 3 ( "2o"dalam versi yang lebih baru, ""dalam versi yang lebih lama) dan upaya untuk mengindeks ke dalam string itu. Pengindeksan ke string kosong memberi nol.

Tugas 7: j:ak:b(setup: menyalin vars lokal a, bke vars global j, ksehingga mereka akan tersedia di dalam fungsi) diikuti oleh ({j@aEQk}FI0,#a).s(filter untuk indeks di amana karakter yang sesuai sama b, dan bergabung di luar angkasa)

0.15.05.26

Diagnostik: `u`(menambahkan tipe Pola; dalam versi sebelumnya, backticks diabaikan sebagai karakter yang tidak dikenal, dan ekspresi dievaluasi menjadi u, yang nihil)

Tugas 14: aTB16(convert To Base 16)

0.15.05.24

Diagnostik: rZ4(membuat rvariabel khusus yang mengembalikan nilai acak antara 0 dan 1 setiap kali direferensikan; sebelumnya itu tidak terdefinisi dan dengan demikian ekspresi dievaluasi menjadi nol)

Tugas 13: a>b?ab(ekspresi ternary)

0.15.05.12

Diagnostik: rZ4(ditambahkan Zoperator ip)

Tugas 12: h=1(jumlah bit dari tugas 15 harus sama dengan 1)

0.15.05.11

Diagnostik: AB6( ABoperator nilai tambah terlarut)

Tugas 11: Pv=11?a>1&0INa%(2,a)[...]@v(jika v11, keluaran 1jika input lebih besar dari 1 dan jumlah yang lebih kecil membaginya dengan tepat, 0jika tidak; jika vada hal lain, gunakan vsebagai indeks pada daftar untuk memutuskan apa yang akan dihasilkan)

0.15.05.02

Diagnostik: ({a}V7)( Voperator ditambahkan ; ketika Vtidak ditentukan, ini mengirimkan argumen nil dan 7 ke fungsi {a}yang mengembalikan argumen pertamanya)

Tugas 10: a//7.s.a%7(input dipisahkan oleh 7 dan mod 7, dipisahkan oleh ruang)

0.15.04.26

Diagnostik: BN8(ditambahkan operator Begation itwise N)

Tugas 9: a+b

0.15.04.23

Diagnostik: AZ( AZvariabel yang diinisialisasi ke huruf besar)

Tugas 5: bINa( INmemberikan jumlah kemunculan)

0.15.04.20

Diagnostik: m@0:0diikuti oleh9@m

The mvariabel preinitialized untuk 1000. Dalam hal ini komit, yang @operator yang tetap untuk kembali lvalues; sebelumnya, menugaskan untuk m@0memberi peringatan dan tidak melakukan apa pun. Dengan demikian, pasca-bugfix, pernyataan set pertama muntuk 0000, yang merupakan indeks hukum bagi 9; pra-bugfix, mtetap 1000, yang bukan indeks hukum. (Indeks belum siklus.)

Tugas 3: "Happy Birthday, ".a.'!

0.15.04.18

Semua diagnostik sebelumnya menghasilkan nihil yang ditambahkan ke daftar diagnostik.

Tugas 2: "Hello, World!"


Sebagian besar kode lain adalah tweak yang harus saya buat untuk menghindari kesalahan dalam berbagai versi. Posting ini sudah terlalu lama, jadi jika Anda ingin tahu tentang sesuatu yang belum saya jelaskan, mari kita diskusikan ke chatroom bahasa esoterik .

DLosc
sumber
4

6 bahasa, 226 byte (229 tergantung bagaimana \x1bditerima!)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));/*
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Jadi, saya pikir saya tidak membuat pilihan bahasa yang terbaik dan saya membayangkan ini tidak terlalu kompetitif tetapi saya menemukan ini tantangan yang menarik! Secara keseluruhan, tidak banyak tantangan yang bisa diselesaikan, tetapi saya mungkin bisa memilih tantangan di ruang putih atau yang serupa, tapi inilah yang saya miliki sejauh ini:


1. Brainfuck

[+.]>>+[>,]<[<]>>[.>]>[<.[],[][,],,[],[].]

Diuji pada http://copy.sh/brainfuck/ dan http://brainfuck.tk/ .

Setelah menghapus semua karakter yang diabaikan, program di atas adalah yang tersisa, yang merupakan contoh program kucing dengan beberapa loop kosong untuk memotong penggunaan bahasa lain dari simbol.

2. Ruby

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Pemakaian:

ruby cluster

Kode di atas adalah setelah semua komentar dihapus. Baris pertama adalah sepenuhnya tidak berguna di Ruby seperti yang kita mendefinisikan beberapa ekspresi reguler untuk mengandung Befunge-93 dan brainfuck kode, maka kita membuat array mengandung Hellodan Worlddan mencetaknya menggunakan printf(untuk menambahkan ,dan !).

3. Perl

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Pemakaian:

perl cluster <name>

Sangat mirip dengan Ruby, kecuali karena kita menyimpan referensi array $a, ketika kita mencoba mengaksesnya $a[0]kosong, jadi kita bisa menggantinya dengan teks untuk tantangan 3, Happy Birthdaydan pop(yang menunjukkan argumen terakhir ke program baris perintah ).

4. JavaScript

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;
$a=['Hello','World'];
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Penggunaan: rekatkan ke konsol browser dan jalankan.

Sama seperti Ruby dan Perl, baris pertama pada dasarnya menciptakan RegExpobjek yang tidak berguna , kami kemudian menyimpan array yang tidak berguna di $adan instantiate dua string yang tidak berguna, satu berisi kode Ruby / Perl dan satu berisi baris baru dan a #, lalu kami prompt()untuk input dan alert()hasil yang diharapkan oleh kebanyakan manusia untuk tantangan 4. Kita akhiri dengan objek lain yang tidak berguna RegExpuntuk menutup loop brainfuck.

9. Befunge-93

/&&#[+.#]@

Diuji pada http://www.quirkster.com/iano/js/befunge.html .

Seperti yang saya pahami, /bagi tumpukan dan dorong hasil yang tidak memiliki efek buruk kecuali mendorong NaNdi situs di atas, &meminta input bilangan bulat sehingga kami membaca kedua angka yang diperlukan oleh tantangan 9 ke dalam tumpukan, #memastikan kami melewati [yang ada untuk brainfuck, +lalu menambahkan dua angka teratas di tumpukan, .mengeluarkannya, #]untuk brainfuck lagi dan @keluar.

13. PHP (berjalan dalam Bash)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));

Pemakaian:

php cluster <x> <y>

Dalam PHP, apa pun yang tidak termasuk dalam <?tag adalah keluaran kata demi kata, jadi ini mengeluarkan kode Befunge-93 dan brainfuck sehingga kami die()segera dalam kode, menampilkan layar yang jelas ( \x1bc) lalu max()dari dua argumen pertama.

Dom Hastings
sumber
Anda dapat memasukkan karakter ESCape literal ke dalam string literal, cukup tambahkan catatan bahwa karakter itu ada di sana ( the first character in the first string literal is the byte ASCII 27); skor Anda adalah 226.
kucing
@cat Ya, saya pikir Anda benar, saya telah pergi apa adanya untuk saat ini, tapi saya memasukkan 226 judul. Saya sudah lupa betapa saya menikmati tantangan ini, saya mungkin bisa melakukan sedikit lebih banyak sekarang dan menggunakan ES6 yang saya bisa .match'\x09'(di mana 'adalah `) mungkin saya akan melihat apakah saya dapat menambahkan lebih banyak di beberapa titik!
Dom Hastings
4

6 bahasa, 450 404 byte

bash, brainfuck, C, gawk4, JavaScript dan Minimal-2D

/*\t/#[R,+/D
/\t/ # UL.-L<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/#*/
#define func
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#//]++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<[>>>>>+++[<++++[<<....>....>-]<<<.>>>>-]<<<[>>+<<-]<[[>+<-]<]>>-]

Perbarui: Menurunkannya sedikit. Masih tidak yakin apa yang harus ditambahkan, dan saya tidak yakin bagaimana anggota yang bersaing akan berpikir tentang saya menggunakan bahasa mereka untuk tugas yang berbeda. Mencoba menjelaskan algoritma brainfuck.

Nah ini pengalaman poliglot pertamaku, jadi aku harus belajar semuanya dari awal. Memulai dengan awk bukanlah ide yang paling cerdas menurut saya, karena itu relatif tidak memaafkan. Karena jumlah tugas yang diselesaikan relevan, saya mulai dengan tugas yang paling mudah terlebih dahulu. Tidak yakin apakah itu langkah cerdas. Ini tidak terlalu banyak golf, karena saya cukup kesulitan membuat keenam ini bekerja bersama, tetapi saya melakukan apa yang saya bisa untuk membuatnya singkat.

Berikut adalah bahasa dan apa yang mereka lakukan dalam urutan abjad. Saya akan menunjukkan cara mudah untuk menguji mereka semua lebih jauh ke bawah. Karena beberapa di antaranya mungkin versi khusus, saya akan memberi Anda nomor versi alat yang saya gunakan.

bash, tugas 3

Yah, sudah jelas bahwa saya menggunakan sed. Saya mencoba untuk menempatkan skrip sed dalam entah bagaimana, tapi saya tidak bisa membuatnya bekerja, jadi saya pergi rute bash. Cara saya mengirimkannya, ada di dalam komentar C dan awk mengevaluasinya False.

sed --version memberi sed (GNU sed) 4.2.2

bash --version memberi GNU bash, Version 4.3.30(1)-release (x86_64-pc-linux-gnu)

Jadi bagian sed turun ke

sed "s/^\(.*\)$/Happy Birthday, &!/;q"

Ini mengelompokkan input, menempelkannya ke string baru dan mencetak hasilnya. Hal yang cukup umum.

brainfuck, tugas 20

Yah ini selalu mudah disembunyikan kurasa. Baris yang dimulai dengan #//diabaikan oleh C dan awk. Atau setidaknya mereka bisa hidup dengan sampah di belakangnya.

bf memberi bf - a Brainfuck interpreter version 20041219

Ini adalah kode kental. Baris pertama hanya sampah dari bahasa lain.

[,+.-<>.+.++.<>.,,,,[][][++]++<[--][]]
++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<
[>>>>>+++[<++++[<<....>....>-]<<<.>>>>-]<<<[>>+<<-]<[[>+<-]<]>>-]

Saya akan mencoba menjelaskan cara kerjanya

++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<

ini mengatur kaset dan penunjuk untuk ini

0 8 10 46 64 C2 C1
  ^

holding cell 8 adalah counter global untuk loop berikut
ini berapa kali 3 baris yang sama dicetak

[>>>>>+++

set C1ke 3, jumlah baris yang sama

    [<++++

set C2ke 4, jumlah " ....@@@@" dalam satu baris (di awal)

        [<<....>....>-]<<<.>>>
    >-]

mencetak garis lengkap yang mengalami decrementing C2dalam proses
ketika C2nol menghasilkan garis baru dan penurunan C1.

jika C1nol, keajaiban terjadi

    <<<[>>+<<-]
    <[[>+<-]<]

46 bergerak di belakang 64
, 10 dan global counter digerakkan satu ke kanan

>>-]

maka penghitung global akan dikurangi
jika nol keluar dari program

C, tugas 2

Saya menghabiskan setiap kemampuan kecil terakhir dari C di sini dengan mencetak "Halo, Dunia!". Nah, seseorang harus melakukan pekerjaan ...

gcc --version memberi gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2

Kode C aktual

#define func
func main(){puts("Hello, World!");}
#

The #define funcadalah untuk membuat awk baik saja dengan ini. Menurutnya ini adalah fungsi awk. Singkatan ke func adalah fitur gawk.

gawk4, tugas 18

Karena saya telah menggunakan awk untuk hampir semua hal di sini, saya memutuskan, bahwa harus ada dalam ini.

awk --version memberi GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p11, GNU MP 6.0.0)

Awk melihat ini

/*\t/
/\t/
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#

Pola pencarian termasuk \tevaluasi untuk false. Saya memilih tab di sini, karena saya pikir itu tidak bisa di input. sedmengevaluasi ke false. "the string"&&0mengevaluasi ke false. Fungsinya oke. Program dijalankan jika pola kosong cocok, yaitu untuk setiap input.

Itu yang terjadi

Memasukkan

elaic
parli
ucfit
srigs

Keluaran

supe
rcal
ifra
gili
stic

Anda harus memastikan semua jalur input memiliki panjang yang sama. Gunakan spasi untuk mengisinya.

JavaScript, tugas 9

Saya tidak yakin apakah ini sah, karena ini terlalu mudah. Jika Anda memberikan akhir file program html, dan membukanya di browser (saya menggunakan Firefox 40.0.3 dan chrome 45.0.2454.85) itu meminta Anda untuk input. Anda harus memasukkan dua angka yang dipisahkan oleh spasi, dan itu akan mengingatkan jumlah itu.

<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>

Minimal-2D , tugas 1

Ini cukup mudah untuk dimasukkan ke dalam baris komentar. Saya menggunakan penerjemah , yang berjalan dalam python, untuk menguji ini. Ini mencetak input ke output. Programnya terlihat seperti ini

R,+/D
UL.-L

RUDL benar, atas, bawah dan kiri. Jadi itu mulai berjalan dengan benar, membaca karakter dari stdin ke memori dan menambahkan satu. Slash melewatkan perintah selanjutnya jika memori memiliki nilai 0. Ini untuk mengakhiri ini. Jika karakter dengan nilai -1 dibaca, input telah berakhir. Jadi, jika -1 dibaca, lewati D dan berakhir. Jika sesuatu yang lain dibaca turun ke kiri, tambahkan 1 kembali ke memori dan cetak karakter ke stdout. Lalu ia pergi ke kiri dan ke atas dan memulai dari awal.

Pengujian

Penafian: Saya tidak akan bertanggung jawab atas segala kerusakan yang Anda lakukan pada sistem Anda dengan ini.

Ini dengan asumsi Anda memiliki bash & co, gawk (setidaknya versi 4, karena ini menggunakan array multidimensi), gcc, python, bf sebagai juru bahasa brainfuck dan Firefox diinstal.

Untuk membuatnya mudah, salin sumber program ke file bernama cluster.html. Jadikan file itu dapat dieksekusi untuk tugas bash. Salin dan tempelkan juru bahasa untuk Minimal-2d ke file yang bernama minimal2D.pydi direktori yang sama. Kemudian salin dan tempel skrip berikut ke file skrip dan masukkan ke direktori yang sama, buatlah itu dapat dieksekusi dan jalankan ... yah, dengan siapa saya berbicara. Jika Anda membaca ini, Anda mungkin tidak perlu banyak penjelasan dan akan tetap menjalankannya.

#!/bin/bash
# Task  3: bash
echo "Dr. Hfuhruhurr" | ./cluster.html 2>/dev/null;echo
# Task 18: awk 
printf "elaic\nparli\nucfit\nsrigs\n" | awk -f cluster.html 2>/dev/null;echo
# Task  2: C
cp ./cluster.html ./cluster.c;gcc -w -o cluster cluster.c;./cluster;rm cluster cluster.c;echo
# Task  1: Minimal-2D
python minimal2D.py cluster.html <<<"This
has
to be
copied     !!!";echo
# Task 20: brainfuck
bf cluster.html;echo
# Task  9: JavaScript
firefox cluster.html 2>/dev/null
#google-chrome cluster.html 2>/dev/null

Di sana Anda juga menemukan perintah untuk menjalankan tes secara individual.

Selamat bersenang-senang!

Cabbie407
sumber
Si brengsek itu punya masalah; kode memiliki kurung tidak seimbang dan tidak akan berjalan dengan benar (Anda harus menjalankan seluruh file, bukan hanya bagian yang relevan). Juga, kotak-kotak kotak sebenarnya 4x3 bukannya 4x4 agar terlihat lebih persegi dalam teks.
PurkkaKoodari
Terima kasih atas petunjuknya. Baik itu berjalan dengan baik di sini. Saya selalu menjalankan seluruh file seperti yang Anda lihat di skrip saya. Tidak yakin apakah penerjemah harus memeriksa tanda kurung sebelum dijalankan. Punyaku tidak masalah. Tapi saya mengabaikan hitungan garis itu. Harus mengubahnya.
Cabbie407
Yah saya melihatnya lagi dan saya harap saya memperbaikinya.
Cabbie407