Berikut ini adalah rubi seni ASCII yang sederhana :
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
Sebagai penjual perhiasan untuk ASCII Gemstone Corporation, pekerjaan Anda adalah memeriksa batu rubi yang baru diperoleh dan meninggalkan catatan tentang segala cacat yang Anda temukan.
Untungnya, hanya 12 jenis cacat yang mungkin, dan pemasok Anda menjamin bahwa tidak ada ruby yang memiliki lebih dari satu cacat.
12 cacat sesuai dengan penggantian salah satu dari 12 bagian _
, /
atau \
karakter dari ruby dengan karakter spasi ( ). Garis luar rubi tidak pernah memiliki cacat.
Cacat diberi nomor sesuai dengan karakter mana yang memiliki ruang di tempatnya:
Jadi ruby dengan cacat 1 terlihat seperti ini:
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
Rubi dengan cacat 11 terlihat seperti ini:
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
Itu ide yang sama untuk semua cacat lainnya.
Tantangan
Tulis program atau fungsi yang mengambil string dari satu ruby, berpotensi rusak. Nomor cacat harus dicetak atau dikembalikan. Angka cacat adalah 0 jika tidak ada cacat.
Ambil input dari file teks, stdin, atau argumen fungsi string. Kembalikan nomor yang rusak atau cetak ke stdout.
Anda dapat berasumsi bahwa ruby memiliki baris baru. Anda tidak boleh berasumsi bahwa ia memiliki spasi tambahan atau memimpin baris baru.
Kode terpendek dalam byte menang. ( Penghitung byte berguna. )
Uji Kasus
13 jenis rubi yang tepat, diikuti langsung oleh hasil yang diharapkan:
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
0
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
1
___
/\ /\
/_/ \_\
\ \_/ /
\/_\/
2
___
/\_/\
/_ \_\
\ \_/ /
\/_\/
3
___
/\_/\
/_/ \_\
\ _/ /
\/_\/
4
___
/\_/\
/_/ \_\
\ \ / /
\/_\/
5
___
/\_/\
/_/ \_\
\ \_ /
\/_\/
6
___
/\_/\
/_/ \ \
\ \_/ /
\/_\/
7
___
/\_ \
/_/ \_\
\ \_/ /
\/_\/
8
___
/ _/\
/_/ \_\
\ \_/ /
\/_\/
9
___
/\_/\
/ / \_\
\ \_/ /
\/_\/
10
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
11
___
/\_/\
/_/ \_\
\ \_/ /
\/_ /
12
sumber
Jawaban:
CJam,
2723 byteKonversikan basis 11, ambil mod 67, ambil mod 19 dari hasilnya lalu cari indeks dari apa yang Anda miliki dalam array
Sihir!
Cobalah online .
sumber
Ruby 2.0, 69 byte
Hexdump (untuk menampilkan data biner dalam string dengan setia):
Penjelasan:
-Kn
pilihan membaca file sumber sebagaiASCII-8BIT
(binary).-0
pilihan memungkinkangets
untuk membaca di seluruh input (dan bukan hanya satu baris).-rdigest
pilihan loaddigest
modul, yang menyediakanDigest::MD5
.sumber
Julia,
9059 byteJelas bukan yang terpendek, tetapi gadis yang cantik, Julia, sangat berhati-hati dalam memeriksa batu delima kerajaan.
Ini menciptakan fungsi lambda yang menerima string
s
dan mengembalikan nomor cacat ruby yang sesuai. Untuk menyebutnya, berikan nama, misf=s->...
.Penjelasan + tidak dikumpulkan:
Contoh:
Perhatikan bahwa garis miring terbalik harus lolos dalam input. Saya mengonfirmasi dengan @Cobin'sHobbies bahwa tidak apa-apa.
Beri tahu saya jika Anda memiliki pertanyaan atau saran!
Sunting: Disimpan 31 byte dengan bantuan dari Andrew Piliser!
sumber
search
dan pengindeksan array.s->(d=reshape([18 10 16 24 25 26 19 11 9 15 32 34],12);search(s[d],' '))
. Saya tidak suka bentuk ulang, tapi saya tidak bisa memikirkan cara yang lebih pendek untuk mendapatkan array 1d.reshape()
menggunakanvec()
. :)> <> (Ikan) , 177 byte
Ini adalah solusi yang panjang namun unik. Program tidak mengandung aritmatika atau percabangan selain memasukkan karakter input ke tempat-tempat tetap dalam kode.
Perhatikan bahwa semua karakter ruby-building yang diperiksa (
/ \ _
) dapat berupa "mirror" dalam kode> <> yang mengubah arah penunjuk instruksi (IP).Kita dapat menggunakan karakter input ini untuk membangun labirin dari mereka dengan instruksi pengubah kode
p
dan di setiap jalan keluar (yang dibuat oleh cermin yang hilang pada input) kita dapat mencetak nomor yang sesuai.Para
S B U
huruf adalah orang-orang berubah menjadi/ \ _
masing-masing. Jika input adalah ruby penuh, kode terakhir menjadi:Anda dapat mencoba program ini dengan penerjemah visual online yang hebat ini . Karena Anda tidak dapat memasukkan baris baru di sana, Anda harus menggunakan beberapa karakter dummy sebagai gantinya sehingga Anda dapat memasukkan ruby penuh seperti misalnya
SS___LS/\_/\L/_/S\_\L\S\_/S/LS\/_\/
. (Spasi juga berubah menjadi S karena penurunan harga.)sumber
CJam,
41 31 2928 byteSeperti biasa, untuk karakter yang tidak dapat dicetak, ikuti tautan ini .
Cobalah online di sini
Penjelasan segera
Pendekatan sebelumnya:
Cukup yakin ini dapat dikurangi dengan mengubah digit / konversi logika. Tapi begini usahanya yang pertama:
Seperti biasa, gunakan tautan ini untuk karakter yang tidak diinginkan.
Logikanya cukup sederhana
"Hash for each defect":i
- Ini membuat saya hash per cacat sebagai indeksqN-"/\\_ "4,er
- ini mengubah karakter menjadi angka4b1e3%A/
- ini adalah nomor unik dalam basis angka yang dikonversi#
Maka saya hanya menemukan indeks nomor unik di hashCobalah online di sini
sumber
.h
saat ini tidak berguna karena menggunakan built-in tidak dapat diandalkan dan burukhash()
), sampai saat itu saya tidak dapat berbuat lebih baik.Slip ,
123108 + 3 = 111 byteJalankan dengan
n
dano
bendera, yaituAtau, cobalah secara online .
Slip adalah bahasa mirip regex yang dibuat sebagai bagian dari tantangan pencocokan pola 2D . Slip dapat mendeteksi lokasi cacat dengan
p
bendera posisi melalui program berikut:yang mencari salah satu pola berikut (di sini
S
menunjukkan di sini pertandingan dimulai):Coba online - koordinat dihasilkan sebagai pasangan (x, y). Semuanya berbunyi seperti regex normal, kecuali bahwa:
`
digunakan untuk melarikan diri,<>
putar pointer pertandingan ke kiri / kanan masing-masing,^6
mengatur pointer pertandingan menghadap ke kiri, dan\
menyelipkan pointer pertandingan secara ortogonal ke kanan (mis. jika pointer mengarah ke kanan maka turun satu baris)Namun sayangnya, apa yang kita butuhkan adalah satu nomor 0-12 pepatah yang cacat terdeteksi, tidak di mana itu terdeteksi. Slip hanya memiliki satu metode untuk menghasilkan angka tunggal -
n
bendera yang menampilkan jumlah kecocokan yang ditemukan.Jadi untuk melakukan ini, kami perluas regex di atas agar sesuai dengan jumlah kali yang tepat untuk setiap cacat, dengan bantuan
o
mode pertandingan yang tumpang tindih. Rusak, komponennya adalah:Ya, itu penggunaan yang berlebihan
?
untuk mendapatkan angka yang benar: Psumber
JavaScript (ES6), 67
72Cukup cari tempat kosong di 12 lokasi yang diberikan
Edit Disimpan 5 byte, thx @apsillers
Uji di Firefox / konsol FireBug
Keluaran
sumber
C,
9884 bytePEMBARUAN: Sedikit lebih pintar tentang string, dan memperbaiki masalah dengan rubi yang tidak cacat.
Terurai:
Cukup mudah, dan hanya di bawah 100 byte.
Untuk pengujian:
Masukan ke STDIN.
Bagaimana itu bekerja
Setiap cacat di ruby terletak pada karakter yang berbeda. Daftar ini menunjukkan di mana setiap cacat terjadi di string input:
Karena membuat array
{17,9,15,23,24,25,18,10,8,14,31,33}
biaya banyak byte, kami menemukan cara yang lebih pendek untuk membuat daftar ini. Perhatikan bahwa menambahkan 30 ke setiap nomor menghasilkan daftar bilangan bulat yang dapat direpresentasikan sebagai karakter ASCII yang dapat dicetak. Daftar ini adalah sebagai berikut:"/'-5670(&,=?"
. Jadi, kita dapat mengatur array karakter (dalam kode,c
) ke string ini, dan cukup kurangi 30 dari setiap nilai yang kita ambil dari daftar ini untuk mendapatkan array integer asli kita. Kami mendefinisikana
sama denganc
untuk melacak sejauh mana daftar yang kami dapatkan. Satu-satunya yang tersisa dalam kode adalahfor
loop. Itu memeriksa untuk memastikan kami belum mencapai akhir ke nomor cacat dan mengembalikannya.c
, dan kemudian memeriksa apakah karakterb
pada saat inic
adalah spasi (ASCII 32). Jika ya, kita setel elemen pertama darib
sumber
Python 2,
146888671 byteFungsi
f
menguji setiap lokasi segmen dan mengembalikan indeks segmen cacat. Pengujian pada byte pertama dalam string input memastikan bahwa kami kembali0
jika tidak ada cacat yang ditemukan.Kami sekarang mengemas offset segmen menjadi string yang ringkas dan digunakan
ord()
untuk memulihkannya:Pengujian dengan ruby sempurna:
Pengujian dengan segmen 2 diganti dengan spasi:
Sunting: Terima kasih kepada @xnor untuk
sum(n*bool for n in...)
teknik yang bagus .EDIT2: Terima kasih kepada @ Sp3000 untuk tips golf tambahan.
sumber
sum(n*(s[...]==' ')for ...)
.<'!'
bukan==' '
untuk byte Anda juga dapat membuat daftar denganmap(ord, ...)
, tetapi saya tidak yakin bagaimana perasaan Anda tentang yang tidakPyth,
353128 byteMembutuhkan Pyth yang ditambal , versi terbaru dari Pyth memiliki bug
.z
yang menghilangkan karakter yang tertinggal.Versi ini tidak menggunakan fungsi hash, ia menyalahgunakan fungsi konversi basis di Pyth untuk menghitung hash yang sangat bodoh, tetapi bekerja. Kemudian kita mengonversi hash itu menjadi karakter dan mencari indeksnya dalam sebuah string.
Jawabannya berisi karakter yang tidak diinginkan, gunakan kode Python3 ini untuk menghasilkan program secara akurat di mesin Anda:
sumber
Haskell, 73 byte
Strategi yang sama dengan banyak solusi lain: mencari ruang di lokasi yang diberikan. Pencarian mengembalikan daftar indeks dari mana saya mengambil elemen terakhir, karena selalu ada hit untuk indeks 0.
sumber
05AB1E , 16 byte
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Lihat tip tambang 05AB1E ini (bagian Bagaimana cara mengompresi bilangan bulat besar? Dan Cara mengompresi daftar bilangan bulat? ) Untuk memahami mengapa
•W)Ì3ô;4(•
ini2272064612422082397
dan•W)Ì3ô;4(•₆в
sekarang[17,9,15,23,24,25,18,10,8,14,31,33]
.sumber