Diberi dua bilangan bulat positif p dan q , tugas Anda adalah mengembalikan array A yang dibuat dengan menerapkan algoritma berikut:
- Mulai dengan A = [p, q] dan d = 2
- Untuk setiap pasangan (x, y) dari angka-angka yang berdekatan dalam A yang jumlahnya dapat dibagi dengan d , masukkan (x + y) / d antara x dan y .
- Jika setidaknya satu pasangan yang cocok ditemukan, naikkan d dan lanjutkan dengan langkah # 2. Jika tidak, berhenti dan kembali A .
Contoh
Di bawah ini adalah detail proses untuk p = 1 dan q = 21 .
1 21 | Iteration #1: we start with d = 2 and A = [1, 21]
\/ | 1 + 21 is divisible by 2 -> we insert 11
22/2=11 |
|
1 11 21 | Iteration #2: d = 3, A = [1, 11, 21]
\/ | 1 + 11 is divisible by 3 -> we insert 4
12/3=4 |
|
1 4 11 21 | Iteration #3: d = 4, A = [1, 4, 11, 21]
\/ | 11 + 21 is divisible by 4 -> we insert 8
32/4=8 |
|
1 4 11 8 21 | Iteration #4: d = 5, A = [1, 4, 11, 8, 21]
\/ \/ | 1 + 4 is divisible by 5 -> we insert 1
5/5=1 15/5=3 | 4 + 11 is divisible by 5 -> we insert 3
|
1 1 4 3 11 8 21 | Iteration #5: d = 6, A = [1, 1, 4, 3, 11, 8, 21]
| no sum of two contiguous numbers is divisible by 6
| -> we stop here
Maka output yang diharapkan: [1, 1, 4, 3, 11, 8, 21]
Klarifikasi dan aturan
- Input dan output dapat ditangani dalam format apa pun yang wajar. Bilangan bulat p dan q dijamin lebih besar dari 0. Jika itu membantu, Anda dapat mengasumsikan q ≥ p .
- Langkah kedua dari algoritma seharusnya tidak diterapkan secara rekursif ke elemen yang baru saja dimasukkan pada iterasi yang sama. Misalnya, A = [1, 1] dan d = 2 harus mengarah ke [1, 1, 1] (bukan daftar 1 yang tak terbatas).
- Ini kode-golf , jadi jawaban tersingkat dalam byte menang!
Uji kasus
p | q | Output
----+-----+-------------------------------------------------------------------------------
1 | 1 | [1,1,1]
1 | 2 | [1,2]
1 | 3 | [1,1,2,3]
2 | 6 | [2,1,2,1,4,1,2,6]
3 | 13 | [3,1,8,1,3,1,7,1,2,1,5,1,3,2,13]
9 | 9 | [9,6,9,6,9]
60 | 68 | [60,13,1,4,31,2,3,5,2,19,64,7,13,1,2,5,2,27,44,3,4,8,2,1,12,1,5,3,28,2,4,16,1,
| | 2,12,1,2,1,10,1,6,68]
144 | 336 | [144,68,3,4,8,1,12,1,4,2,28,13,128,44,17,92,240,58,108,5,17,1,2,5,3,28,3,1,11,
| | 60,3,6,2,42,2,4,26,192,54,132,7,1,15,1,3,1,18,1,4,2,30,3,1,12,1,9,78,46,336]
Jika Anda ingin menguji kode Anda pada test case yang sedikit lebih besar, inilah output yang diharapkan untuk:
- p = 12096 (2 6 * 3 3 * 7)
- q = 24192 (2 7 * 3 3 * 7)
code-golf
array-manipulation
Arnauld
sumber
sumber
ü
kerjanya ... ini memungkinkan saya untuk meningkatkan salah satu dari jawaban saya sebelumnya :-)[1,2,3,4] ü = [[1,2],[2,3],[3,4]]
, juga jika Anda menambahkan "-d" dalam argumen ketika menjalankan 05AB1E, itu menghasilkan output "debug" yang saya lampirkan di atas. (Menambahkan tautan debug di atas juga). Alasan berpasangan rapi adalah karena untuk perintah yang membuat vektor secara otomatis, itu hanya menerapkan perintah berpasangan (berjalanü)
pada daftar menunjukkan ini dengan baik).-d
... Saya menemukan hal itu waaay terlambat, setelah "debugging" dengan,q
"print and stop". Itu menyakitkan.=
karena tidak muncul, dan hanya mencetak item terakhir yang didorong ke stack.U
Anda dapat menggantinyaX
denganŠ
.Mathematica,
72645958 byteCobalah online!
Bagaimana itu bekerja
Kami mengambil input sebagai daftar
{p,q}
. Langkah iterasi dirumuskan kembali sebagai:(a+b)/d
antara setiap dua elemena
danb
:(x+{##2,}&@@x)
hitung urutana+b
's, dengan sebuaha+Null
di akhir. Kami membagi dengand
, danRiffle
menyisipkan masing(a+b)/d
- masing antaraa
danb
. Penambahand
.Integer
elemen dari daftar yang dihasilkan. (Ini menghilangkanNull
diperkenalkan juga oleh{##2,}
.)Ini diulangi sampai hasilnya tidak berubah (yang hanya bisa terjadi karena kami menghapus semua elemen baru, karena tidak ada yang bilangan bulat).
-8 byte terima kasih kepada @MartinEnder dari menggunakan
//.
alih-alihFixedPoint
(dan dari mengambil input sebagai daftar).-6 lebih karena
ListConvolve
sebenarnya tidak terlalu bagussumber
//.
trufFixedPoint
, dan saya hanya akan mengambil input sebagai sepasang bilangan bulat alih-alih dua bilangan bulat terpisah:(d=2;#//.x_:>x~Riffle~ListConvolve[{1,1}/d++,x]~Cases~_Integer)&
//.
denganFixedPoint
, karena saya sangat sukaFixedPoint
.Integer
.Ruby , 80 byte
Cobalah online!
Fungsi rekursif
f
mengambil input sebagai array[p, q]
.sumber
Haskell,
8581 byteCobalah online!
Input diambil sebagai daftar, mis
[1,2]
.Edit: -4 byte terima kasih kepada @Laikoni.
sumber
l%d|l==l#d=l|e<-d+1=l#d%e
.Python 2 ,
112110108105103 byte-2 byte terima kasih kepada Jonathan Frech
-5 byte terima kasih kepada Erik the Outgolfer
Cobalah online!
sumber
y+=[...]*(...);y+=b,
setara dengany+=[...]*(...)+[b]
?Python 2 , 98 byte
Diminta sebagai
f([p,q])
. Cobalah online!Jonathan Allan menyimpan 12 byte. Terima kasih ~!
Penjelasan
f
adalah fungsi rekursif:f(A, B, d)
evalutes untukf(next_A, A, d+1)
, kecualiA == B
, dalam hal ini kembaliA
. (Ini ditangani olehA*(A==B)or …
: jika A ≠ B,A*(A==B)
adalah daftar kosong, yang salah-y, maka…
bagian tersebut dievaluasi; jika A = B makaA*(A==B)
adalahA
, yang tidak kosong dan dengan demikian benar, dan akan dikembalikan.)next_A
dihitung sebagai:Ini paling baik dijelaskan dengan contoh. Kapan misalnya
d = 5
danA = [1, 4, 11, 8, 21]
:sumber
zip
in the place dari enumerate dan gunakan[A[0]]
sebagai nilaisum
awal.[A[0]]
denganA[:1]
:)A*(A==B)
.Python 2 , 111 byte
Cobalah online!
-8 Terima kasih kepada Rod .
Terima kasih kepada Lynn .
sumber
i
dana[x:x]
lebih pendek daria.insert
o
: pzip
dan simpan dua byte !for
loop denganwhile A[o+1:]:o+=1;s=A[o-1]+A[o];b=s%d<1;A[o:o]=[s/d]*b;m|=b;o+=b
Sekam , 22 byte
Mengambil daftar 2-elemen, mengembalikan daftar bilangan bulat dan mengapung. Cobalah online!
Penjelasan
sumber
Perl 5 , 92 + 1 (
-a
) = 93 byteCobalah online!
sumber
Retina , 111 byte
Cobalah online!
Mengambil input sebagai angka yang dipisahkan spasi. Cukup naif mengikuti algoritma yang diberikan, dengan satu-satunya teknik yang terkenal adalah menggunakan simbol penanda
a
,, untuk mencatat ketika salah satu nomor telah disimpan. Ini digunakan untuk bekerja dengan kemampuan pengulangan yang agak terbatas dari Retina, yang hanya memungkinkan Anda untuk mengulang sampai satu set tahapan tidak membuat perubahan keseluruhan pada input ke tahapan tersebut.Penjelasan:
Ini akan menggunakan contoh yang sama seperti dalam pertanyaan.
Kami mengubah larik input angka menjadi larik unary yang dipisahkan koma, jadi kami harus:
Masukkan
d
kode kita di awal, beri kami:Ini sedikit lebih rumit.
{
memulai sekelompok tahapan yang akan dieksekusi hingga mencapai titik tetap. Kemudian,+
menunjukkan bahwa tahap ini sendiri harus dieksekusi sampai titik yang tetap. Tahap ini menambahkan setiap pasangan angka yang berdekatan tetapi menyisipkannya tanpa titik koma tambahan. Sekarang kita akan memiliki:Tahap rumit lainnya, yang satu ini mengakumulasikan pembagi kami di grup tangkapan pertama, dan mengganti angka apa pun di daftar kami tanpa tanda titik koma dengan angka yang dibagi dengan
d
. Kami juga menambahkan arahana
ke angka-angka ini, untuk menunjukkan bahwa ada sesuatu yang disimpan, bersama dengan;
untuk menunjukkan itu harus secara permanen menjadi bagian dari array. Sekarang kita akan memiliki:Ini menghapus angka-angka yang tidak dapat dibagi oleh
d
atau dalam array sebelum babak ini. Ini tidak membuat perubahan dalam contoh kita.Ini serakah cocok dari awal string ke huruf terakhir
a
dalam input. Ini berarti paling tidak ada satu pertandingan. Jika kami melakukan perubahan, kami menambahkannyad
, jika tidak biarkan sama sehingga kami dapat keluar dari loop.Yang
)
menutup loop dimulai oleh{
(jangan mempertanyakannya!) Dan jika tidak, tahap ini hanya menghapus penanda yang kita letakkan sebelumnya. Karena ini adalah akhir dari loop, kami akan mengulangi tahap-tahap di atas berkali-kali, namun saya hanya akan melanjutkan seolah-olah saya telah melupakan loop, karena itu membuat contoh lebih berkelanjutan.Tahap ini menghapus dari output kami:
Tahap ini menggantikan angka unary dengan angka desimal:
Tahap terakhir menghilangkan titik koma:
Jelas, melewatkan loop membuat kami memiliki hasil yang salah di sini, tapi mudah-mudahan itu tidak terlalu membingungkan.
sumber
JavaScript (ES6),
898782 byteTerima kasih @Arnauld untuk -2 byte dan untuk membantu menghemat 5 byte lagi.
Mengambil input sebagai array:
f([p,q])
.Uji Kasus
sumber
v
(v+=b[++i]
) daripada menggunakans
untuk menghemat 1 byte. Anda dapat menyimpan byte lain dengan|r
bukan&&r
(saya pikir itu aman tapi saya tidak memeriksa ulang).|r
memang lulus semua kasus uji.push()
.push
hanya sekali, bukan dua kali; setelah meninjau kembali gagasan bahwa Aku datang untuk ini untuk 86 byte. Mungkin itu bisa diperbaiki?push(v,...)
dan kemudian menggunakannyav+=
lagi untuk 84 byte .Röda , 90 byte
Cobalah online!
sumber
Java 8, 180 byte
Penjelasan:
Coba di sini.
sumber
C #, 280 byte
Upaya pertama pada kode golf, yang merupakan keseluruhan program. Menguji
Percobaan 2, 159 byte
Mengambil perancah, karena tugasnya adalah untuk menyediakan fungsi yang dapat mengambil sepasang angka (array berfungsi) dan mengembalikan array. Mengingat bahwa Func <int [], int []> F dapat digunakan untuk memenuhi persyaratan, cukup tentukan F :
Uji Program Lengkap Di Sini
Ini bisa lebih kecil jika Daftar generik dianggap sebagai output yang valid (jatuhkan .ToArray () untuk menghemat 10 byte).
Jika input juga dapat dimodifikasi, maka meneruskan Daftar <int> alih-alih sebuah array menghilangkan kebutuhan untuk menginisialisasi output (keluar pada 126 byte).
Mengambil langkah ini lebih jauh, tidak perlu benar-benar ada nilai balik dalam kasus ini. Menggunakan Aksi bukannya menghapus 9 byte yang digunakan oleh pernyataan kembali.
sumber
Jelly , 19 byte
Cobalah online!
sumber