Masukkan baris dalam kode yang Anda kacang dan kocok semuanya

10

Dengan menggunakan satu bahasa pemrograman, tulis 5 program single-line, yang masing-masing mengeluarkan baris berbeda dari ayat pertama dengan lagu 1972 karya Harry Nilsson " Coconut " ketika dijalankan secara terpisah:

Saudara membeli kelapa, dia membelinya untuk sepeser pun
Kakaknya memiliki satu sama lain, dia dibayar untuk kapur
Dia meletakkan kapur di kelapa, dia minum mereka berdua
Dia meletakkan kapur di kelapa, dia minum mereka berdua
Dia Taruh jeruk nipis di kelapa, dia minum mereka berdua

( lirik lengkap )

3 baris terakhir memiliki lirik yang sama, jadi 3 program terakhir Anda mungkin juga sama.

Ada 5 faktorial atau 120 cara 5 program lini-tunggal ini dapat diatur satu per baris dalam program 5-jalur tunggal. Anda harus mengoptimalkan program single-line Anda sedemikian rupa sehingga sebanyak 120 kombinasi ini mungkin program 5-line menghasilkan seluruh ayat dalam urutan yang tepat , persis seperti yang muncul di atas.

Contoh

Jawaban paling sederhana akan memiliki 5 pernyataan cetak satu baris, 3 identik terakhir:

print('Brother bought a coconut, he bought it for a dime')
print('His sister had another one, she paid it for a lime')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')

Output ke program 5-line akan menjadi ayat dalam urutan yang tepat selama dua single-liner pertama berada di tempat yang benar. Hanya 6 dari 120 kemungkinan pengaturan yang menyelesaikan ini.

Mencetak gol

Pengajuan dengan kasus yang paling berhasil dari 120 kemenangan. Tie breaker pergi ke set program dengan jumlah byte kumulatif terendah (baris baru tidak dihitung). Contoh ini memiliki 309 byte.

Detail

  • Program Anda mungkin tidak membaca kode sumbernya sendiri. Mereka juga tidak boleh membaca file eksternal lain atau memerlukan koneksi jaringan.

  • Output ke stdout atau alternatif terdekat. Anda juga dapat menampilkan ke file dengan nama pilihan Anda.

  • "Program baris tunggal" adalah string yang berisi karakter apa pun kecuali terminator baris (Anda mungkin hanya perlu khawatir tentang baris baru).

  • Saat menyusun single-liner menjadi 5-liner, Anda harus menambahkan tepat 4 baris baru, satu di antara setiap pasangan single-liner yang berdekatan. Anda secara opsional dapat menambahkan baris tambahan.

Hobi Calvin
sumber
"Tulis 5 program yang masing-masing menampilkan baris yang berbeda ..." bukankah itu mustahil?
feersum
@feersum Baris berbeda. Tiga dari mereka kebetulan memiliki teks yang sama.
Calvin Hobi
Bagaimana jika saya memiliki file Java yang berisi 5 kelas, masing-masing dengan mainmetode? Lalu mana yang harus dijalankan, saat menjalankan program?
feersum
@feersum Nah apa yang dilakukan kompiler Anda? Saya tidak yakin apa yang dilakukan Java ketika beberapa kelas dalam file yang sama memiliki keduanya main.
Hobi Calvin
2
Cara saya mengingat yang satu ini adalah bahwa satu iklan Coca-Cola di mana mereka "memasukkan jeruk nipis ke dalam Coke" ...
Joe Z.

Jawaban:

9

CJam, 120 permutasi yang valid, 334 299 290 bytes

"She put the lime in the coconut, she drank them both up"N+
"Brother bought a coconut, he bought it for a dime"N+]$~
"She put the lime in the coconut, she drank them both up"N+
"His sister had another one, she paid it for a lime"N+]$~
"She put the lime in the coconut, she drank them both up"N+

Logika yang cukup sederhana:

  • Letakkan setiap baris lagu di masing-masing dari 5 program
  • Bungkus semuanya di tumpukan dalam sebuah array
  • Sortir susunannya
  • Buka gulungan array sehingga program selanjutnya dapat menggunakan logika yang sama
  • Di setiap langkah, kami memiliki lirik sebagian dalam array. Untungnya, mengurutkan array memberikan urutan lirik yang benar.

UPDATE : Ternyata Anda tidak memerlukan siklus wrap-sort-unwrap setelah 3 yang serupa dan muncul di baris akhir lagu. Saya bisa menjelaskan mengapa jika tidak jelas :)

Pengoptimal
sumber
8

Prelude , 120 permutasi, 2045 2035 byte

