Terinspirasi oleh pertanyaan di Stack Overflow. Judul di sini sepenuhnya salah saya.
Tantangan
Diberikan daftar bilangan bulat positif yang mengandung setidaknya dua entri, ganti setiap angka dengan minimum semua entri yang tidak termasuk itu sendiri.
Uji kasus
[4 3 2 5] -> [2 2 3 2]
[4 2 2 5] -> [2 2 2 2]
[6 3 5 5 8] -> [3 5 3 3 3]
[7 1] -> [1 7]
[9 9] -> [9 9]
[9 8 9] -> [8 9 8]
Aturan
Algoritme secara teoritis harus bekerja untuk ukuran input apa saja (lebih besar dari satu) dan nilai-nilai (bilangan bulat positif). Ini diterima jika program dibatasi oleh waktu, memori atau tipe data dan hanya berfungsi untuk angka hingga nilai tertentu, atau untuk ukuran input hingga nilai tertentu.
Program atau fungsi diizinkan, dalam bahasa pemrograman apa pun . Celah standar dilarang.
Masukan dapat diambil dengan cara apa pun yang wajar ; dan dengan format apa saja. Sama untuk output. Format input dan output mungkin berbeda.
Kode terpendek dalam byte menang.
sumber
[4 3 2 2 5]
dikeluarkan?[4 3 2 2 5]
, outputnya[2 2 2 2 2]
(ini mirip dengan test case kedua)Jawaban:
Jelly ,
965 byteCobalah online!
Verifikasi semuanya sekaligus! (sedikit dimodifikasi)
Saya cukup yakin Dennis bisa bermain golf di luar ini.
Bagaimana itu bekerja
Algoritma agak berbelit-belit. Mari kita amati apa yang dilakukannya
[4,2,2,5]
.Pertama, kita gunakan
J
untuk memperoleh[1,2,3,4]
. Perhatikan bahwa Jelly menggunakan pengindeksan 1.Lalu, kita lihat
ṙ
. Dibutuhkan dua argumen: array dan integer. Ini memutar array ke kiri dengan jumlah yang ditentukan oleh integer. Di sini,ṙ
akan lihat[4,2,2,5]
di sebelah kiri dan[1,2,3,4]
di sebelah kanannya (lebih lanjut tentang cara kerjanya dapat ditemukan di tutorial ). Dalam Jelly, perintah secara tersamar vektor. Oleh karena itu, perintah ini akan dilakukan pada setiap elemen individu di sebelah kanan, itulah sebabnya kami akan membuat array 2D:Oleh karena itu,
[4,2,2,5]ṙ[1,2,3,4]
menjadi[[4,2,2,5]ṙ1,[4,2,2,5]ṙ2,[4,2,2,5]ṙ3,[4,2,2,5]ṙ4]
, yang menjadi:Perhatikan bahwa elemen asli ada di baris terakhir, karena di baris itu kita diputar ke kiri dengan jumlah yang sama dengan panjang array, itulah sebabnya kita menggunakan
Ṗ
berikutnya untuk menghapus baris itu, sehingga kolom adalah koleksi dari elemen array yang tidak pada indeks saat ini:Operasi berikut
«/
,, juga cukup berbelit - belit. Pertama,«
mengembalikan minimum dua angka yang dilihatnya di sebelah kiri dan di sebelah kanannya. Misalnya,5«3
kembali3
. Sekarang, jika dua argumen adalah array, maka itu akan menjadi vektor seperti yang saya katakan di atas. Artinya ini yang[1,5,2,3]«[4,1,5,2]
akan menjadi[1«4,5«1,2«5,3«2]
apa adanya[1,1,2,2]
. Sekarang,/
adalahreduce
, yang berarti bahwa kita melakukan operasi di setiap baris hingga akhir. Misalnya,[1,2,3,4]+/
akan menjadi((1+2)+3)+4
, yang merupakan jumlah dari array[1,2,3,4]
.Jadi, jika kita menerapkan
«/
array 2D yang baru saja kita peroleh, kita akan mendapatkan:yang, karena vektorisasi, akan setara dengan:
yang menghitung minimum setiap array tanpa elemen pada indeks.
sumber
Python 2 , 41 byte
Cobalah online!
Untuk setiap elemen
x
kami memeriksa apakahx==min(l)
. Jika tidak, iniFalse
, yang diperlakukan seperti0
ketika digunakan sebagai daftar indeks ke dalamsorted(l)
, memberikan elemen terkecil. Kalau tidak, ituTrue
alias1
, memberikan elemen terkecil kedua, karena elemen itu sendiri terkecil dan harus diabaikan.sumber
False
akan dikonversi ke0
danTrue
dikonversi menjadi1
benar-benar keren dan harus sesumbar tentang ^ W ^ WexplainedJelly , 5 byte
Cobalah online!
Bagaimana?
sumber
Haskell ,
424139 byteEDIT:
f
mengambil daftar bilangan bulat (atauOrd
tipe apa pun ) dan mengembalikan daftar.Cobalah online!
f
berulang saat memutar daftar.x
adalah elemen daftar pertama dany
sisanya. Karena rekursi tidak terbatas, daftar hasil perlu dipotong:fst<$>zip...y
adalah cara yang lebih pendek untuk mengatakantake(length y)...
.sumber
@
dan flip daftar menjadi zip:f l@(x:y)=fst<$>zip(minimum...)l
.f(h:t)=minimum t:(fst<$>zip(f(t++[h]))t)
Oktaf, 26 byte
Pendekatan yang sama seperti yang digunakan dalam jawaban ini , yang kebetulan sama dengan ini .
Saya bukan penggemar hanya porting jawaban lain, itulah sebabnya saya ingin mencatat bahwa saya memiliki ide yang sama sebelum saya melihat yang lain.
Penjelasan:
Jonathan Allan telah memberikan penjelasan yang bagus untuk kode-Jelly, jadi ini mencakup bit-oktaf, dan mengapa itu bekerja (dan tidak akan bekerja di MATLAB).
Ini tidak berfungsi di MATLAB, karena penugasan sebaris dan pengindeksan langsung tidak berfungsi.
sort(x)(1)
memberikan kesalahan dalam MATLAB, bukan elemen pertama dalam vektor yang diurutkan.sumber
Haskell, 41 byte
Contoh penggunaan:
([]#) [4,3,2,5]
->[2,2,3,2]
. Cobalah online!Mulailah dengan akumulator kosong
a
dan jalankan daftar input. Elemen berikutnya dalam daftar output adalah minimum akumulatora
dan semua kecuali elemen pertama dari daftar input (->c
) diikuti oleh panggilan rekursif dengan elemen pertamab
ditambahkan ke akumulator danc
. Berhenti ketika Anda mencapai akhir daftar input.sumber
JavaScript (ES6),
5046 byteSunting: Disimpan 4 byte berkat @Arnauld.
sumber
a=>a.map(x=>Math.min(...a.filter(y=>x!=y)))
selama 43 byte.3,3,3,3
a=>a.map((_,i)=>Math.min(...a.filter(_=>i--)))
untuk 46.Brachylog ,
1312 byteCobalah online!
Disimpan satu byte berkat @ ais523.
Penjelasan
Kami mengeksploitasi fakta yang
⊇
menyatukan himpunan bagian dari yang terbesar hingga yang terkecil. Misalnya untuk[1,2,3]
, subset kita berada di urutan ini:[1,2,3], [1,2], [1,3], [2,3], [1], [2], [3], []
.Kita dapat melihat bahwa himpunan bagian
[1,2], [1,3], [2,3]
adalah yang kita inginkan dari minimum, tetapi berada dalam urutan terbalik dibandingkan dengan daftar input (karenanya↔
). Kami dapat memilih subset hanya dengan menemukanlength(Input) + 1
subset pertama , yang akan berisi semuanya + seluruh daftar terlebih dahulu. Kami membuang seluruh daftar itu denganb
.sumber
Sebenarnya , 13 byte
Menggunakan teknik yang sama yang juga ditemukan .
Cobalah online!
Penjelasan:
sumber
R,
4631 bytemengimplementasikan solusi Stewie Griffin di R, sayangnya, ide awal saya 50% lebih lama! masih membaca daftar dari stdin, tetapi sekarang mengembalikan vektor numerik yang jauh lebih mudah dibaca.
Cobalah online!
implementasi lama:
membaca dalam daftar dari stdin. Indeks negatif
l[-x]
mengecualikan elemen dari daftar, danmatch(l,l)
mengembalikan indeks kemunculan pertama dari setiap elemen daftar. Mengembalikan daftar.sumber
Python 2, 51 byte
Saya tahu sudah ada solusi Python yang lebih baik, tetapi saya masih ingin memposting milik saya.
Cobalah online
sumber
Mathematica 34 Bytes
sumber
PowerShell ,
6859 byteCobalah online!
Saya cukup yakin itu bisa dipersingkat, saya akan terus melihatnya
sumber
C, 85 byte
Argumen pertama adalah array integer input. Argumen kedua adalah array integer keluaran. Argumen ketiga adalah jumlah elemen untuk kedua array.
Lihat itu berfungsi online .
sumber
Perl 6 ,
26 2419 byte26
Perhatikan bahwa
∖
U + 2216 bukan\
U + 5CCobalah
Cobalah
24
Cobalah
19
Cobalah
26
Saya menggunakan operator unicode "mewah" daripada setara dengan ascii karena mereka akan membutuhkan ruang di depan mereka sehingga mereka tidak akan diuraikan sebagai bagian dari
.Bag
pemanggilan metode.24
19
(The 24 dan 19 byte golf terinspirasi oleh implementasi Jelly )
sumber
Clojure,
36816271 byteTerbaru (jangan terburu-buru mengirimkan ini):
Cobalah online .
Aaa dan yang ini memiliki bug (62 byte), zipmap menghasilkan peta yang tidak terurut sehingga ini tidak akan menghasilkan urutan yang benar pada input yang lebih besar.
v
sebenarnya tidak digunakan untuk apa pun tetapi ini lebih pendek darii (keys c)
.Sebelumnya pada 81 byte:
Cobalah online .
Cobalah online .
Sialan yang asli (36 bytes) tidak berfungsi ketika jumlah minimum diulang,
[4 2 2 5]
menghasilkan[2 4 4 2]
karena keduanya2
s dihapus :(#{i}
adalah himpunan yang hanya berisii
, itu mengembalikan kebenaran untuki
dan palsu untuk orang lain, yang berarti bahwa minimum dihitung dari semua angka lain dalam daftar input.Cobalah online .
sumber
Pyth,
87 byte-1 Byte terima kasih kepada @isaacg
Cobalah!
sumber
d
di bagian akhir - isinya secara implisit diisi.PHP, 72 Bytes
Versi Online
sumber
PHP, 47 byte
sumber
Scala, 37 byte
l
adalah koleksi Int.Kasus uji:
Ini mungkin masih golf, saya tidak bisa menemukan cara yang lebih singkat untuk menghapus elemen dari daftar
l diff Seq(l(i))
sumber
C #, 36 Bytes
Mengambil elemen (i) dan melihat elemen tanpa item saat ini untuk nilai minimal.
Sangat menyedihkan, bahwa beberapa upaya lain tidak berhasil, karena kami bekerja dengan tipe primitif, dan karena itu tidak memiliki daftar dengan referensi untuk membandingkan item dari.
sumber
PowerShell ,
4938 byte-11 byte berkat mazzy
Cobalah online!
Peningkatan jawaban indah Sinusoid . Menghemat 10 byte dengan menggunakan output eksplisit alih-alih membangun array. Mengindeks ke dalam array yang diurutkan ke tempat 0 (yaitu nilai terkecil) atau tempat 1 jika kondisi benar.
sumber
Perl 5, 43 byte
Setara dengan solusi Python.
sort
Sayangnya Perl memiliki standar yang salah untuk angka (membutuhkan pembanding eksplisit), danmin
tidak built-in, tetapi hampir menebusnya dengansub
menjadi lebih pendek daripadalambda
,map$_,
lebih pendek darix for x in
, dan implikasi dari daftar pengembalian dan args.sumber
Ruby, 30 byte
Untuk setiap elemen, sortir array, hapus elemen saat ini dan ambil elemen pertama dari array yang tersisa.
Ini adalah fungsi anonim yang dapat digunakan seperti ini:
sumber
CJam, 15 byte
Pada dasarnya terjemahan dari algoritma xnor ke dalam CJam.
Ini adalah blok tanpa nama yang mengambil array dari stack dan meninggalkan hasilnya di stack.
Penjelasan:
sumber
05AB1E , 5 byte
Port jawaban @xnor dari Python 2 .
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
Java 8, 119 byte
Port jawaban @xnor dari Python 2 .
Memodifikasi array input alih-alih mengembalikan yang baru untuk menghemat byte.
Cobalah online.
Penjelasan:
sumber
APL (Dyalog Extended) , 7 byte
Port of xnor's Python 2 menjawab. Membutuhkan
⎕IO←0
:Cobalah online!
Penjelasan:
sumber
Haskell , 76 byte
Ini jauh lebih lama daripada entri Haskell sebelumnya, tetapi ini adalah yang pertama yang hanya melakukan perbandingan jumlah linier dan jumlah pekerjaan tambahan linier.
Cobalah online!
Penjelasan
!
membutuhkan dua argumen: daftar minimum dan daftar kosong. Ini mengembalikan nilai minimum dalam daftar dan hasil dari pemrosesan daftar yang diberikan menggunakan minimum berjalan.sumber
MathGolf ,
97 byteCobalah online!
Penjelasan
Pada dasarnya port jawaban 05AB1E Kevin Cruijssen, tapi saya kehilangan 2 byte karena harus melakukan sesuatu secara eksplisit.
sumber