Saya mereproduksi bagian kedua dari hari pertama Advent of Code, dengan izin dari pencipta.
Santa sedang berusaha mengirimkan hadiah di sebuah gedung apartemen besar, tetapi ia tidak dapat menemukan lantai yang tepat - arah yang ia dapatkan agak membingungkan. Dia mulai di lantai dasar (lantai 0) dan kemudian mengikuti instruksi satu karakter pada suatu waktu.
Tanda kurung pembuka (
,, berarti ia harus naik satu lantai, dan tanda kurung tutup )
,, berarti ia harus turun satu lantai.
Bangunan apartemen sangat tinggi, dan ruang bawah tanahnya sangat dalam; dia tidak akan pernah menemukan lantai atas atau bawah.
Diberikan seperangkat instruksi, cari posisi karakter pertama yang menyebabkan dia memasuki ruang bawah tanah (lantai -1).
Sebagai contoh:
masukan )
menyebabkan dia memasuki ruang bawah tanah pada posisi karakter 1.
masukan ()())
menyebabkan dia memasuki ruang bawah tanah pada posisi karakter 5.
Masukan panjang diberikan di sini yang akan menghasilkan solusi 1797.
Ini kode golf, jadi solusi terpendek menang!
Jawaban:
Jelly,
87 byteTerima kasih kepada @ Sp3000 untuk bermain golf 1 byte!
Cobalah online!
Bagaimana itu bekerja
sumber
Python 2, 44 byte
Solusi cerdas ini ditemukan oleh hallvabo, xsot, mitchs, dan whatisgolf pada masalah ini di golf Anarchy . Jika ada di antara Anda yang ingin mempostingnya, saya akan menghapus ini.
Triknya adalah membiarkan pengurai Python melakukan pekerjaan. Fungsi
input()
mencoba mengevaluasi string input, dan melempar kesalahan pada paren pertama yang tidak cocok. Kesalahan ini, ketika tertangkap, memiliki bentukyang mencakup nomor karakter tempat kesalahan terjadi.
sumber
Python,
7977 BytesMungkin ada cara yang lebih baik untuk melakukan ini, tetapi saya kehabisan ide. Juga ini adalah posting pertama saya tentang codegolf.
Terima kasih kepada @Erwan. untuk bermain golf 2 byte.
sumber
[0:g]
dengan[:g]
-2*ord(z)+81
oleh2*(z<')')-1
Python 3, 59
Disimpan 3 byte berkat grc.
Saya sangat tidak suka melakukan pengindeksan string manual dengan Python. Rasanya sangat salah.
sumber
C, 55 byte
Coba di sini .
Sunting: Tidak yakin mengapa saya meninggalkan variabel yang tidak digunakan di sana ...
sumber
CJam, 10 byte
atau
atau (kredit untuk Dennis)
Uji di sini.
Penjelasan
Seperti yang sudah dicatat oleh A Simmons,
()
adalah pilihan yang beruntung bagi CJam karena mereka adalah operator penurunan / kenaikan, masing-masing. Itu berarti jika kita mulai dari nol, kita sedang mencari langkah di mana Santa mencapai lantai 1.sumber
Labirin , 18 byte
Cobalah online!Jawaban ini adalah hasil kolaborasi dengan @ MartinBüttner.
Penjelasan
Primer Labyrinth yang biasa (saya katakan "biasa", tapi saya sebenarnya menulis ulang ini setiap waktu):
n*10 + <digit>
. Ini memungkinkan penumpukan yang mudah dalam jumlah besar. Untuk memulai nomor baru, gunakan_
, yang mendorong nol.Kode ini agak aneh karena, untuk tujuan bermain golf, loop utama menggabungkan dua tugas menjadi satu. Untuk paruh pertama dari operan pertama, inilah yang terjadi:
Sekarang stack telah diinisialisasi dengan -1 di atas, pemrosesan yang sebenarnya dapat dimulai. Inilah yang dilakukan loop utama.
Duplikat terakhir menambahkan elemen ke tumpukan untuk setiap iterasi yang kami lakukan. Ini penting karena, ketika kita mencapai nol dan maju di NOP, kita lakukan:
sumber
Oracle SQL 11.2,
160159 byteTidak bermain golf
sumber
Retina ,
2221Cobalah online atau coba test case besar. (URL besar untuk test case besar, beri tahu saya jika rusak untuk Anda, sepertinya OK di chrome.)
1 byte disimpan berkat Martin!
Kami mencocokkan set kurung pertama yang seimbang dan mengekstraknya, lalu kami menghitung berapa kali string kosong akan cocok dengan hasil itu. Saya tidak yakin apakah ini cara terbaik untuk melakukan ini di Retina, terutama jika mode PCRE membuatnya lebih pendek, tetapi menggunakan
$#_
penggantian tampaknya lebih lama karena dimatikan oleh satu kesalahan dan masalah memiliki lebih dari satu pertandingan.Algoritma ini menyebabkan perilaku aneh untuk input yang tidak valid, pada dasarnya mengasumsikan bahwa jika Santa tidak berhasil mencapai ruang bawah tanah, ia secara misterius melakukan teleportasi di sana setelah pergerakan lainnya.
sumber
Grep + AWK, 51 Bytes
The
grep
perintah menempatkan masing-masing karakter pada baris baru.sumber
Pyth, 13 byte
Penjelasan
Coba di sini
Algoritma lama, 15 byte
Penjelasan:
Coba di sini
Atau jika diizinkan menggunakan karakter selain
(
dan)
, 9 byte (memindahkan pra-pemrosesan ke input)Penjelasan
Coba di sini
sumber
JavaScript (ES6), 58 byte
Bekerja dengan menghapus pasangan yang cocok secara rekursif
()
hingga karakter pertama adalah a)
. Peringatan: Jangan coba ini pada string yang tidak memiliki cukup)
. Contoh:Pada titik ini terlihat bahwa 12 karakter telah dihapus total sehingga jawabannya adalah 13.
sumber
MATL ,
1211 byte1 byte disimpan menggunakan ide komputasi Dennis -1 yang diangkat ke string input
Cobalah online!
sumber
CJam,
1210 BytesCoba di sini.
Dua byte disimpan berkat Martin.
Penjelasan:
sumber
Javascript, 117 byte
Abaikan karakter lain. Penggunaan
prompt
danalert
.sumber
Perl, 34 + 1 = 35 byte
Terima kasih untuk Dennis untuk beberapa tips.
Jalankan dengan
-p
bendera. Ini berfungsi di Perl 5.10, tetapi versi yang lebih baru membutuhkan ruang di sini:++ while
Versi yang lebih tua, tidak diserang:
sumber
Python, 44 byte
Lantai
i
dimulai pada1
sehingga kami mengakhirii
menjadi nilai falsey0
. Jika tidak dihentikan, tambahkan satu secara rekursif untuk menghasilkan dengan karakter pertama dihapus dan nomor lantai diperbarui berdasarkan karakter itu.sumber
Javascript, 57 byte
Cukup sederhana, hanya mengulangi input, incs if '(' decs if ')'. Pengembalian negatif pertama.
sumber
Ruby, 47 byte
Fungsi anonim.
sumber
C, 73 byte
Mengharapkan masukan pada STDIN; tidak ada karakter selain
(
dan)
dapat muncul dalam input (setidaknya sampai kami telah mencapai jawabannya). Masukan harus ASCII.Memancarkan jawaban pada STDOUT.
Menggunakan perbedaan 1-bit antara ASCII untuk
(
dan)
.Versi yang diformat dengan baik:
sumber
f=c=0
ke inisialisasi loopfor(f=c=0;f!=...
untuk menyimpan byte?PowerShell,
756562 byteMenggunakan teknik yang sama seperti pada bilangan biner Parenthifiable untuk mengulangi semua karakter input, menjaga
$c
ounter berjalan+1
untuk masing-masing(
dan-1
untuk masing-masing)
, kemudian menguji apakah kami telah mencapai negatif (yaitu, kami berada di ruang bawah tanah).Edit - disimpan 10 byte dengan mengulangi karakter yang sebenarnya daripada indeksnya.
Edit 2 - menyimpan 3 byte tambahan dengan menukar cek kesetaraan untuk modulo sehingga casting secara implisit
sumber
Mathematica,
6255 byteSemua nama fungsi panjang! Bekerja mirip dengan jawaban SimJons CJam.
sumber
Dibalik 25 byte
Keluaran dalam unary. Ini mulai Anda di lantai satu, dan akan pergi sampai 0.
sumber
Racket (102)
Tidak disatukan
sumber
APL, 18 karakter
Dalam Bahasa Inggris:
¯1*')'=⍵
: -1 di mana input = ")", 1 sebaliknya;+\
: running sum;1⍳⍨¯1=
: cari indeks -1 pertama.sumber
Lua,
928987 BytesDibutuhkan argumen baris perintah.
Sunting: Disimpan 3 Bytes
Sunting: Disimpan 2 byte, dan dikoreksi bug yang bisa terjadi pada kasus tepi, sekarang output melalui kode keluarnya
Tidak disatukan
sumber
k / kona ,
2321 bytes2 byte disimpan dengan menghapus tanda kurung yang tidak perlu.
Pemakaian:
sumber
Perl, 40 + 1 = 41 byte
Membutuhkan
-p
bendera:Mengasumsikan input yang valid.
Bagaimana itu bekerja:
sumber
Javascript (ES6),
6867 byteMengambil input sebagai argumen pertama
Penjelasan
sumber
Python (3.5),
787162 bytesolusi rekursif
ini mirip dengan solusi ini untuk golf mini
kita dapat mengasumsikan santa selalu mencapai ruang bawah tanah
sumber