pengantar
Misalkan Anda ingin menghitung maksimum ekor dari daftar angka, yaitu, maksimum setiap sufiks nonempty. Salah satu cara untuk melakukannya adalah dengan berulang kali memilih satu nomor dan menggantinya dengan angka yang lebih tinggi setelah itu, sampai ini tidak mungkin lagi. Dalam tantangan ini, tugas Anda adalah melakukan satu langkah dari algoritma ini.
Tugas
Input Anda adalah daftar bilangan bulat L , yang mungkin kosong. Output Anda akan menjadi daftar L di mana tepatnya satu angka L i telah digantikan oleh L j lain , di mana L i <L j dan i <j .
Dengan kata lain, Anda harus mengganti satu nomor dengan angka yang lebih tinggi yang terjadi setelahnya.
Anda dapat memilih i dan j secara bebas di antara semua pasangan yang valid, dan pilihannya bisa tidak deterministik.
Jika i dan j seperti itu tidak ada (yaitu L tidak meningkat), output Anda harus L tidak berubah.
Contoh
Pertimbangkan input L = [3, 1, 4, -1, 2] . Operasi yang mungkin adalah untuk mengganti 3 dengan 4 , ganti 1 dengan 4 , ganti 1 dengan 2 , atau ganti -1 dengan 2 . Jadi output yang mungkin adalah:
[ 3 , 1 , 4 , -1 , 2 ]
------------------------------
[( 4), 1 ,( 4), -1 , 2 ]
[ 3 ,( 4),( 4), -1 , 2 ]
[ 3 ,( 2), 4 , -1 ,( 2)]
[ 3 , 1 , 4 ,( 2),( 2)]
Jika Anda mengulangi operasi cukup kali, hasil akhirnya akan [4,4,4,2,2] , yang justru merupakan daftar ekor maxima dari L .
Aturan dan penilaian
Anda dapat menulis program atau fungsi lengkap. Dalam kasus yang terakhir, Anda dapat memodifikasi input di tempat alih-alih mengembalikan array baru, jika bahasa Anda memungkinkan. Format input dan output fleksibel karena alasan tertentu.
Hitungan byte terendah menang.
Uji kasus
Semua output yang mungkin ditampilkan.
[] -> []
[1] -> [1]
[1,2] -> [2,2]
[2,1] -> [2,1]
[4,4,4,4] -> [4,4,4,4]
[-1,-3,-10] -> [-1,-3,-10]
[1,3,10] -> [3,3,10] [10,3,10] [1,10,10]
[1,1,2,1] -> [2,1,2,1] [1,2,2,1]
[998,64,2,-94,-789] -> [998,64,2,-94,-789]
[998,2,64,-94,-789] -> [998,64,64,-94,-789]
[3,1,4,-1,2] -> [4,1,4,-1,2] [3,4,4,-1,2] [3,2,4,-1,2] [3,1,4,2,2]
[-1,4,0,4,7,2,3] -> [4,4,0,4,7,2,3] [0,4,0,4,7,2,3] [-1,4,4,4,7,2,3] [7,4,0,4,7,2,3] [-1,7,0,4,7,2,3] [-1,4,7,4,7,2,3] [-1,4,0,7,7,2,3] [2,4,0,4,7,2,3] [-1,4,2,4,7,2,3] [3,4,0,4,7,2,3] [-1,4,3,4,7,2,3] [-1,4,0,4,7,3,3]
[3542,-12311,7662,1672,6081] -> [7662,-12311,7662,1672,6081] [3542,7662,7662,1672,6081] [3542,1672,7662,1672,6081] [6081,-12311,7662,1672,6081] [3542,6081,7662,1672,6081] [3542,-12311,7662,6081,6081]
x=>x.map(c=>c<x[++i]&!d?x[d=i]:c,d=i=0)
?x=>x.map(c=>c<x[++i]>d?x[d=i]:c,d=i=0)
(38 byte) harus berfungsi.Mathematica, 37 byte
Fungsi murni mengambil daftar bilangan real, dan mengembalikan daftar bilangan real. Mencari pasangan pertama dari entri berurutan dalam urutan "salah", dan menggantikan yang pertama dari pasangan itu dengan yang kedua. Perilaku default yang bagus
/.
berarti mengembalikan input yang tidak diubah jika perlu.Catatan samping yang mengasyikkan: jika kita ganti
b<c
dengan!OrderedQ[{c,b}]
, maka fungsinya bekerja pada string (dan benar-benar tipe data apa pun setelah urutan yang sesuai dijelaskan). Misalnya#/.{a___,b_,c_,d___}/;!OrderedQ[{c,b}]:>{a,c,c,d}&
pada input{"programming", "puzzles", "code", "golf"}
pengembalian{"puzzles", "puzzles", "code", "golf"}
.sumber
Sort[FromCharacterCode /@ Range[32, 127]]
. Menjadi aneh setelah Anda memiliki string dengan banyak kata, karena itu mengabaikan ruang dan barang-barang.JavaScript (ES6),
433938 byteKeluaran dengan memodifikasi array di tempat. Sunting: Disimpan 4 byte berkat produk @ETH. Disimpan 1 byte berkat @ user81655.
sumber
a=>a[i=0,a.findIndex(e=>e<a[++i])]=a[i]
untuk 39.a=>a.map((_,b)=>Math.max(...a.slice(b)))
findIndex
dengansome
(38 byte):a=>a[i=0,a.some(e=>e<a[++i])*i-1]=a[i]
Haskell , 36 byte
Cobalah online!
Lihat melalui daftar untuk elemen berturut-turut
a,b
dengana<b
dan perubahan mereka untukb,b
.Ditingkatkan dari 37 byte:
sumber
f(a:r@(b:_))=max(b:r)(a:f r)
berfungsi dan dua byte lebih pendek.f r >= r
.Jelly ,
1311 byteMengganti yang paling kanan dari semua angka yang mungkin.
Cobalah online!
Bagaimana itu bekerja
sumber
MATL , 15 byte
Cobalah online!
Saya bukan penggemar berat solusi ini. Tampaknya sangat tidak efisien bagi saya. Terutama bagian
whY>d*
dan0h+
.sumber
Python 2,
13913493 byteSangat panjang, tetapi ini adalah upaya pertama.
-5 bytes berkat TemporalWolf
-41 (!!) bytes berkat Value Ink
sumber
[1,2]
memberi[2,1]
bukannya[2,2]
print
dan menggunakan\t
tab alih-alih ruang ekstra untuk loop dalam. Anda juga dapat menjatuhkan 0 inexit()
untuk tambahan. Harus membawa Anda ke 132.if a[i]<a[j]:a[i]=a[j];print a;exit()
bahkan lebih pendek. Heck, lebih baik dilakukanfor j in a[i+1:]:\n\tif a[i]<j:a[i]=j;print a;exit()
MATL , 13 byte
Cobalah online!
Penjelasan
Dua kondisi berikut ini setara:
Kode menggunakan kondisi 2, yang lebih sederhana. Itu menghitung kenaikan berturut-turut dan menemukan yang positif terakhir, jika ada. Untuk dua entri yang terlibat, ia menulis nilai entri kedua ke dalam entri pertama.
Trik ini digunakan untuk menangani kasus ketika tidak ada substitusi yang dapat dilakukan. Perhatikan juga bahwa pengindeksan MATL
1
berbasis.Mari kita gunakan input
[3,1,4,-1,2]
sebagai contoh.sumber
Haskell ,
3433 byteIni didasarkan pada jawaban oleh xnor , yang menyarankan agar saya mempostingnya sendiri.
EDIT: xnor menemukan byte untuk disimpan.
Cobalah online!
Pada dasarnya, saya mengamati bahwa percabangan metode xnor selalu berakhir dengan memilih mana dari ekspresi cabang yang terbesar, karena Haskell menggunakan pemesanan leksikografis untuk daftar. (Kasus ketika
a==b
juga berfungsi karenaf r>=r
, yang dapat dibuktikan secara terpisah dengan induksi.)Letakkan berbeda, kapan saja
b:r > a:f r
, maka itub:r
adalah jawaban yang benar, dan kalau tidak kita bisa kembali kea:f r
.Jadi, alih-alih memeriksa
a<b
terlebih dahulu, saya hanya menghitung kedua ekspresi dan mengambil maksimum. Ini bisa memberikan ledakan eksponensial, meskipun kemalasan Haskell menghindari itu kecualia
danb
sama.sumber
max(b:r)$a:f r
menghemat satu byte.Python 3, 79 byte
Mutasi array asli (daftar) yang diberikan padanya. Saya tidak senang bahwa ini bukan lambda dan saya yakin ada optimisasi yang lebih baik; Semoga saya akan membahasnya nanti.
Penjelasan singkat
Dibutuhkan maks array melewati elemen saat ini (dimulai dengan nol). Kemudian membandingkan ini dengan elemen itu sendiri: jika maks lebih besar, ganti elemen saat ini dengan itu dan berhenti, jika tidak, bertambah satu dan terus mencobanya.
sumber
Ruby,
6661 byteCobalah online!
sumber
C, 47 byte
Implementasi rekursif mengambil sebagai inputnya pointer ke elemen pertama array, dan panjang array. Memodifikasi array di tempat.
sumber
SWI-Prolog, 70 byte
Klausa pertama menggantikan elemen pertama dari daftar dengan nilai maksimum dari sisa daftar, tetapi hanya jika maks ini lebih besar. Klausa kedua secara rekursif menyebut predikat untuk ekor daftar. Jika tidak ada klausa ini yang berhasil, klausa ketiga hanya mengembalikan input.
Ini mengembalikan hanya salah satu solusi yang mungkin. Itu sepele untuk menemukan mereka semua dengan kode yang sangat mirip, tetapi kemudian kasus di mana tidak ada perubahan yang mungkin membutuhkan lebih banyak byte untuk menangani.
Contoh:
sumber
R, 71 byte
sumber
C, 80 byte
Telepon dengan:
sumber
Python 2, 89 byte
Cobalah secara online -1 byte berkat @TemporalWolf
-25 bytes berkat @ValueInk
-7 bytes berkat @Cole
Fungsi yang mengubah array input
Jika tidak perlu berhenti setelah iterasi pertama, itu akan sedikit lebih cantik
sumber
[1, 3, 5, 7]
; ia kembali[3, 3, 5, 7]
.A[i]<y and
=>y>A[i]and
menghemat 1r=[y for y in A[i+1:]if y>A[i]]\n if r:A[i]=r[0];break
untuk menurunkan skor Anda menjadi 96!input()
.Python 2, 60 byte
Cobalah secara Online!
Penjelasan: Secara rekursif memeriksa apakah elemen yang diberikan kurang dari
max
elemen dalam sisa daftar. Jika demikian, kembalikan daftar denganmax
mengganti elemen pertama.sumber
TI-Basic, 72 byte
Penjelasan:
sumber
sh, 118 byte
Bilangan bulat input diteruskan sebagai argumen ke skrip.
Kerusakan:
sumber
PHP, 88 Bytes
Kerusakan
sumber
Haskell, 48 byte
Contoh penggunaan:
f [1,1,2,1]
->[2,1,2,1]
. Cobalah online! .Jika daftar input memiliki setidaknya satu elemen, ikat
b
ke elemen pertama danl
ke seluruh daftar. Jikal
tidak kosong danb
kurang dari maksimuml
, kembalikan yang maksimum diikuti olehl
, yang lain kembalib
diikuti oleh panggilan rekursif darif l
. Jika daftar input kosong, kembalikan.sumber
Racket 202 byte
Tidak Disatukan:
Pengujian:
Keluaran:
sumber
C, 67 byte
Single Run, 67 byte Live
Satu Langkah, 78 byte Live
Tail Maxima, 96 byte Live
sumber
Python 3 ,
103102 byteCobalah online!
sumber