9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                          (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+9409-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-5809-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-99+58992++96+99+09-9-9-3-                                             (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                 (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+993+09-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-49197+09-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-595+96+09-9-9-9-9-9-9-1-99+58992++96+95+109-9-9-9-9-9-9-1-41809-9-9-9-9-9-9-1-99+5992++991++9991++09-9-9-9-9-9-9-1-991++909-9-6-                                                           (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                                                   (9+9+9+9+9+9+9+9+9+9+6+!)

Ini akhirnya meyakinkan saya bahwa Prelude dan CJam membutuhkan anak. Jika bukan karena rangkaian instruksi Prelude yang sangat terbatas, pengajuan ini sebenarnya akan sangat kompetitif, jika itu bahkan tidak mengalahkan CJam.

Ide dasarnya adalah sebagai berikut

"push line 4"               print
"push line 1"print
"push line 3"          print
"push line 2"     print
"push line 5"                    print

Dalam Prelude, setiap baris adalah "suara" sendiri dengan tumpukannya sendiri, dan suara-suara ini dieksekusi secara paralel. Yaitu, dalam program lengkap, setiap baris hanya akan membuat string secara individual dan mencetaknya di akhir. Tetapi karena offset dari pernyataan cetak, urutan garis tidak menjadi masalah sama sekali untuk urutan output, karena eksekusi dibiarkan dari kiri ke kanan, bukan dari atas ke bawah.

Sekarang, mengapa garisnya begitu panjang? Prelude hanya menyimpan angka pada stack-nya. Selain itu, ini hanya dapat mendorong angka satu digit pada satu waktu, sehingga angka yang lebih besar harus dibangun dari penjumlahan dan pengurangan (tidak ada perkalian baik atau aritmatika lainnya juga). Jadi bagian terbesar dari kode hanyalah menghitung dan mendorong kode karakter yang tepat. Untuk mempersingkat ini sedikit, saya mengimbangi dengan 96. Pada akhirnya, untuk mencetak, saya loop sampai tumpukan kosong (yaitu a 0ditemui), tambahkan 96 ke setiap nomor, dan cetak.

Perhatikan bahwa string didorong mundur, karena mereka dicetak dari karakter terakhir ke karakter pertama.

Ini mengasumsikan interpreter Python dengan NUMERIC_OUTPUT = False(yang adalah bagaimana spec mendefinisikan I / O).

Saya menggunakan kode CJam berikut untuk menghasilkan konstruksi string:

"Brother bought a coconut, he bought it for a dime
"W%{i96-_0<{zLa*9/:,'-*'-+0\+}{La*9/:,_,'+*W<}?}%

Terakhir, hanya untuk bersenang-senang, mengapa saya pikir ini akan sangat singkat jika Prelude memiliki konsep string:

"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emid a rof ti thguob eh ,tunococ a thguob rehtorB"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emil a rof ti diap ehs ,eno rehtona dah retsis siH"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!

Sekarang pernyataan cetak !sudah dalam urutan yang benar, jadi saya bahkan tidak perlu mengimbanginya. Saya pikir saya akan turun untuk mengimplementasikan ini beberapa waktu.

Martin Ender
sumber
7

Ruby, 120 permutasi yang valid, 430 byte

$*[1]='His sister had another one, she paid it for a lime';a||=at_exit{puts($*-[p])}
$*[0]='Brother bought a coconut, he bought it for a dime';a||=at_exit{puts($*)}
$*[2]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[3]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[4]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}

Bekerja dalam urutan apa pun, atau secara individu. Setiap baris memodifikasi keadaan global, lalu menetapkan hook untuk dieksekusi di akhir program kecuali hook telah ditetapkan.

histokrat
sumber
Pertanyaannya mengatakan "5 program single-line". Bukankah ini berarti setiap baris harus dalam program yang terpisah? Tidak semuanya?
bacchusbeale
1
Hanya pertanyaan tentang pemformatan. Setiap baris berfungsi sebagai programnya sendiri.
histokrat
6

> <> , 120 permutasi, 703 byte

<    /a"emid a rof ti thguob eh ,tunococ a thguob rehtorB"0a.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<   / a"emil a rof ti diap ehs ,eno rehtona dah retsis siH"09.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<  /  a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"08.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
< /   a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"07.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
</    a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"06.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"

Pembatasan satu-liner cukup sulit untuk bahasa 2D, jadi saya harus menemukan cara untuk memaksimalkan .instruksi teleportasi.

Awal <membuat program mengalir ke kiri, membungkus dan menjalankan

"o;?=0l>\\\\\\/////"15p26p37p48p59p75p76p77p78p79p7ap8ap9apaapbapcapdap

Ini adalah serangkaian pinstruksi (menempatkan) yang menempatkan karakter sampai papan terlihat seperti ini:

<    /<lyrics1>0a.#.!50<blah>
<   / <lyrics2>09.#.!50<blah>
<  /  <lyrics3>08.#.!50<blah>
< /   <lyrics4>07.#.!50<blah>
</    <lyrics5>06.#.!50<blah>
 /     \
  /    \
   /   \
    /  \
     / \
       >l0=?;o

Program #.!50membalik kemudian mengalir kembali ke kanan lagi, sebelum melompat ke baris 5. Berikut ini adalah:

  • Mengikuti /cermin pada baris 5 menemukan lirik 5, yang didorong ke tumpukan. Kami kemudian teleport ke jalur 6.
  • Mengikuti /mirror pada baris 6 menemukan lirik 4, yang didorong ke tumpukan. Kami kemudian teleport ke jalur 7.
  • Mengikuti /cermin pada baris 7 menemukan lirik 3 ...

Ini terjadi sampai kita menekan lirik 1, di mana kita teleport ke baris 10. Ini adalah loop untuk mencetak seluruh tumpukan sampai kosong.

Jika hanya ada satu baris program, maka \mirror melakukan pekerjaan yang sama dengan teleport pada setiap baris lirik.

Jika program ini diacak, maka penjelasan di atas masih berlaku, jadi program ini bekerja untuk semua permutasi!

Sp3000
sumber