Kapal Baru Theseus

9

The Ship Theseus merupakan pertanyaan lama yang berjalan seperti:

Jika sebuah kapal telah mengganti semua bagian aslinya, apakah masih kapal yang sama?

Untuk golf ini, kita akan perlahan-lahan mengganti "bagian" pada "kapal", dan melihat berapa lama untuk mendapatkan kapal yang sama sekali baru.

Tugas

Sebuah kapal terdiri dari setidaknya dua bagian. Bagian diberikan sebagai array bilangan bulat positif (bukan nol), mewakili kondisi bagian itu.

Pada setiap siklus, secara acak pilih satu bagian dari daftar dengan cara yang seragam. Kondisi bagian itu akan berkurang satu. Ketika kondisi suatu bagian mencapai nol, itu digantikan oleh bagian yang baru. Bagian baru dimulai dengan nilai kondisi yang sama seperti aslinya.

Pada siklus pertama di mana semua bagian telah diganti (setidaknya) satu kali, berhenti dan output jumlah siklus yang dibutuhkan.

Misalnya (anggap saya memilih bagian secara acak di sini):

2 2 3  <- starting part conditions (input)
2 1 3  <- second part reduced
2 1 2  ...
2 1 1 
2 2 1  <- second part reduced to zero, replaced
1 2 1 
1 2 3  <- third part replaced
1 1 3 
2 1 3  <- first part replaced

Keluaran untuk contoh ini adalah 8, karena butuh delapan siklus untuk semua bagian diganti. Output yang tepat harus berbeda untuk setiap proses.

I / O

Input hanya adalah daftar / array bilangan bulat untuk kondisi bagian. Satu-satunya output adalah sejumlah siklus. Anda dapat mengambil / memberikan nilai-nilai ini dengan cara biasa: STDIO, argumen fungsi / pengembalian, dll.

Uji Kasus

Karena output tidak diperbaiki, Anda dapat menggunakan apa pun yang ingin Anda uji, tetapi inilah pasangan untuk tujuan standardisasi:

1 2 3 4

617 734 248 546 780 809 917 168 130 418

19384 74801 37917 81706 67361 50163 22708 78574 39406 4051 78099 7260 2241 45333 92463 45166 68932 54318 17365 36432 71329 4258 22026 23615 44939 74894 19257 49875 39764 62550 23750 4731 54121 8386 45639 54604 77456 58661 34476 49875 35689 5311 19954 80976 9299 59229 95748 42368 13721 49790
Geobit
sumber
1
Apakah saya melewatkan sesuatu, atau tidak masalah bahwa ketika bagian mencapai 0, digantikan oleh bagian baru?
xnor
@ xnor Yah tidak masalah untuk mendapatkan jawabannya, tidak (dan sepertinya itu hal yang harus dilakukan untuk melewatkannya). Namun secara tematis , bagian-bagian kapal perlu diganti: P
Geobits

Jawaban:

4

Pyth, 12 byte

f!eSXOUQQtZ1

Demonstrasi.

Bagaimana itu bekerja:

Ini didasarkan di sekitar filter Pyth yang tak terbatas, yang menguji ekspresi dengan meningkatkan input hingga mengembalikan sesuatu yang benar, lalu mengembalikan input yang menyebabkan ini terjadi. Namun, ekspresi yang akan diuji tidak akan menggunakan nilai input.

Sebaliknya, ekspresi akan memodifikasi daftar input dengan mengurangi entri acak. Ini dicapai melalui ekspresi XOUQQtZ. Ini berarti menambah indeks OUQdalam daftar Qdengan tZ. OUQadalah indeks acak dengan panjang Q, dan tZ-1. Qdiinisialisasi ke daftar input.

Setelah memodifikasi Qdengan cara ini, kami mengambil nilai saat ini, yang Xmengembalikan, mengambil entri maksimumnya eS, dan mengambil logika bukan dari nilai itu !. Ini mengembalikan nilai kebenaran untuk pertama kalinya ketika setiap elemen Qtelah direduksi menjadi 0atau di bawah untuk pertama kalinya.

Untuk memastikan bahwa jumlah yang dikembalikan akan persis berapa kali yang Qdiubah, kami akan mulai menghitung 1, menunjukkan saat pertama kali dipanggil, telah ada 1 modifikasi. Untuk melihat Qseperti apa setelah setiap iterasi kode, periksa versinya di sini .

isaacg
sumber
5

GolfScript ( 26 24 byte) / CJam ( 20 18 byte)

GolfScript:

~{$)*}{.,rand{(+}*((+}/,

Demo online

CJam (ide yang sama tetapi implementasi yang sedikit berbeda):

q~{_mr((+_$)*}g;],

Demo online

Input ada di stdin dalam formulir [2 2 3].

Ini adalah salah satu kesempatan langka di mana operator buka GolfScript berguna. Hal ini memungkinkan kita untuk mengumpulkan negara-negara bagian yang dilewati kapal, dan kemudian menghitungnya di akhir. Perhatikan bahwa array yang dihitung termasuk keadaan awal (input) tetapi bukan keadaan akhir di mana elemen terakhir dikurangi menjadi 0.

Namun, meskipun CJam tidak memiliki Unfold kemampuannya untuk mengocok array seragam untuk hanya 2 chars jumlah untuk banyak dan memungkinkan untuk keluar di atas.

Peter Taylor
sumber
3

Python 3, 91 71 byte

20 (!) Byte disimpan berkat @xnor.

from random import*
def f(p):shuffle(p);p[0]-=1;return max(p)<1or-~f(p)

Fungsi rekursif yang memanggil dirinya sendiri dengan nilai potong yang lebih kecil hingga semua nilai potong adalah 0 atau negatif dan setiap fungsi mengembalikan nilai pengembalian anaknya + 1 dan yang terakhir disebut mengembalikan 1.

randomra
sumber
Anda dapat memeriksa keberadaan angka positif dengan max(p)>0.
xnor
Dan meniadakan kondisi seperti itu max(p)<1or-~f(p)memungkinkan Anda menghindari or 1, karena True==1.
xnor
Anda dapat secara efektif mengurangi elemen acak pdengan shuffle(p);p[0]-=1.
xnor
@ xnor Wow, terima kasih! Ini semua luar biasa!
randomra
1

Python 3, 175 byte

import random
p,t=input().split(),0;f,r=[int(i)for i in p],[0]*len(p)
while 0 in r:
 f[random.randint(0,len(f)-1)]-=1;t+=1
 for x in range(len(f)):
  r[x]=int(f[x]<1)
print(t)

Tidak terlalu bagus bermain golf .

Cobalah online di sini

Tim
sumber
Komentar penghancuran diri
Tim