Ini adalah yang kedua dalam seri, yang ketiga adalah Dua jalan yang dibelah dalam kayu kuning (bagian 3)
Ini didasarkan pada Dua jalan yang menyimpang dari kayu kuning (bagian 1) , tantangan tambang sebelumnya. Itu diterima dengan cukup baik, tetapi juga cukup sepele (jawaban Java dalam 52 byte!) Jadi saya membuat sesuatu yang lebih kompleks ...
Inspirasi
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, aku berdiri lama
Dan melihat ke bawah sejauh yang aku bisa
Ke tempat itu membungkuk di semak-semak;... 2 paragraf dipangkas ...
Saya akan mengatakan ini dengan menghela nafas
Di suatu tempat berabad-abad karena itu:
Dua jalan menyimpang dalam sebuah hutan, dan saya -
saya mengambil satu yang kurang dilalui oleh,
Dan itu telah membuat semua perbedaan.
Perhatikan baris kedua hingga terakhir I took the one less traveled by,
,. Tujuan Anda adalah menemukan jalan yang paling jarang dilalui oleh input string Anda. Anda harus menampilkan salah satu dari 2 nilai yang berbeda satu sama lain yang memberi sinyal ke arah mana Anda harus berbelok untuk menempuh jalan yang jarang dilalui. Setelah persimpangan jalan (jejak heksagon berubah menjadi angka), Anda berada di persimpangan. Dari sana, akan ada 2 jalur yang terdiri dari angka. Jalur yang digit-nya memiliki jumlah terendah adalah jalan yang tidak diambil. Perhatikan bahwa jalan yang tidak diambil mungkin memiliki jalur yang lebih besar tetapi jumlah jalur yang lebih rendah. Berikut adalah beberapa contoh / kasus uji dari program yang mencetak "kiri" atau "kanan" untuk jalur yang tidak diambil:
1 2
1 2
1 2
#
#
#
left (3 < 6)
1 2
2 2
1 1
#
#
#
left (4 < 5)
12 2
11 2
1 1
#
#
#
right (6 > 5)
99 989
99 89
99 99
99 99
#
#
#
#
left (72 < 79)
1111 1110
001 111
11 11
11 11
#
##
##
##
left (9 < 10) (Note: 1111 is interpreted as 1+1+1+1=4, not 1111=1111)
1 1
0 1
1 1
1 1
1 1
1 1
1 1
#
#
#
#
#
left (6 < 7)
1 1
0 1
1 1
1 1
1 1
1 1
1 1
#
#
#
#
#
left (6 < 7)
Hal-hal untuk diasumsikan & diingat
- Akan selalu ada 2 jalur. Tidak lebih, tidak kurang.
- Anda dapat mengambil input dari STDIN satu baris pada satu waktu, string yang berisi karakter LF, atau string yang berisi backslash literal dan n. Jika Anda membutuhkan input dengan cara lain, mintalah persetujuan dalam komentar.
- Anda tidak perlu khawatir tentang input yang tidak valid atau jalur yang diikat. Itu tidak akan pernah dimasukkan ke program / fungsi Anda.
- Input dapat berupa panjang atau lebar apa pun, kurang dari batas string bahasa Anda.
- Tidak akan pernah ada
#
dan nomor di baris yang sama. - Semua digit di jalur adalah bilangan bulat positif 0 hingga 9.
- Input atau output dengan baris baru tambahan diperbolehkan.
- Lihat jawaban JS ES6 saya di bawah ini untuk contoh.
- Akan selalu ada setidaknya 1 ruang antara 2 jalur.
- 2 jalur akan selalu memiliki ketinggian yang sama untuk setiap peta, tetapi mungkin berbeda pada peta lainnya.
- Jika Anda bingung tentang kasus uji tertentu, tolong beri tahu saya.
- 1111 ditafsirkan sebagai 1 + 1 + 1 + 1 = 4, bukan 1111 = 1111. Peta ini adalah serangkaian angka satu digit, bukan angka dengan panjang sewenang-wenang.
- Ini kode-golf , jadi jawaban tersingkat dalam byte menang!
- Celah standar dilarang
Jika Anda memiliki pertanyaan tentang tantangan ini, tanyakan pada saya di komentar, dan semoga berhasil!
sumber
$("div > h1").map(function(){return $(this).text()}).get().join("\n");
ke konsol Anda!let answers = $('div > h1').map(function(){return $(this).clone().children(':not(a)').remove().end().text().replace(/\s+/g,' ').trim()}).get();answers.splice(0, 1);answers.join('\n');
Jawaban:
05AB1E ,
2115 byteOutput 0 untuk kiri dan 1 untuk kanan.
Cobalah online!
Penjelasan
sumber
Retina , 28 byte
Cobalah online!
Cetakan
0
untuk kiri dan1
kanan. Diasumsikan bahwa tidak ada spasi tambahan pada garis apa pun.Penjelasan
Konversikan setiap digit
N
menjadi sejumlahN
.Satu setiap baris (
%
), cocokkan berturut-turut (\G
) dari akhir (r
) dan ganti masing-masing dengan-
(yaitu mengubah cabang kanan menjadi-
s).Sortir semua karakter, sehingga semua
-
s ada di depan semua1
s.Batalkan secara berulang sepasang
-
dan1
.Cobalah untuk mencocokkan setidaknya satu
1
(jika demikian, ada lebih banyak bobot di jalur kiri).sumber
Python 2 ,
95898887 byteInilah yang pertama saya lakukan dengan python. Jelas tidak optimal tetapi awal yang layak.
Cobalah online!
sumber
"#"!=y
dengan"#"<y
Chip , 216 byte
Cobalah online!
Sedikit lebih besar dari jawaban untuk bagian 1 ...
Ikhtisar
Chip adalah bahasa 2D yang terinspirasi oleh sirkuit aktual, dan ini berhubungan dengan bit komponen dari setiap byte dalam aliran byte.
Solusi ini menyimpan jumlah digit yang dilihatnya, membalik tanda input setiap kali menemui hamparan spasi, lalu berakhir pada yang pertama
#
. Jadi, untuk inputKami mendapatkan
1 + 1 - 1 - 2 + 2 - 2 + 1 - 1 = -1
. Tanda hasil diberikan sebagai output, angka negatif menghasilkan hasilnya1
, dan positif adalah0
.Oleh karena itu, keluaran
1
berarti bahwa jalan kiri kurang diambil, dan0
berarti benar.Penjelasan
Pada level tinggi, ini cara kerjanya:
Diagonal utama dengan
@
elemen adalah akumulator, output ditentukan oleha
di bagian bawah. (Delapan pasang@
berarti delapan bit, tetapi bit tertinggi adalah tandanya, sehingga solusi ini dapat menangani perbedaan maksimum +127 atau -128. Melimpah di tengah jalan tidak masalah, selama kami kembali sebelum mengakhiri.)Empat baris yang mulai seperti
Ax]}#--
... membaca input, dan dalam kasus digit, meniadakannya (jika perlu) dan meneruskan nilainya ke dalam adders.Tiga baris pertama memutuskan apakah kita melihat angka, atau urutan spasi putih, dan melacak apakah digit perlu dinegasikan.
Elemen yang tersisa terjepit di bawah input dan elemen di kanan menangani kondisi penghentian, dan memetakan output ke ASCII (sehingga kita mendapatkan karakter
'0'
atau'1'
bukan nilai0x0
atau0x1
. Pemetaan ASCII ini tidak memerlukan byte tambahan, kalau tidak saya tidak akan telah memasukkannya.)sumber
JavaScript (ES6), 55 byte
Asumsikan tidak ada spasi tambahan di setiap baris, dan output
true
untukright
,false
untukleft
. Caranya adalah dengan mencocokkan setiap digit pada input, dan jika ada spasi setelahnya pada baris yang sama, kurangi dari total; jika tidak, tambahkan ke total. Jika total akhir kurang dari 0, jalan yang benar adalah yang kurang dilalui oleh, dan sebaliknya.Cobalah:
sumber
x=
di awal, karena ekspresi tidak diperbolehkan, hanya fungsi yang disimpan sebagai variabel dan seluruh program.Python 3 ,
8594 byteCobalah online!
Kutukan! Tidak membaca masalahnya cukup dekat. Menambahkan perbaikan (
''.join()
), tetapi dengan biaya 9 byte.sumber
Python 2, 78 byte
-1 byte terima kasih kepada @math_junkie
Cobalah online
Mencetak
False
untuk jalur kiri danTrue
kanansumber
r=-r
alih-alihr*=-1
harus menyimpan byteRetina , 180 byte
Hitungan byte mengasumsikan penyandian ISO 8859-1.
Cobalah online!
Saya pikir saya juga akan mencoba solusi regex-only (di atas adalah polos .NET regex yang hanya cocok dengan input di mana jalan yang benar harus diambil, kecuali untuk digunakan
¶
sebagai singkatan untuk\n
).Ini berulang berulang, tapi itulah yang terjadi ketika Anda harus memperlakukan setiap digit yang mungkin secara individual.
Solusinya adalah aplikasi yang cukup lurus ke depan kelompok penyeimbang : pertama-tama kita menjumlahkan angka di cabang kiri dengan mendorong
N
tangkapan ke tumpukan3
untuk setiap digitN
. Kemudian kami mencoba untuk mencapai#
, sambil muncul dari tumpukan3
N
kali untuk setiap digitN
di cabang kanan. Ini hanya mungkin jika jumlah digit di cabang kiri lebih besar dari pada di cabang kanan (karena Anda tidak bisa muncul dari tumpukan kosong).sumber
[0-9]
untuk mencocokkan semua digit atau\d
?JavaScript (ES6),
106104 bytes
adalah fungsi yang mengembalikantrue
jika jalan tidak diambil di sebelah kiri. Tidak Disatukan:sumber
PowerShell , 80 byte
Cobalah online!
(Hanya mencicit di bawah jawaban Python.: D)
Output
True
untuk jalur kiri danFalse
jalur kanan.Mengambil input sebagai string yang digambarkan dengan
`n
, yang merupakan padanan PowerShell dari "string yang mengandung backslash literal dan n" , atau sebagai string multiline literal. Kami kemudian-split
memasukan\s
(spasi putih termasuk baris baru) atau#
dan menyaring semua hasil kosong-ne''
, jadi kami hanya memiliki array digit. Itu dimasukkan ke dalam satu lingkaran|%{...}
.Setiap iterasi, pertama-tama kita mengambil elemen saat ini
$_
, melemparkannya sebagaichar
array,-join
bersama-sama dengan tanda tambah+
, dan pipa itu keiex
(kependekan dariInvoke-Expression
dan mirip denganeval
). Itu disimpan$i
jadi kami dengan benar meringkas digit pada potongan jalur ini. Kami kemudian menggunakannya dan negatif sebagai dua elemen dari array($i, -$i)
, diindeks menjadi dengan membalik nilai Boolean bolak-balik. Artinya, iterasi pertama melalui loop ini, potongan path kiri pertama, kami akan mengindeks ke dalam-$i
; waktu berikutnya, kami akan mengambil$i
; dan seterusnya. Mereka diakumulasi ke dalam$a
dengan+=
.Akhirnya, kami mengevaluasi apakah
$a
ini-g
reatert
han0
. Jika ya, maka jalur kanan memiliki jumlah yang lebih besar, jika tidak, jalur kiri memiliki jumlah yang lebih besar. Hasil Boolean itu ditinggalkan di jalur pipa, dan hasilnya tersirat.sumber
CJam ,
1918 byteCobalah online!
Mencetak
0
untuk kiri dan1
kanan.Penjelasan
sumber
Mathematica,
8077 byteTerima kasih kepada Martin Ender karena telah menghemat 3 byte!
Fungsi murni mengambil string yang dibatasi-baris baru sebagai input, dan kembali
True
untuk mengambil jalur kiri,False
untuk mengambil jalur yang benar. Sialan nama-nama perintah Mathematica yang panjang itu; ini seperti 10 token.sumber
Pip ,
1918 byteMengambil input sebagai string tunggal pada baris perintah (yang perlu mengutip dan keluar dari baris baru jika dijalankan pada baris perintah yang sebenarnya). Output
-1
untuk kiri,1
kanan. Cobalah online!Penjelasan
Putaran putaran digit, menambahkan jumlah digit ke penghitungan. Tanda penghitungan ditukar setiap kali, dengan hasil akhir bahwa nilai-nilai tangan kiri negatif dan nilai-nilai tangan kanan positif. Kemudian kami mencetak tanda penghitungan akhir (
-1
atau1
).sumber
Haskell , 64 byte
Cobalah online! Penggunaan: Fungsi anonim
(>0).f.words
mengambil string yang dipisahkan baris baru sebagai argumen dan kembaliFalse
untuk kiri danTrue
kanan.Penjelasan:
Diberikan input
yang string
" 99 989\n 99 89\n 99 99\n #\n #\n #"
, makawords
strip semua baris dan ruang dan mengembalikan daftar string yang tersisa:["99","989","99","89","99","99","#","#","#"]
. Fungsif
mengambil dua elemen pertamaa
danb
dari daftar ini dan memeriksa apakaha
string adalah digit dengan membandingkannya dengan string "#". (Karena char'#'
lebih kecil dari semua karakter digit'0'
,'1'
, ... setiap string yang dimulai dengan digit akan leksikografi lebih besar dari"#"
.) Fungsig
memetakan setiap char dalam string ke kode karakter ascii dan mengembalikan jumlah mereka. Dalamf
kita menerapkang
kea
danb
menghitungg a - g b
, itu adalah nilai dari jalur kiri dikurangi nilai yang benar, dan menambahkannya ke panggilan rekursif kef
untuk menangani baris berikut. Jika jalur kiri lebih banyak dilalui, hasilnyaf
akan negatif dan sebaliknya positif untuk jalur kanan, jadi(>0)
periksa apakah hasilnya lebih besar dari nol.sumber
Python 3 , 84 byte
Karena semua pengiriman Python saat ini adalah fungsi, saya pikir saya akan berkontribusi program lengkap.
Mencetak
True
jika jalur kiri kurang dilalui,False
jika tidak. Cobalah online!Untuk setiap baris input, ini terbagi pada spasi putih, menjumlahkan digit setiap elemen yang dihasilkan, dan menambahkannya ke penghitungan sambil membalik tanda penghitungan pada setiap langkah. Ini terus membaca jalur input sampai menyentuh satu dengan
#
, di mana titikmap(int,n)
menimbulkan pengecualian dan kami keluar dari loop, mencetakTrue
jika penghitungan positif danFalse
sebaliknya.sumber
Batch, 169 byte
Mencetak
0
untuk kiri,-1
untuk kanan. Catatan: Membaca baris sampai menemukan satu dengan#
, lalu berhenti membaca. Perbedaan jumlah path dibatasi hingga 511 (tambahkan 1 byte untuk mendukung perbedaan yang lebih besar). Tidak lebih dari 9 digit di setiap baris setiap jalur (mendukung sejumlah baris). Penjelasan:d
Subrutin mengambil dua parameter: apakah akan menambah atau mengurangi dan digit. Ini mengekstrak digit terakhir dengan modulo sebesar 10 dan digit yang tersisa dengan membagi dengan 10 dan menyebut dirinya secara rekursif sementara masih ada digit yang tersisa. Thec
subroutine mengambil tiga parameter: apakah untuk menambah atau mengurangi, angka menambah atau mengurangi, dan selanjutnya Angka menambahkan. Itu memanggild
subrutin untuk menangani angka untuk ditambahkan dan kemudian jatuh untuk menangani dua parameter pertama. Ini berarti bahwa memanggilc
subrutin dengan parameter-
dan digit kiri dan kanan akan menambah digit kanan dan mengurangi digit kiri. Akhirnya hasilnya digeser untuk mengekstrak tanda.sumber
Oktaf, 46 byte
Cobalah online! Fungsi yang mengambil array karakter 2D
a
sebagai input.Penjelasan:
sumber
Java 7,
219216 byteSedikit lebih lama dari 52 byte saat ini. ;)
Dan kembali lagi
false
ke kanan dantrue
kiri.Penjelasan:
Kode uji:
Coba di sini.
Keluaran:
sumber