N anak-anak, tanpa dua berbagi ukuran persisnya, berbaris dalam urutan tertentu. Masing-masing hanya dapat membandingkan ketinggian dengan tetangga terdekat mereka. Ketika guru berteriak "angkat tangan jika kamu yang tertinggi", mereka melakukannya jika mereka lebih tinggi dari kedua tetangga mereka, dan mereka melakukannya secara bersamaan. Jika hanya satu yang mengangkat tangan, dia menang. Jika lebih dari satu mengangkat tangan, mereka semua tersingkir dari barisan (menjaga urutan anak-anak lainnya) dan mereka mengulangi prosesnya.
Tulis sebuah program, yang mengambil array bilangan bulat yang berbeda (Anda dapat mengasumsikan mereka benar-benar positif) dan menghasilkan pemenang game ini. Ini kode-golf, jadi kode terpendek menang.
Contoh (dengan tahap peralihan ditampilkan):
5 3 9 8 7 → 3 8 7 → 8
1 2 9 4 → 9
9 3 8 7 4 12 5 → 3 7 4 5 → 3 4 → 4
Pemimpin saat ini:
- Jelly: 17 byte [oleh Dennis ♦]
- MATL: 20 byte [oleh Luis Mendo]
- APL: 28 byte [voidhawk]
- k: 40 byte [oleh Paul Kerrigan]
Ada juga pertempuran Python terjadi. Masih menunggu lebih banyak bahasa golf muncul.
Saat ini saya menerima jawaban Dennis ♦ - jika ada pemenang baru, saya akan memperbarui pilihan.
Jawaban:
Jelly , 17 byte
Input adalah string integer yang dipisahkan koma.
Cobalah online!
Kredit pergi ke @Xanderhall, @Sherlock, dan @ErikGolfer untuk meletakkan dasar.
Bagaimana itu bekerja
sumber
JavaScript (ES6),
787672 byteTerima kasih kepada @ edc65 untuk -4 byte
Mengambil array bilangan bulat dan menghasilkan array yang hanya berisi pemenang.
Cuplikan tes
Tampilkan cuplikan kode
Berikut adalah beberapa upaya lain, menggunakan
.filter
dan mengatur susunan:Atau double-loop, sangat panjang:
Penjelasan
Cara kerjanya cukup sederhana: ia membangun array dari mereka yang relatif lebih tinggi (
r
) dan array yang tidak (q
), lalu kembalir
jika hanya memiliki satu item; jika tidak, itu berjalan sendiriq
dan mengembalikan hasil itu.sumber
q
danr
. Anda menghindari&&r
dan ekspresi filter ternyata menjadi byte lebih pendek juga.MATL , 20 byte
Input adalah vektor kolom, menggunakan
;
sebagai pemisah.Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Ini adalah implementasi langsung dari prosedur yang dijelaskan dalam tantangan. A
do
...while
loop terus menghapus elemen sampai hanya satu yang dihapus; dan itu adalah output.Elemen-elemen yang akan dihapus terdeteksi dengan mengambil perbedaan, signum, lalu perbedaan lagi. Yang memberi nilai negatif adalah yang harus dihapus.
sumber
Python3,
265260248243203121117112111 byteTerima kasih @ ZacharyT, @orion, dan @mathmandan telah menghemat
545banyak byte!sumber
Haskell, 85 byte
Contoh penggunaan:
f [9,3,8,7,4,12,5]
->4
.Bagaimana itu bekerja:
Varian, juga 85 byte:
Bind daftar
b
(lihat di atas) ke n dan mengembalikan elemens
jikax\\n
daftar tunggal danf n
sebaliknya.sumber
f x|y@(_:z)<-x++[0]=(#)=<<(x\\)$[b|(a,b,c)<-zip3(0:y)y z,b<a||b<c]
.\\
masih perlu impor. Btw,tails
bisa juga diganti dengan...|a:b:c:_<-scanr(:)[]$0:x++[0],...
.Mathematica,
107108 bytePenjelasan
Pertama, setel
x
dany
sama dengan inputList
. Lingkaran berlanjut sampaiLength@y==1
.x~Split~Less
adalah daftar daftar elemen yang berurutan dan terus bertambah,Split[x,#>#2&]
adalah daftar daftar elemen yang berurutan dan menurun. MengambilMax
dari semua daftar di yang pertama memberikan daftar anak-anak yang lebih tinggi daripada anak di sebelah kanan mereka (bersama dengan anak yang paling kanan). Mengambil argumen pertama (#&
) dari semua daftar di yang terakhir memberikan daftar anak-anak lebih tinggi daripada anak di sebelah kiri mereka (bersama dengan anak paling kiri). Persimpangan kedua ini akan menjadi daftar anak-anak yang mengangkat tangan. Tetapkan ini sama dengany
.x=DeleteCases[x,#|##&@@y]
menghapus darix
elemen apa pun yang cocok dengan elemeny
(#|##&
setara denganAlternatives
). Setelah loop berakhir, kembaliy
. Jika output harus berupa bilangan bulat (bukan daftar yang berisi bilangan bulat tunggal), kembalikan#&@@y
(+4 byte).Terima kasih kepada Martin Ender karena telah menghemat 2 byte dan membuat saya mematuhi aturan. Terbuka untuk saran.
sumber
!Less
berfungsi seperti yang Anda harapkan, karena ini sebenarnya tidak mengevaluasi ke fungsi. Anda mungkin perlu menggunakanGreater
(atau#>#2&
) di sana. Anda dapat menggunakanx~Split~Less
untuk yang pertamaSplit
dan>
untukLength
kondisi.Clear@y
antara panggilan fungsi, saya khawatir itu tidak valid . Anda harus mengatur ulang sendiri, lingkup lebih baik, atau mengubahnya menjadi program lengkap denganInput
danPrint
.Perl 6 , 111 byte
Diperluas:
sumber
Python 2,
10098 byteMenggunakan pengembalian hubungan arus pendek seperti pada jawaban Yodle (oleh Zachary T)
sumber
+=b,
alih-alih+=[b]
(kredit ke mathmandan), menggunakant=[0]
untuk digunakant
untuk menambahA
, dan kemudian, karena kita sekarang mulai dengan 0 int
, memeriksat[-2]<1
lebih pendek darilen(t)<2
, dan menggunakant[1]
sebagai hasil dalam kasus itu.return t[-2]and f(l)or t[1]
.Mathematica, 101 byte
Fungsi rekursif tanpa nama mengambil daftar angka sebagai input, dan mengembalikan daftar dengan nomor tunggal (pemenang) sebagai output.
Inti dari algoritma ini adalah
Max/@Partition[#,3,1,{2,2},0]
, yang menghitung array (the-max-of-me-and-my-neighbor) dari daftar input.a=Position[...-#,0]
kemudian kurangi daftar asli dan kembalilah ke tempat 0s berada; ini adalah anak-anak yang mengangkat tangan.If[Equal@@a, #[[Last@a]], #0@Fold[Drop@##&,#,Reverse@a]]&
cabang tergantung pada apakah semua elemena
sama atau tidak (dalam hal ini, mereka akan hanya jikaa
tunggal); jika demikian, maka anak ini adalah pemenangnya dan kami menampilkan nomornya; jika tidak, maka kami secara rekursif memanggil fungsi ini pada daftar dengan semua elemen pada posisia
dihapus.sumber
Python 2, 99 Bytes
sumber
PHP, 131 byte
Mengambil angka dari argumen baris perintah. Gagal jika nama file dimulai dengan angka positif.
kerusakan
sumber
k, 40 byte
Penjelasan:
$ adalah if-else.
Syaratnya adalah apakah 1 adalah jumlah B, yang didefinisikan sebagai minimum dari dua daftar yang dihasilkan dengan memeriksa apakah x lebih besar dari posisi sebelum dan sesudah (Pipa terbalik).
Jika ini benar, kami mengembalikan x di mana B benar.
Kalau tidak, kita akan muncul kembali tanpa posisi yang sebenarnya.
sumber
Scala 129 byte
Golf
Tidak disatukan
Dengan mengisi daftar kiri dan kanan dengan 0's, maka dapat mengelompokkan dalam set 3 dan mempartisi daftar untuk mereka yang tangannya naik, elemen kiri dan kanan paling banyak dibandingkan dengan 0 di luar sehingga mendapatkan nomor yang benar (dengan asumsi tinggi badan tidak sama negatif!)
sumber
C ++ 14, 182 byte
Belajar bahwa operator ternary dapat digunakan dengan objek C ++. Membutuhkan input untuk menjadi wadah akses acak dengan
push_back
, sukavector
,deque
danlist
.Membuat dua kontainer
t
dans
dari jenis yang sama dan menambahkan lokal tertinggit
dan sisanyas
. Jika hanya ada 1 elemen sebagait
imbalannya, panggilan rekursif dengan dirinya sendiris
.Tidak Disatukan:
sumber
R, 83 byte
Dua versi berbeda:
Yang ini mengambil vektor N:
Yang ini menciptakan fungsi F yang didefinisikan secara rekursif:
sumber
APL (Dyalog Unicode) , 28 byte SBCS
Cobalah online!
sumber