Dalam permainan papan The Settlers of Catan , ada lima jenis sumber daya: Brick, Log, Ore, Wheat, dan Sheep. Membangun pemukiman membutuhkan biaya untuk mendapatkan Brick, Log, Gandum, dan Domba. Namun, Anda juga dapat berdagang di empat sumber daya yang identik untuk mendapatkan sumber daya dari jenis yang berbeda. Misalnya, jika Anda memiliki empat bijih di tangan, Anda bisa menukar semuanya dan mendapatkan satu domba.
Tugas Anda adalah menentukan apakah saya dapat membangun pemukiman atau tidak, dengan tangan saya.
Tugas Anda
Masukan akan menjadi urutan huruf B
, L
, O
, W
, dan S
, diambil dalam format yang wajar. Surat-surat ini sesuai dengan lima jenis sumber daya yang diberikan di atas. Anda harus memberi tahu apakah saya memiliki sumber daya yang diperlukan untuk membangun penyelesaian, dengan mempertimbangkan kemungkinan perdagangan empat jenis.
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
Catatan
- Anda tidak harus menampilkan perdagangan apa yang perlu saya lakukan atau berapa banyak pemukiman yang bisa saya bangun. "Ya" atau "tidak" yang sederhana akan berhasil.
- Anda tidak boleh berasumsi bahwa input dalam urutan tertentu. Secara khusus, Anda mungkin tidak berasumsi bahwa sumber daya dari jenis yang sama dikelompokkan bersama, jadi
OBLSO
merupakan input yang valid. - Ini adalah masalah keputusan , jadi Anda dapat menggunakan nilai apa pun yang Anda inginkan dengan "ya" dan "tidak", selama dua nilai yang dipilih berbeda dan konsisten.
- Satu-satunya aturan yang kami perhatikan di sini adalah yang tercantum di atas. Aturan Settler of Catan yang lebih rumit seperti perdagangan dengan pemain lain atau di pelabuhan tidak relevan di sini.
- Karakter input (
B
,L
,O
,W
,S
) dapat diganti dengan nilai-nilai lain jika lebih mudah untuk bahasa tertentu pilihan Anda, asalkan ada lima input yang berbeda. Jika Anda menggunakan nilai input lain, harap sebutkan dalam jawaban Anda.
Contohnya
BLWS -> Yes
OOOOWLB -> Yes (trade four O for a S)
OOW -> No
BBBO -> No
(empty input) -> No
BBBBLW -> No
BBBBBLW -> Yes (trade four B for a S)
OOOOOOOOOOOOOOOO -> Yes (sixteen O; trade for B, L, W, S)
BLBLBLBLBL -> Yes (trade L for W and B for S)
BLSWBLSWBLSW -> Yes (extra, unused resources are ignored)
sumber
Jawaban:
Python 2 , 54 byte
Cobalah online!
Untuk setiap sumber daya kami, kami menghitung jumlah "kebebasan" yang diberikan dengan memiliki n dari sumber daya itu. Suatu kebebasan merupakan kesempatan untuk mengisi salah satu slot bata-kayu-gandum-domba yang perlu kita isi untuk menyelesaikan, dengan memperhitungkan fakta bahwa kita dapat mengkonversi sumber daya kita.
Untuk semua BLSW, memiliki salah satu sumber daya memberi kita satu kebebasan seperti itu, dan setiap kelebihan tambahan 4 memberi kita yang lain. Aturan penghitungan kebebasan adalah seperti ini:
Jadi n batu bata / log / gandum / domba memberikan ⌊ (n + 3) / 4⌋ kebebasan.
Untuk bijih, hanya kelebihan foursome yang dihitung. Aturan penghitungan kebebasan adalah seperti ini:
Jadi n ores memberikan ⌊n / 4⌋ kebebasan.
Teorema: kita dapat menyelesaikan jika dan hanya jika kita memiliki ≥ 4 "kebebasan".
Jadi kami menghitung kebebasan kami dan memeriksa apakah ada ≥ 4 di antaranya. Untuk menangani penghitungan bijih sebagai ⌊n / 4⌋ tetapi sumber daya lain ⌊ (n + 3) / 4⌋, kami secara artifisial meningkatkan jumlah sumber daya lainnya sebesar 3 dan kemudian menghitung ⌊n / 4⌋ untuk semuanya. Kami melakukan ini dengan memetakan
(s+"BLSW"*3).count
alih-alihs.count
.Bukti :
Misalkan kita bisa menyelesaikan. Kemudian untuk masing-masing [B, L, S, W], kami (a) menggunakan 1 dari sumber daya yang telah kami miliki, atau (b) mengorbankan 4 dari beberapa sumber daya lain (termasuk bijih) untuk membuatnya. Dalam kedua kasus, kami menghitung setidaknya 1 kebebasan dengan aturan di atas. Jadi kita memiliki ≥ 4 kebebasan.
Misalkan kita memiliki 4 kebebasan, k yang disebabkan oleh "ekses" (setiap kebebasan dari bijih adalah ekses, dan setiap kebebasan dari sumber daya lain melewati yang pertama juga ada) dan 4 − k di antaranya adalah saksi memiliki setidaknya satu bata / log / gandum / domba (yang memberi "kebebasan pertama"). Kemudian kita mengisi 4 − k slot dengan batu bata / log / gandum / domba yang memberi kita kebebasan pertama kita, dan mengisi slot k yang tersisa dengan mengubah kelebihan kita. Semua 4 slot diisi dan kita bisa menyelesaikan. Kami jelas masih bisa melakukan ini jika kami memiliki lebih dari 4 kebebasan.
Bukti ini menyebalkan, tapi saya mengantuk. Saya yakin ada penjelasan yang lebih baik.
sumber
s
adalahOOOOBLW
, Anda akhirnya mendapatkansum(n/4for n in map(("OOOOBLWBBBLLLSSSWWW").count,"BLSWO"))>3
... jadi untuk masing-masingBLOWS
Anda menghitung berapa kali muncul dalam pemula string"BLWS"*3
, maka jumlah itu."OOOOBLWBLSWBLSWBLSW"
Sebenarnya string itu , tetapi hitungnya sama, tentu saja.)in"BLSWO"
tidak perlu dalam Python, bukan? Tampaknya bekerja di TIO setidaknya ..Python 2 ,
5251 byte-1 byte terima kasih kepada Luke (ganti
>=0
dengan<0
, membalikFalse
/True
hasil)Fungsi tanpa nama mengambil string karakter B , O , W , L , dan S (seperti pada OP) dan kembali
False
jika Anda dapat menyelesaikan atauTrue
jika tidak.Cobalah online! (memaksa output ke
yes/no
OP).Bagaimana?
Ini adalah port jawaban Jelly saya. Kita perlu menebus B , W , L , atau S yang hilang dari sisa setelah menggunakan salah satu dari mereka masing-masing. Dengan demikian kita dapat menambahkan O ekstra ke tangan kita, kemudian mengurangi semua hitungan dengan satu, lalu integer membagi semua jumlah dengan empat dan kemudian menjumlahkan - jika hasilnya nol atau lebih kita dapat menyelesaikan (baik karena tidak ada sumber daya yang diperlukan hilang) atau karena kita dapat berdagang untuk mendapatkan yang hilang.
sumber
False
untuk'yes'
danTrue
untuk'no'
? Kemudian Anda bisa mengubah>=
ke<
, menghemat 1 byte.Pyth , 14 byte
Coba di sini! atau Verifikasi semua kasus uji.
Pyth ,
31 27 1716 byteVerifikasi kasus uji.
Bagaimana cara kerjanya?
Penjelasan # 1
Penjelasan # 2
Ini adalah kode yang digunakan oleh program saya:
sumber
+%ld4/ld4
->s.Dld4
//Q4 4
bisa/Q16
tapi saya tidak benar-benar yakin ...BBBO
, misalnya4
dan membaginya dengan4
.Jelly ,
1312 byteTautan monadik yang menerima daftar angka yang mewakili sumber daya yang Anda miliki dan kembali
1
jika Anda dapat menyelesaikannya atau0
jika tidak.Sumber daya adalah
1, 2, 3, 4, 5
tempat5
mewakili Bijih .Cobalah online! atau lihat test-suite (menggunakan OP IO).
Bagaimana?
Idenya adalah untuk pertama menghitung sumber daya berdasarkan jenis, kemudian mengurangi semua jumlah B , L , W , dan S oleh satu - jika kita tidak menghitung satu pun dari keempat ini maka mereka sekarang akan memiliki entri -1 - kita perlu memperoleh mereka dari sumber daya kami yang tersisa (Ini sebenarnya dicapai dengan menambahkan O tambahan (
5
) dan mengurangi semua lima hitungan dengan 1 ). Selanjutnya kita integer-bagi semua nilai-nilai ini dengan empat untuk melihat berapa banyak unit kita dapat berdagang dengan masing-masing jumlah kita yang tersisa berdasarkan jenis sumber daya sementara tidak mempengaruhi jumlah -1 dan 0 (perhatikan bahwa -1 integer-dibagi dengan empat adalah-1 , bukan 0 ). Terakhir kami menjumlahkan nilai-nilai dan memeriksa apakah hasilnya lebih besar dari atau sama dengan nol (di sini lebih besar dari -1 dapat digunakan karena kami selalu memiliki bilangan bulat).sumber
Java 8, 101 byte
Lambda dari
int[]
keboolean
. Tetapkan untukFunction<int[], Boolean>
.Cobalah secara Online
Masukan dan keluaran
Input adalah array bilangan bulat dari 0 hingga 4, inklusif. 4 mewakili Bijih, dan pemetaan lainnya tidak material. Kasing uji saya adalah terjemahan langsung dari pertanyaan-pertanyaan tersebut, dengan 0 sebagai Brick, 1 sebagai Log, 2 sebagai Gandum, dan 3 sebagai Domba.
Keluaran adalah apakah penyelesaian dapat dibangun.
Tidak disatukan
Penjelasan
h
adalah jumlah sumber daya empat kali lipat tersedia untuk diperdagangkan. Kami beralih ke setiap jenis sumber daya (kecuali Bijih), menambahh
setiap empat kali lipat sumber daya tambahan yang kami miliki, dan mengurangi di mana tidak ada sumber daya yang ada. Maka hasil kami adalah apakahh
tidak negatif.Garis
menyesuaikan dengan
h
tepat terlepas dari apakah tidak ada sumber daya (kekurangan) atau setidaknya ada satu sumber daya (surplus).f[i]
didekrementasi untuk memperhitungkan sumber daya yang dibutuhkan dalam kasus surplus, menghasilkan -1 dalam kasus kekurangan. Pergeseran kanan yang ditandatangani mengurangi ekspresi menjadi 0 (kasus surplus) atau -1 (kasus kekurangan), sehingga bitwise OR dengan jumlahf[i++] / 4
surplus empat kali lipat (dalam kasus surplus) tidak memiliki efek dalam kasus kekurangan tetapi menghasilkan angka sendiri dalam kasus surplus.Ucapan Terima Kasih
sumber
...for(h=f[4]/4;i<4;h+=f[i++]/4)n+=--f[i]>>-1;return~h<n;
.a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;h+=f[i++]/4)h+=--f[i]>>-1;return~h<0;}
a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;)h+=--f[i]>>-1|f[i++]/4;return~h<0;}
Retina , 34 byte
Cobalah online! Penjelasan: Membangun penyelesaian membutuhkan 4 sumber daya yang merupakan B, L, W, atau S pertama Anda, atau 4 sumber daya lainnya dengan jenis yang sama. Ini sama dengan menambahkan tiga dari masing-masing empat jenis sumber daya, dan kemudian menghitung untuk melihat apakah Anda memiliki empat set empat.
sumber
Jelly , 23 byte
Cobalah online!
Lihat tabel berikut untuk nilai:
sumber
Retina , 43 byte
Cobalah online!
sumber
Python 3 ,
7978 byteSunting: -1 byte berkat @ Mr.Xcoder
Cobalah online!
sumber
MATL , 19 byte
Input adalah vektor baris numerik di mana huruf direpresentasikan sebagai angka sebagai berikut:
Output adalah
1
untuk kebenaran,0
untuk kepalsuan.Cobalah online !: verifikasi semua kasus uji .
Bagaimana itu bekerja
BLWS
) tidak nol. Ini memberi angka c .Kode yang dikomentari
sumber
> <> , 61 byte
Cobalah online!
Gunakan pemetaan sumber daya berikut:
Tidak masalah pemetaan apa yang digunakan, selama mereka berada dalam jangkauan
0-4
, dan0
digunakan untuk O. Menggunakan fakta bahwa mencari kombinasiBLWS
sama dengan mencari kombinasiOBLWS
sementara sudah memilikiO
in tangan.sumber
05AB1E , 19 byte
0 -> Bijih
1 -> Brick
2 -> Log
3 -> Gandum
4 -> Domba
Mengembalikan 0 saat false, dan 1 sebaliknya.
Cobalah online!
Penjelasan:
Solusi non-kompetitif: 17 byte
Ada bug di 05AB1E ketika saya pertama kali mengirimkan solusi itu, di mana beberapa operator menangani input kosong dengan buruk. Ini menghasilkan solusi ini menjawab
1
pada input kosong. Ini sekarang telah diperbaiki, jadi solusi ini berfungsi dengan baik.Perbedaannya di sini adalah bahwa kami menambahkan bijih sebelum menghapus salah satu dari setiap sumber daya, tanpa pandang bulu, menghitung jumlah sumber daya yang dihilangkan dengan cara itu. Kami kemudian mengurangi penghitung dengan 1 untuk mendapatkan jumlah B, L, W, dan S. yang benar.
Cobalah online!
sumber
JavaScript (SpiderMonkey) , 116 byte
Cobalah online!
Super Clunky jawaban buruk. Saya yakin itu bisa dibersihkan lebih banyak. Metode yang terinspirasi oleh jawaban Lynn di utas ini.
sumber
Kotlin ,
131129 bytepengajuan
Uji
Tidak dapat bekerja di TryItOnline, tetapi berfungsi di try.kotlinlang.org
sumber