Ini adalah yang pertama dalam seri, yang kedua adalah Dua jalan yang dibelah dalam kayu kuning (bagian 2)
Tantangan ini terinspirasi oleh puisi terkenal Robert Frost, "The Road Not Taken":
Dua jalan bercabang di kayu kuning,
Dan maaf aku tidak bisa melakukan keduanya.
Dan menjadi satu pengembara, lama aku berdiri
Dan melihat ke bawah sejauh yang aku bisa
Ke tempat itu membungkuk di semak-semak;Kemudian mengambil yang lain, sama adil,
dan mungkin memiliki klaim yang lebih baik,
Karena itu berumput dan ingin dipakai;
Meskipun untuk yang lewat di sana
Memakai mereka benar-benar hampir sama,Dan kedua pagi itu sama-sama berbaring
Di daun, tidak ada langkah menginjak hitam.
Oh, aku menyimpan yang pertama untuk hari lain!
Namun mengetahui bagaimana jalan menuju ke jalan,
saya ragu apakah saya harus kembali.Saya akan mengatakan ini dengan menghela nafas
Di suatu tempat berabad-abad karena itu:
Dua jalan menyimpang dalam sebuah kayu, dan saya -
saya mengambil satu yang jarang dilalui oleh,
Dan itu telah membuat perbedaan.
Perhatikan baris kedua hingga terakhir I took the one less traveled by,
,.
Tantangan Anda yang sebenarnya
Anda akan mengambil input dalam bentuk seperti:
# ##
# ##
# ##
#
#
#
dan Anda harus menemukan jalan yang lebih tipis.
Jalan dimulai dari bawah dengan a #
. 2 jalan lainnya, yang selalu berakhir di baris atas, adalah jalan yang harus Anda periksa. Jalan yang paling tebal adalah yang paling banyak dilalui, dan karena itu bukan yang Anda inginkan. Yang lain adalah yang paling jarang dilalui, dan itu yang Anda inginkan.
Keluaran
Program / fungsi Anda harus menampilkan satu dari 2 nilai berbeda (mis. 0 atau 1, benar atau salah), satu untuk setiap posisi jalan yang mungkin tidak diambil. Misalnya, Anda dapat menampilkan 0 jika jalan tidak diambil di sebelah kiri jalan yang diambil, dan 1 jika tidak, atau Anda dapat menampilkan string "kiri" atau "kanan", benar, salah, dll.
Kasus uji:
## #
## #
###
#
#
#
Mungkin menghasilkan "benar".
## #
## #
###
##
#
#
#
Mungkin menghasilkan "benar".
## #
## #
###
##
#
#
#
Mungkin menghasilkan "benar".
## #
## #
###
#
#
#
#
Mungkin menghasilkan "benar".
# ##
# ##
###
#
#
#
#
Mungkin keluaran "kiri"
# ##
# ##
###
#
#
#
#
Mungkin keluaran "kiri"
Catatan
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang
- Celah standar dilarang
- Anda harus menentukan output untuk "kiri" dan "kanan" dan hasilnya harus berbeda
- Input akan menjadi satu string besar, dan mungkin memiliki jumlah baris berapa pun
- Anda tidak perlu khawatir tentang input yang valid.
- Jalan selalu berbentuk Y, jadi Anda hanya perlu melihat bagian atas.
- Ada pertanyaan? Komentar dibawah:
Hitungan byte terendah menang!
sumber
Jawaban:
CJam , 1 byte
r
menempatkan string pertama dari karakter non-spasi putih yang berdekatan dari STDIN pada tumpukan, jadi ini akan mencetak##
ke kiri dan#
ke kanan .Cobalah online!
sumber
JavaScript (ES6),
1912 byteEdit:
Versi yang lebih golf adalah
Kembali
#
ke kanan dan ruang untuk kiri.Asli:
Penjelasan
Tidak Disatukan :
Hal pertama yang dilakukan fungsi ini adalah menghilangkan spasi putih di awal dan akhir input. Ini berarti bahwa karakter pertama selalu
#
. Kemudian dari sana saya memeriksa karakter kedua (JavaScript dimulai pada 0) dan melihat apakah itu adalah#
karakter. Ini mengembalikan boolean. Jika jalanright
itu akantrue
, jika dibiarkan akan kembalifalse
.Bagaimana saya bermain golf
Dalam ES6 ada singkatan fungsi anonim yang disebut fungsi panah . Ini berarti bahwa saya dapat mengambil fungsi pembungkus saya dan mengubahnya menjadi:
Karena aturan fungsi panah itu akan mengembalikan sisa kode. Dari sana saya dikonversi
charAt(1)
menjadi[1]
cara yang lebih pendek, meskipun tidak disarankan . Lalu saya mengambil===
dan mengubahnya menjadi==
. Meskipun mereka berbeda dalam kasus ini, itu tidak masalah. Akhirnya, saya mengganti namainput
menjadia
dan menghapus semua spasi putih.Keluaran kanan dan kiri
Meskipun puzzle tidak benar-benar membutuhkan program untuk menampilkan kanan dan kiri, berikut adalah contoh dari output lain:
Satu-satunya bagian yang ditambahkan adalah
?'right':'left'
. Ini menciptakan operator ternary , pernyataan if terkondensasi, ini berarti bahwa kode (yang tidak dikurung) sama dengan *:Contoh
sumber
Pyth, 2 byte
Output
#
untuk kiri dan##
kanan.Cobalah online
Penjelasan
sumber
Acc !!, 30 byte
Karena cara Acc !! mengambil input, itu akan memberikan output setelah hanya satu baris input yang dimasukkan. Tetapi jika Anda mem-pipe input atau mengarahkannya dari file, Anda seharusnya tidak melihat perbedaannya.
Mengambil input dari stdin. Keluaran
jika jalan kiri kurang dilalui, atau
#
jika jalan kanan kurang dilalui.Cobalah online!Penjelasan
N
membaca nilai ASCII dari karakter dari stdin setiap kali direferensikan. Kami berputar sementara35-N
itu benar; itu adalah, sementara35-N != 0
atauN != 35
. Karena itu, ketika loop keluar, kita baru saja membaca#
karakter pertama di telepon. Karakter selanjutnya kemudian dibacaN
dan ditulis kembali bersama stdoutWrite
.sumber
Retina, 5 byte
Keluaran
1
jika benar,0
jika kiri.Cobalah online
Jika nilai untuk hasil positif tidak harus berbeda (5 byte):
Menghasilkan bilangan bulat positif jika benar, nol jika kiri.
Cobalah online
sumber
Bahasa Formula IBM / Lotus Notes,
373526 byteSunting Saya selalu lupa bahwa
@Like
dengan wildcard lebih murah 2 byte daripada@Contains
.Sunting 2 Sebenarnya tidak perlu
@if
karena hanya mencetak1
atau0
tergantung pada apakah rumus menghasilkan@True
atau@False
.Rumus bidang terkomputasi. Cukup bawa semuanya ke kiri yang pertama
##
ditemukan di lapangana
dan jika ada#
di dalamnya output1
untuk kiri jika tidak output0
untuk kanan.Dengan terima kasih kepada @DavidArchibald, berikut adalah solusi untuk 22 byte. Karena menghormati solusi Davids saya tidak akan mempostingnya sebagai jawaban utama saya.
Ini output
1
untuk kanan dan0
kiri.sumber
Pip ,
86 byteMengambil input sebagai argumen baris perintah (yang perlu mengutip dan keluar dari baris baru saat dijalankan dari baris perintah yang sebenarnya). Keluaran
#
jika jalan kiri kurang dilalui, dan##
jika jalan kanan kurang dilalui. Cobalah online!Penjelasan
Ini menggunakan operator regex pertandingan pertama Pip yang baru ditambahkan.
Solusi regex langsung (port jawaban Retina mbomb007 ) adalah 9 byte:
sumber
a
ke aq
dan mendapatkan input dari stdin sebagai gantinya.Chip , 7 byte
Cobalah online!
Output
0x0
untuk kiri, dan0x1
untuk kanan. (TIO menyertakan flag-v
sehingga Anda dapat melihat nilai biner di stderr. Untuk melihat output di ASCII,e*f
dapat ditambahkan ke akhir baris pertama.)Chip beroperasi pada bit individual dalam aliran byte, yang sebenarnya membuatnya cukup baik untuk masalah spesifik ini.
A
adalah bit paling tidak signifikan dari byte input, dan '#' adalah satu-satunya karakter input yang bit ini diatur. Ketika bit ini pertama kali ditemukan, kami telah mencapai '#' pertama dari baris pertama.Z
menunda sinyal itu untuk satu siklus, sehingga kita sekarang melihat karakter berikutnya.t
sekarang diaktifkan, yang berarti mengakhiri eksekusi setelah siklus ini selesai. Kita tidak perlu melihat lebih jauh dari lebar jalan pertama.~S
menekan output untuk semua siklus kecuali yang terakhir. Jika ini tidak ada di sini, kami akan mendapatkan output di setiap siklus.a
menempatkan nilai terkini dari tetangganya (hanyaA
dalam kasus ini) ke bit byte keluaran paling tidak signifikan.Semua ini berarti bahwa kita mendapatkan a
0x1
jika '#' pertama segera diikuti oleh '#' yang lain, dan0x0
sebaliknya.sumber
C, 35 byte
Ide yang sama dengan jawaban PragmaticProgrammer : cari yang pertama
#
, dan keluaran apa yang muncul setelahnya -#
untuk "benar", dan<space>
untuk "kiri".C (celah), 16 byte
Menurut kasus uji, sepertinya jalan kiri selalu tepat satu ruang dari margin kiri. Begitu...
sumber
Batch, 46 byte
Membaca satu baris dari STDIN, membaginya pada spasi, dan mencetak kata pertama, jadi keluarlah
#
untuk kiri dan##
kanan. Jika larik parameter baris perintah yang dikutip dapat diterima, maka untuk 36 byte:Tanda kutip argumen pertama sehingga akan terpecah pada spasi dan mencetak kata pertamanya.
sumber
Python 2, 21 byte
Cobalah online
Output
#
untuk kiri dan##
kanansumber
Retina , 5 byte
Cobalah online!
Alternatif solusi 5-byte. Mencetak
#
untuk kiri dan##
kanan. Idenya adalah untuk mencocokkan semua run dari#
s (#+
) dan print (!
) hanya yang pertama dari mereka (1
).sumber
Haskell, 21 byte
atau dalam gaya point-free:
"#" Berarti Benar, dan "" Berarti Kiri
Fungsi hanya mengambil string, menjatuhkan spasi awal, dan kemudian, dibutuhkan karakter kedua (spasi jika kiri kurus dan # jika kiri tebal)
EDIT: Disimpan tiga byte berkat Laikoni dan nimi!
sumber
(!!2).dropWhile(' '==)
cukup sebagai jawaban.!!1
untuk elemen ke-2. Anda dapat mempersingkat tes menjadi<'!'
. Di versi pointfree, Anda bisa menggantinyadropWhile
dengansnd.span
.Brainfuck, 32 byte
Tidak Disatukan:
Cetakan
#
untuk kanan dankiri.
Cobalah online!
sumber
Perl 5 , 8 + 1 = 9 byte
Cobalah online!
Jalankan dengan
-a
(penalti 1 byte).Output adalah (di mana nama file
# at filename line 1, <> line 1
adalah nama file skrip) jika jalan kiri kurang dilalui, atau## at filename line 1, <> line 1
jika jalan kanan kurang dilalui.Penjelasan
The
-a
pilihan secara otomatis membaca input dan membagi ke kolom sekitar spasi, mengabaikan spasi terkemuka. Dengan demikian, datum input pertama adalah yang kita butuhkan; yang ini$F[0]
. Ini juga menempatkan program dalam loop implisit, yang tidak kita inginkan. Namun, penggunaandie
memungkinkan kita untuk mengeluarkan string, dan keluar dari loop implisit, pada saat yang sama (dan dengan tidak lebih dari karaktersay
, cara yang lebih biasa untuk mencetak string).sumber
C 54 byte
C ++ 58 byte
Karena OP yang ditentukan itu bisa menjadi "program / fungsi" Saya memilih untuk menulis fungsi untuk menyimpan karakter. Namun, saya masih menyertakan pernyataan "#include" dan garis pemisah yang disertakan dalam jumlah karakter karena mereka diharuskan untuk mengkompilasi fungsi.
Keluaran
Mengembalikan
" "
karakter spasi untuk menunjukkan kiri, atau hash"#"
karakter untuk menunjukkan kanan.Penjelasan
Fungsi strchr () memandu string yang diberikan dan mengembalikan pointer ke kemunculan pertama karakter yang ditentukan. Ini memiliki kelebihan yang menerima integer sebagai argumen kedua sebagai lawan dari char yang menyelamatkan saya 1 karakter. Misalnya '#' dapat diganti dengan 35. Saya kemudian menambahkan satu ke pointer yang dikembalikan dari fungsi untuk mendapatkan karakter segera berikut, dan dereferensi, lalu mengembalikan char yang dihasilkan.
Catatan
Saya juga ingin mengambil kesempatan ini untuk secara resmi menyatakan kekesalan saya di Visual Studio secara otomatis memformat kode saya ketika saya mencoba bermain golf (╯ ° □ °) ╯︵ ┻━┻.)
Sunting: Terima kasih kepada Ray untuk menunjukkan beberapa perbedaan dalam C dan C ++ dan di mana saya dapat menyimpan karakter <3.
sumber
#include <string.h>\n
denganchar*strchr();
dan menyimpan 6 byte sementara masih legal. (Dan jika Anda lebih suka C ++ karena alasan apa pun, Anda dapat mengganti#include <string.h>
dengan#include <cstring>
dan menyimpan 1 byte.)JavaScript (ES6), 37 byte
Penjelasan:
p
adalah fungsi yang mengembalikantrue
jika jalan yang jarang dilalui adalah di sebelah kiri dan salah sebaliknya. Ini adalah jawaban pertama saya di situs ini, jadi mungkin bisa golf lebih banyak (mungkin regex.)Ia bekerja dengan mengambil baris teratas dari input dan melihat apakah itu cocok dengan regex
/^ *#( |$)/
(mulai dari string, jumlah spasi, #, dan spasi atau akhir dari string.)Ini hanya untuk memberi orang klarifikasi tentang format dan menghasilkan ide. Saya yakin itu bisa mengalahkan dan bermain golf lebih lanjut. Selamat bermain golf!
sumber
[^#]
Japt , 3 byte
(2 byte untuk
-g1
flag) Output#
untuk kanan dan ruang untuk kiri. Berdasarkan jawaban JavaScript oleh David Archibald.Cobalah online!
sumber
Excel, 17 byte
Mengasumsikan input dalam sel
A1
.Kembali
##
untuk kanan dan#
(#
dan spasi) untuk kiri.sumber
Dyvil , 12 byte
Penjelasan:
Pemakaian:
Pengembalian
(spasi putih) untuk kiri dan
#
kanan.sumber
Java 7,
16666635243 byteOutput
35
untuk kanan dan32
kiri.Berdasarkan @Clashsoft 's Dyvil jawabannya .
Penjelasan:
Kode uji:
Coba di sini.
Keluaran:
sumber
Menembus 98, 11 byte
Cobalah secara Online!
Mencetak
32
untuk kiri, dan35
untuk kanan, keduanya dengan satu spasi tambahan.Penjelasan
Satu trik yang saya gunakan adalah menempatkan yang
-!jv
pertama, meskipun tidak melakukan apa pun. Ini biarkan saya menyingkirkan ruang setelah'
dan menyimpan beberapa lapisan. Dengan ini yang terakhir, kodenya akanselama 15 byte.
sumber
Ruby, 20 byte
Mengembalikan nilai true untuk kiri, false untuk kanan.
sumber