Saya punya masalah serius. Saya memiliki beberapa file teks di mana saya menyimpan nomor saya yang sangat penting - semua yang penting! Dan dua, dan bertiga ..
Angka-angka ini sangat penting sehingga saya tidak bisa mempercayakan mereka ke sistem angka desimal atau biner yang baru. Saya menyimpan setiap nomor yang disandikan di unary, seperti:
+--+
| |
+---+ +----+ |
| | | |
+---+ +-------+
~/two.txt
Sederhana dan dapat diandalkan: dua loop ASCII untuk nomor 2. Sayangnya, hal-hal ini cenderung menjadi kusut dari waktu ke waktu dan sekarang saya mengalami kesulitan mencari tahu berapa banyak loop dalam setiap file. Berikut adalah beberapa contoh yang saya kerjakan dengan tangan:
Satu:
+---+
| |
+--+ |
| |
+--+ |
| |
| |
| |
+--+ +--+
| |
+---------+
Tiga:
+---------+
| +-----+ |
| | +-+ | |
| | | | | |
| | +-+ | |
| +-----+ |
+---------+
Empat:
+--------------+
| +--+ +--+ |
| | | | | |
+-|-----|-----|----+
| | | | | | | |
| +--+ +--+ +--+ |
+------------------+
+------------+
| |
+-----+ +-----+ |
| | | |
+-----|-----------+ | |
| | +--+ | | | |
+-+ +--|--|--+ +---------+
| | +-+ | | |
+------+ | | | |
+-------+ | |
|| | |
|+-----+
| |
+---+
Lima:
+--------+ +--------+ +--------+
| | | | | |
| +--|-----+ +--|-----+ |
| | | | | | | | | |
+-----|--+ +-----|--+ +--------+
| | | |
+--------+ +--------+
Bisakah Anda membantu saya menghitung loop saya?
Berikut aturannya:
- Karena saya menyimpan segala sesuatu di ASCII-encodeed unary, efisiensi ruang sangat penting bagi saya. Karena itu, ini adalah kode golf. Program terkecil dalam byte menang.
- Loop ditarik dengan karakter +, -, |. Setiap sudut dalam loop digambar dengan jelas: tepat salah satu karakter di atas dan di bawah + akan |, dan tepat satu ke kanan atau ke kiri akan -. Dua tanda + tidak pernah berdekatan.
- Helai dapat melewati dan di bawah satu sama lain. Saat untaian menyeberang, Anda akan dapat melihat untaian "bawah" segera di kedua sisi untai "atas".
- Program Anda harus mengambil representasi string dari loop (baik dari stdin atau sebagai parameter fungsi) dan menghasilkan angka (baik untuk stdout atau sebagai nilai balik).
- Panjang garis mungkin tidak seragam dalam gambar lingkaran dan mungkin ada spasi tambahan di setiap garis.
- Anda dapat berasumsi bahwa setidaknya ada satu loop di input.
Aku mengandalkan mu!
+
?Jawaban:
SnakeEx - 98 byte dengan Javascript, 44 tanpa
Ini tampak seperti masalah yang baik untuk mencoba bahasa saya dari Fortnightly Challenge pada:
Tempat terbaik untuk mencoba ini adalah juru bahasa online saya .
SnakeEx mencocokkan pola dalam teks dengan menggunakan "ular" yang bergerak di sekitar regex pencocokan teks. Kode dibaca seperti regex, kecuali:
<T>
instruksi. Itu adalah perintah arah yang bercabang ular kiri dan kanan dari arah saat ini.{e<>PE}
seperti panggilan subrutin. Ini yang memunculkan ular dengan definisi yange
bergerak maju (<>
) dan dengan parameterP
(dukung kuda - ular pemijahan mengikuti ular baru) danE
(eksklusif - tidak cocok dengan apa pun yang sudah cocok). Pemeriksaan eksklusif ini adalah satu-satunya hal yang menghentikan ular dari perulangan tanpa batas.`
di bagian akhir menunjukkan bahwa yang berikut harus dicocokkan hanya jika sudah cocok, yang dapat kita gunakan untuk memaksa loop untuk menutup.Karena SnakeEx seperti regex dan tidak secara teknis menampilkan hasil seperti yang diinginkan dengan sendirinya, saya kira kita perlu membungkusnya dalam beberapa Javascript memanggil interpreter:
Sunting : perbaiki untuk bekerja dengan kasus uji tambahan blutorange
sumber
[^ ]
dengan[|\-]
;)C # - 338
388433byteMenyimpan banyak byte dengan mengubah ke array 1 dimensi.
Pertama ia membaca di input, dan membuatnya bagus dan persegi panjang, dengan perbatasan "" jadi kita tidak perlu melakukan batasan memeriksa horizontal (lebih murah untuk melakukan pengecekan pada vertikal daripada memasukkan garis tambahan) . Kemudian terlihat kembali melalui persegi panjang, sehingga selalu menyentuh sudut kanan bawah. Ketika hits salah satu dari ini, itu mengarahkan dirinya, mengikuti + s apa pun yang ditemuinya, dan membersihkan mereka saat berjalan (dengan spasi). Itu berhenti mengikuti ketika bertemu ruang. Diuji pada lima contoh yang diberikan.
sumber
Slip ,
5141 + 2 = 43 byte(Sekarang diperbarui untuk bekerja dengan test case @ blutorange dengan biaya besar)
Karena @BMac menggunakan SnakeEx untuk tantangan ini, saya pikir saya akan mencoba dan menggunakan pengiriman bahasa pencocokan pola 2D , Slip. Tetapi karena Slip tidak memiliki fitur yang diperlukan untuk menyelesaikan masalah ini, saya telah menambahkannya selama beberapa hari terakhir. Dengan kata lain, pengiriman ini tidak memenuhi syarat untuk menang .
Jalankan dengan
n
bendera untuk jumlah pertandingan, misCobalah online .
Penjelasan
Karena kebanyakan fitur baru dalam pengiriman ini, ini adalah kesempatan yang baik untuk memamerkannya.
Slip mencoba mencocokkan mulai dari setiap posisi, dan hanya mengembalikan yang unik. Perhatikan bahwa kita menggunakan
[^ +]
- saat menggunakan[-|]
secara teoritis akan menghemat dua byte, tidak terhapus-
pada awal / akhir kelas karakter belum diimplementasikan dalam Slip.sumber
three
juga memiliki+
s yang bukan satu-
, satu|
dan 2 spasi, jadi saya berasumsi itu bukan kesalahanRuby 295
Cobalah online: http://ideone.com/kIKELi ( Saya menambahkan
#to_a
panggilan di baris pertama, karena ideone.com menggunakan Ruby 1.9.3, yang tidak mendukung#size
untukEnumerable
s. Di Ruby 2.1.5+ kode berjalan OK . )Pendekatannya adalah sebagai berikut:
+
tanda di input dan anggap masing-masing dari mereka bentuk yang berbeda+
tanda dan menggabungkan bentuk mereka menjadi satuIni versi yang lebih mudah dibaca:
sumber
JavaScript (ES6) 190
197 202 215 235 289 570Edit array dimensi tunggal alih-alih 2 dimensi, ukuran baris maksimal 999 karakter (tetapi bisa lebih tanpa biaya, misalnya 1e5, bukan 999)
Edit cuplikan kode animasi yang ditambahkan, lihat di bawah
Pertama mencoba ungolfed
Cuplikan animasi
Tampilkan cuplikan kode
Uji di Firefox / konsol FireBug
sumber
Ruby, 178
187199212Versi ruby yang lebih baik, menciptakan fungsi F. Sekarang dengan peringatan juru bahasa yang lebih lezat terus-menerus.
Uji secara online: ideone
Pada dasarnya, fungsi
b
dimulai kapan saja+
, secara rekursif melewati loop, mengatur semua+
keu
. Dengan demikian satu loop akan dihapus setiap kalib
dipanggil. FungsiF
hanya mencoba seberapa sering kita perlu meneleponb
sampai tidak ada loop yang tersisa.sumber
Python 2 - 390
Mengambil string dengan baris baru dari stdin. Ini adalah metode yang cukup sederhana bermain golf sedikit adil, tapi saya yakin tidak sebanyak yang bisa mempertimbangkan berapa lama itu.
sumber
Python 2 - 346 byte
Diimplementasikan sebagai fungsi
c
yang mengambil data file sebagai input dan mengembalikan jumlah loop.Pertama, fungsi menguraikan data ke pemetaan lokasi elemen loop ke tipe elemen di lokasi itu (misalnya
{(0,0): '+'}
). Kemudian, ia menggunakan dua fungsi internal yang saling rekursif. Yang pertama menghapus segmen loop dari pemetaan dan memutuskan lokasi mana yang akan diperiksa untuk segmen berikutnya. Yang kedua memeriksa apa jenis elemen loop di lokasi yang dipilih dan, jika itu kompatibel dengan apa yang diharapkan, memanggil yang pertama untuk menghapus bagian yang baru ditemukan.sumber