Tujuan Anda adalah menampilkan seni ASCII dari formasi dalam bowling sepuluh pin di mana hanya beberapa pin yang tersisa. Bytes paling sedikit menang.
Puluhan pin berada dalam formasi segitiga:
O O O O
O O O
O O
O
Pin diberi label dari 1 hingga 10 sebagai:
7 8 9 10
4 5 6
2 3
1
Menggambar pin as O
dan missing pin as .
, formasinya 1 3 5 6 9 10
adalah:
. . O O
. O O
. O
O
Memasukkan:
String yang dipisahkan oleh spasi yang mencantumkan subset nonempty dari angka 1 hingga 10 secara berurutan.
Keluaran:
Cetak formasi yang sesuai atau hasilkan sebagai string dengan linebreak.
Formasi harus rata dengan kiri layar. Setiap spasi putih baik-baik saja selama gambar yang terlihat benar. Baris kosong sebelum dan sesudah juga baik-baik saja.
Kasus uji:
>> 1 2 3 4 5 6 7 8 9 10
O O O O
O O O
O O
O
>> 7 10
O . . O
. . .
. .
.
>> 3 5 7 9 10
O . O O
. O .
. O
.
>> 1
. . . .
. . .
. .
O
Jawaban:
brainfuck -
617616604 byteIni menghabiskan waktu dua hari bagi saya. Saya pikir itu sepadan. Mungkin ada bagian yang bisa lebih golf dengan mengubah sel tempat penyimpanan sesuatu atau apa pun, tapi saat ini saya senang saya membuatnya berfungsi.
Program ini harus benar-benar berbeda jika pertanyaan tidak menentukan bahwa input akan diurutkan. Cara kerjanya adalah dengan membuat daftar 10 pin di sekitar pin yang diinput. Itu agak membingungkan tapi mungkin ini akan menjelaskannya dengan lebih baik:
Saat melakukan itu, ia mengingat pin mana yang diletakkan pengguna di sana dan mana yang diletakkan di sana. Strategi ini akan sangat sulit digunakan jika input tidak diurutkan.
Hal lain yang membuat penyortiran menjadi lebih mudah adalah mendeteksi angka 10. Karena brainfuck berurusan dengan byte individu, bukan "angka" per se, itu bisa saja menyebalkan, tetapi input yang diurutkan membuatnya lebih mudah bagi saya untuk berurusan. dengan. Alasannya ada hubungannya dengan bagaimana saya menyimpan data dalam program. Saya mengambil input satu karakter pada waktu dan mengurangi 32 dari hasilnya. Jika sel tidak nol setelah itu, saya bergerak maju 4 sel. sebelum diulang. Ini berarti bahwa saya mendapatkan byte input non-spasi setiap 4 sel, dan saya secara efektif menyimpan pin sebagai nomor mereka + 16. Namun, 10 membutuhkan dua byte untuk mengetik, jadi saya harus membuat case khusus. Jika input tidak diurutkan, saya harus melihat melalui pin, tetapi karena diurutkan maka akan selalu menjadi pin terakhir jika muncul. Saya memeriksa apakah (byte terakhir dari input + 1) == (byte terakhir dari input) dan jika demikian, itu harus 10. Saya menyingkirkan byte terakhir dan mengatur yang terakhir kedua untuk apa yang dipahami oleh sistem saya sebagai "10". Karakter
'1'
dan'0'
tidak muat dalam satu byte, tetapi angka 26 pasti!Menghasilkan trik hanya untuk membuat sesuatu bekerja sama sekali adalah bagian favorit saya menggunakan bahasa ini. :)
Jika Anda tertarik dengan cara kerja program ini secara lebih rinci, Anda dapat melihat program dengan komentar yang saya gunakan saat menulisnya untuk memastikan saya ingat apa yang dilakukan semuanya. Bahkan menulis komentar di brainfuck itu sulit, karena tidak ada sintaksis komentar. Alih-alih, setiap karakter kecuali yang
<[+.,-]>
berada di no-ops. Mudah untuk memperkenalkan bug dengan memasukkan.
atau,
dalam komentar Anda secara tidak sengaja ! Itu sebabnya tata bahasanya sangat miring dan titik koma ada di mana-mana.EDIT: Sebagai contoh betapa mudahnya ini gagal: Saya menggunakan "non-space" di salah satu komentar! Ketika saya menghapus semua karakter non-bf dari sumbernya, program yang biasa saya lakukan menyimpannya di
-
. Untungnya itu tidak merusak apa pun, tapi sekarang saya sudah menghapusnya untuk menghemat satu byte. :)EDIT II: Sudah lama sejak saya menyentuh yang ini, haha. Dalam jawaban brainfuck lain di situs ini, saya perhatikan bahwa saya tidak sengaja menggunakan koma di versi komentar. Karena input sudah habis, ini mengatur sel saat ini ke 0 (ini tergantung implementasi, tetapi dalam pengalaman saya itu adalah perilaku yang paling umum). Saya memperbaiki bug, tetapi itu membuat saya berpikir. Cara idiomatis untuk mengatur sel ke 0 adalah
[-]
(kira-kirawhile (*p) { *p--; }
), yang dua byte lebih lama. Setiap kali semua input telah dibaca, saya dapat menggunakannya,
sebagai gantinya. Ini menyelamatkan saya 2 byte dalam jawaban itu, dan 12 dalam yang ini!sumber
Python 2, 108 byte
Panggil dengan
f("3 5 7 9 10")
.i
adalah nomor baris, dengan 4 menjadi baris pertama dan 1 adalah yang terakhir.z
adalah pin ke-n pada baris itu, dengan 0 yang berarti itu adalah pin pertama di baris dani-1
berarti itu adalah pin terakhir di baris itu.Retas utama adalah
i*~-i/2-~z
, yang mengkonversi(i, z) -> pin number
. Misalnya,(4, 0) -> 7
karena pin 7 adalah pin pertama pada baris 4 (baris pertama). Derivasinya seperti ini:Kami ingin fungsi mengambil
i
ke pin pertama di barisi
, yaitu4 -> 7, 3 -> 4, 2 -> 2, 1 -> 1
. Ini dipenuhi oleh(i**2-i)/2 + 1
, dan dengan demikian(i**2-i)/2 + 1 + z
memberikan nomor pin yang benar untuk input(i, z)
Kemudian sederhanakan:
Pyth , 33 byte
Cobalah online.
Program ini secara kasar diterjemahkan menjadi:
(Berkat isaacg untuk tips)
sumber
V4
sama denganFNU4
, danrz7
setara denganmvkcz\
.Pyth , 31
Coba di sini .
V4
mengatur loop for, dengan N sebagai variabel di atas [0,1,2,3].*dN
menyediakan spasi awal, karenad
spasi.Untuk menemukan lokasi pin, ia menggunakan
+7+dZ
- 7 + d + Z.d
aku s:sedangkan
Z
0 di baris pertama, -4 di baris kedua, -7 di baris ketiga dan -9 di baris keempat. Ini karenaZ
dimulai dengan 0, dan~Z-N4
dikurangiZ
dengan 4, lalu 3, lalu 2.Kemudian, ia memeriksa apakah lokasi pin di input, menggunakan
}+7+dZrz7
.rz7
adalah pin yang diinginkan dalam bentuk daftar int.Kemudian, itu menciptakan
O
jika ada, dan.
sebaliknya. Ini adalah ruang yang dipisahkan, denganjd
, dan dicetak secara implisit.sumber
Perl 5: 51 (50 + 1 untuk
-p
)Menggunakan
r
benderas///
yang merupakan salah satu tambahan perl 5 terbaru.sumber
CJam,
4841 byteWow, ini lama sekali
Uji di sini.
Penjelasan
Pertama-tama kita membuat tata letak:
Ini menghasilkan
Dan sekarang kita mengganti karakter digit sesuai dengan input:
sumber
"789A456S23SS1":~S*7/N*[l~]'OerB,'.er
sedikit lebih pendek.er
itu autocasting ke array saat itu."789A456S23SS1":~S*7/N*[l~]"O"erB,"."er
berfungsi dengan baik di 0.6.2.Python 2,
9794Ini menggunakan fungsi terjemahan, yang memungkinkan seseorang untuk membuat pergantian karakter-untuk-karakter dalam sebuah string. Seperti tr in perl, kecuali untuk mengetik lebih lama. Saya mendapatkan daftar angka desimal dengan membuat string dari 9 hingga kekuatan 99.
sumber
Javascript, 155
Golf pertama, mungkin bisa lebih pendek.
telepon dengan
SUNTING
Versi ES6, 130
SUNTING
Versi ES6, 79gagalVersi ES6,
7277, tidak ada peringatan, hanya kembalisumber
.match
). Ini yang paling elegan dari semuanya.Ruby, 91
Cukup mengganti argumen baris perintah dengan
.
s dan0
s dan mencetaknya menggunakan loop 4 siklus.Versi yang mudah dibaca
sumber
GNU sed, 75
Skor termasuk 1 ekstra untuk
-r
opsi:Masukan melalui STDIN:
Cobalah online .
sumber
l
s .0
ke10
pada baris 2,1/
ke1 /
pada baris 5, dan[0-9]
ke[0-9]+
pada baris 7 dan 9 Anda dapat menjatuhkan baris pertama selama 4 byte.CJam,
4039 byteSaya tahu ada cara yang lebih pendek, tidak punya waktu untuk mencari tahu sekarang.
Bagaimana itu bekerja:
Cobalah online di sini
sumber
APL (35)
Uji:
Penjelasan:
17110357⊤⍨28/2
: representasi 28-bit dari17110357
:\⍨
: Untuk setiap0
, beri ruang, dan untuk setiap1
, ambil item dari string di sebelah kiri.⎕∊⍨⍳10
: Baca baris dari keyboard dan evaluasilah (⎕
), lalu periksa setiap angka dari 1 hingga 10 (⍳10
) apakah itu terkandung dalam input (atau∊⍨
).'.O'[1+
...]
: Tambahkan 1 ke setiap nilai (memberikan 1s dan 2s bukannya 0s dan 1s), lalu ganti setiap 1 dengan.
dan setiap 2 denganO
.4 7⍴
: mengubah string yang dihasilkan menjadi matriks 4-oleh-7⊖
: balikkan secara horizontalsumber
Powershell: 109
Input dalam $ i
Itu tadi menyenangkan. Belajar banyak hal tentang cara kerja pipa juga.
sumber
Haskell:
163160 byteIni menerima garis angka yang dipisahkan oleh spasi
stdin
.Tidak Disatukan:
Dan bonus:
C: 250 byte
Versi ini mengharapkan argumen baris perintahnya menjadi daftar angka.
sumber
Perl, 73
Dan pendekatan bonus konyol yang tidak berjalan, 90 karakter:
sumber
Mathematica, 109 byte
Fungsi:
Dipanggil oleh:
Jika fungsi anonim diizinkan, ini dapat disingkat menjadi 105 byte :
Jika input tidak harus berupa string yang dibatasi ruang, tetapi bisa berupa array angka dalam formulir
{3,5,7,9,10}
, ini dapat lebih pendek menjadi 79 byte :sumber
Bash murni (tanpa coreutils), 85
Penggantian pola sederhana:
Daftar adalah input melalui args baris perintah.
sumber
Rebol - 117
Tidak Disatukan:
sumber
Brainfuck, 179 byte
Diformat:
Mengharapkan input tanpa baris baru yang tertinggal.
Cobalah online.
Rekaman diinisialisasi dengan sepuluh node, masing-masing berisi satu diikuti oleh nol. Yang pertama adalah nilai awal pin, dan nol memfasilitasi navigasi dan bertindak sebagai pengganti untuk karakter ruang. Untuk setiap angka dalam input, pin tersebut bertambah 3; Perhatikan bahwa
ord('O') - ord('.') = 33
, dan selama fase pencetakan, nilai pin akan dikalikan dengan 11. (Penggandaan ini juga digunakan untuk menghasilkan karakter spasi.) Urutan pin dari kiri ke kanan pada kaset cukup1
terserah10
. Jika input diakhiri dengan a10
, koreksi dilakukan, karena10
awalnya diperlakukan sebagai a1
.Setelah input diproses, yang negatif ditempatkan setelah setiap baris. Kemudian baris dicetak dalam satu lingkaran, dengan jumlah spasi terdepan ditentukan oleh jumlah baris yang sebelumnya diproses.
sumber
Clojure, 216 karakter (ugh)
Saya yakin ini bisa bermain golf lebih lanjut.
Gunakan seperti ini:
sumber
AWK: 96 byte
catatan:
sumber
C # - 192 byte
Karena C #!
Saya mulai mencoba membangun output dengan matematika, tetapi metode ganti-token-in-string sederhana tampaknya paling baik untuk bahasa tingkat yang lebih tinggi. Ketergantungan Linq adalah gondrong tetapi masih lebih pendek dari menjaga counter dan melakukan pemeriksaan jangkauan.
EDIT: unix line returns (-3 bytes)
sumber
Scala,
150148Menerima serangkaian string yang dibatasi ruang
sumber
JavaScript ES6, 78 byte
Gunakan cuplikan berikut untuk menguji. Ini menggunakan prompt dan peringatan dan notasi fungsi reguler untuk kemudahan pengujian.
sumber
VB / Basic-229
Tujuan saya adalah mengalahkan java ^^
edit vbCr alih-alih chr (13)
r = r + Spasi (3 - (e - b))
singkatan jika
penggunaan fungsi alih-alih sub
sub MAIN () -> sub m ()
sumber
Jawa - 223 karakter
Saya dulu suka cara ini, lalu saya sadar saya perlu hack kecil, masih seperti solusi saya.
sumber
K, 57 byte
Belum sangat kompetitif, tapi ini awal:
Contoh penggunaan:
Saya mulai dengan mengevaluasi string input dengan
.
- untungnya, angka-angka yang dipisahkan ruang adalah daftar literal yang sah dalam K. Dengan mendahulukan daftar kosong ke hasil eval saya dapat memastikan itu adalah daftar bahkan dalam kasus pin tunggal. Lalu saya membuat vektor boolean yang mewakili posisi pin:Lalu saya mengindeks ke daftar string untuk mendapatkan karakter ruang-empuk untuk setiap posisi pin.
Saya mengiris urutan itu menjadi baris (
_
), membalikkannya (|
) dan bergabung bersama setiap fragmen (,/'
):Sekarang mulai terlihat seperti pola yang kita inginkan. Yang tersisa hanyalah memakukan pada beberapa spasi utama untuk setiap baris (
((!4)#\:" "),'
) dan mencetak baris ke stdout (0:
).sumber
Pascal (FPC) , 165 byte
Cobalah online!
Mengambil angka dari input standar, mencetak formasi ke output standar.
Pascal (FPC) , 175 byte
Cobalah online!
Fungsi yang melakukan hal yang sama, mengambil larik posisi pin dan mengembalikan string yang diformat.
sumber
Powershell, 84 byte
Skrip uji:
Keluaran:
sumber
Java -
371316294 karakterPertama kali melakukan ini, saya cukup yakin itu menyebalkan, tapi saya seorang pemula. Ini juga berfungsi ketika nomor tidak dipesan. Penomorannya salah tetapi saya tidak punya waktu untuk mencari tahu cara memperbaikinya ...
input diberikan oleh
java B 1 2 3 5 10
misalnya. Output kemudian akan menjadi:sumber
Japt
-Rx
,29191817 bytesCobalah
Penjelasan
sumber