Boardgame Terra Mystica memiliki beberapa mekanisme yang sangat menarik untuk salah satu sumber daya utama, daya. Alih-alih mendapatkan dan mengeluarkan unit daya dari bank, setiap pemain memulai permainan dengan tepat 12 unit daya yang didistribusikan di tiga "mangkuk", yang diberi label I, II dan III. Mendapatkan dan membelanjakan daya kemudian dengan mudah menggeser kekuatan di antara mangkuk-mangkuk ini:
- Untuk menghabiskan satu unit daya, pindahkan dari mangkuk III ke mangkuk I (asalkan Anda memiliki unit di mangkuk III).
- Saat Anda mendapatkan unit daya, jika ada unit di mangkuk I, pindahkan ke mangkuk II. Jika tidak ada unit di mangkuk I, tetapi ada unit di mangkuk II, pindahkan ke mangkuk III. Jika semua unit sudah ada di mangkuk III, tidak ada yang terjadi.
- Ketika Anda mendapatkan atau menghabiskan beberapa unit sekaligus, mereka diproses satu unit sekaligus.
Berikut ini sebuah contoh. Katakanlah, seorang pemain mulai dengan distribusi daya berikut (diberikan secara berurutan I | II | III
):
5 | 7 | 0
Kekuatan mereka berubah sebagai berikut jika mereka mendapatkan dan menghabiskan kekuasaan beberapa kali:
5 | 7 | 0
Gain 3 ==> 2 | 10 | 0
Gain 6 ==> 0 | 8 | 4 (move 2 power from I to II,
then the remaining 4 from II to III)
Gain 7 ==> 0 | 1 | 11
Spend 4 ==> 4 | 1 | 7
Gain 1 ==> 3 | 2 | 7
Spend 7 ==> 10 | 2 | 0
Gain 12 ==> 0 | 10 | 2 (move 10 power from I to II,
then the remaining 2 from II to III)
Gain 12 ==> 0 | 0 | 12 (the two excess units go to waste)
Tugas Anda adalah untuk menghitung hasil dari salah satu acara perolehan atau pengeluaran tersebut.
Tantangan
Anda diberi empat bilangan bulat sebagai input. Tiga pertama, I
, II
, III
, mewakili jumlah daya di masing-masing tiga mangkuk. Mereka akan menjadi non-negatif, dan mereka akan berjumlah 12. Angka keempat P
,, adalah jumlah daya yang diperoleh atau dihabiskan, dan akan berada dalam kisaran inklusif [-III, 24]
(sehingga Anda dapat mengasumsikan bahwa pemain tidak akan pernah mencoba menghabiskan lebih banyak daya daripada saat ini, tetapi mereka mungkin mendapatkan kekuatan lebih dari yang mereka butuhkan untuk memindahkan semua kekuatan ke mangkuk III).
Anda dapat mengambil angka-angka ini dalam urutan yang konsisten, sebagai argumen terpisah, sebagai daftar bilangan bulat, atau sebagai string yang berisi bilangan bulat ini. Anda juga dapat mengambil P
sebagai salah satu argumen, seperti I
, II
, III
sebagai daftar argumen yang terpisah.
Anda harus keluaran tiga bilangan bulat I'
, II'
, III'
yang mewakili jumlah daya di setiap mangkuk setelah P
unit diperoleh atau dihabiskan, mengikuti aturan yang dijelaskan di atas.
Anda dapat menulis program atau fungsi dan menggunakan salah satu metode standar kami untuk menerima input dan memberikan output.
Anda dapat menggunakan bahasa pemrograman apa pun , tetapi perhatikan bahwa celah ini dilarang secara default.
Ini adalah kode-golf , sehingga jawaban terpendek yang valid - diukur dalam byte - menang.
Uji Kasus
I II III P => I' II' III'
5 7 0 3 => 2 10 0
2 10 0 6 => 0 8 4
0 8 4 7 => 0 1 11
0 1 11 -4 => 4 1 7
4 1 7 0 => 4 1 7
4 1 7 1 => 3 2 7
3 2 7 -7 => 10 2 0
10 2 0 12 => 0 10 2
0 10 2 12 => 0 0 12
sumber
Jawaban:
Mathematica, 52 byte
Ini adalah fungsi tanpa nama yang mengambil daftar
{I, II, III, P}
sebagai input dan mengembalikan daftar{I', II', III'}
.Solusi bentuk tertutup. Itu belum benar-benar terasa optimal ...
sumber
{##,12-+##}&[#-#4~Min~#,Max[#2+#-Abs[#4~Max~0-#],0]]&
satu byte lebih lama. Saya suka itu12-+##
.C,
9794 byteDalam bentuk yang tidak diserang:
sumber
Python 2, 104 byte
Cobalah online
Tidak Terkumpul:
sumber
Haskell, 58 byte
Nilai perantara
m
menunjukkan jumlah daya yang mengalir dari (atau ke, jika negatif) mangkuk pertama,z
menunjukkan jumlah daya di mangkuk ketiga setelah tindakan. Pengoptimalan satu byte menit terakhir mengubah ekspresi lama untuk mangkuk kedua dari12-a+m-z
menggunakan identitasa+b+c=12
.Jenis hasil alami adalah triple untuk mangkuk, sehingga input juga mengambil mangkuk sebagai triple dan kekuatan berubah sebagai argumen kedua. Ini memungkinkan untuk menangani semua kasus uji dengan satu aplikasi
scanl
:sumber
Röda ,
10094 byteTidak Terkumpul:
sumber
++
dan--
operator?JavaScript,
6159 byteCobalah online!
sumber
GNU sed , 66 byte
Termasuk +1 untuk
-r
Menggunakan unary (lihat konsensus ini ).
Cobalah online!
sumber
Retina ,
46413938 byteTerima kasih kepada Martin Ender untuk beberapa saran berguna!
Mengambil input di unary. Baris pertama berisi jumlah daya dalam tiga cawan, dipisahkan koma, baris kedua jumlah daya untuk siklus.
Test suite - Mengambil semua input pada satu baris dan mengonversi dari desimal ke unary dan sebaliknya untuk kenyamanan penggunaan.
Penjelasan
Kasus positif: kami berulang kali melepas pelapis
1
dari baris kedua, dan memindahkan a1
dari mangkuk pertama yang tidak kosong ke yang berikutnya, selama operasi ini dimungkinkan (yaitu jumlah daya untuk siklus tidak nol dan tidak semua kekuatan ada di mangkuk ketiga). Thes
sarana pengubahsingle-line
, memungkinkan.
untuk mencocokkan juga baris baru.Kasus negatif: dilakukan semua dalam satu langkah, memindahkan jumlah daya yang ditunjukkan oleh input terakhir dari mangkuk ketiga ke mangkuk pertama. Ini juga akan menghapus garis yang mengandung jumlah daya negatif untuk bergerak.
Simpan (grep) hanya baris yang mengandung koma. Ini akan menyingkirkan sisa-sisa baris pertama.
sumber
Python 2, 91 byte
Berdasarkan jawaban ini
Cobalah online
Tidak Terkumpul:
sumber
Batch, 87 byte
Gunakan rumus berikut:
Karena Batch tidak memiliki lebih sedikit dari operator, saya menghitung
i = min(-i, 0)
menggunakani*=i>>5
.sumber
Perl 6 , 99 byte
Biarkan
a
,,b
danc
jadilah jumlah token awal dalam mangkuk I, II, dan III. Kemudian, untuk kasus daya tambahan, daftar dibuat yang berisia
salinan triplet(-1, 1, 0)
, diikuti oleha + b
salinan triplet(0, -1, 1)
, diikuti oleh salinan infinite dari0
.d
Elemen pertama dari daftar ini,d
menjadi jumlah daya yang ditambahkan, ditambahkan elementwise ke distribusi daya awal.Untuk mengurangi daya (negatif
d
), bentuk tertutup sederhana yang digunakan:(a - d, b, c + d)
.sumber
tinylisp , 134 byte
Menentukan fungsi
f
yang mengambil empat argumen, tiga cawan (x y z
) dan jumlah daya yang ditransaksikan (p
), dan mengembalikan daftar tiga cawan setelah transaksi. Berikut ini adalah versi yang diberi spasi dengan baik pada semua test case: Cobalah online!sumber