Menjalankan maksimum kedua daftar


20

Diberikan daftar bilangan bulat, tugas Anda adalah menampilkan nilai terbesar kedua dalam elemen k pertama , untuk setiap k antara 2 dan panjang daftar input.

Dengan kata lain, output nilai terbesar kedua untuk setiap awalan input.

Anda dapat menampilkan nilai arbitrer untuk elemen pertama (di mana k = 1), atau cukup menghilangkan nilai ini, karena tidak ada maksimum kedua untuk daftar 1 elemen. Anda dapat menganggap setidaknya ada 2 elemen dalam input.

Kode terpendek menang.

Contohnya

Input:
1 5 2 3 5 9 5 8
Output:
  1 2 3 5 5 5 8
Input:
1 1 2 2 3 3 4
Output:
  1 1 2 2 3 3
Input:
2 1 0 -1 0 1 2
Output:
  1 1 1 1 1 2

Bahasa Inggris saya bukan yang terbaik, bagaimana kditentukan?
LiefdeWen

@LiefdeWen Keluarkan daftar yang berisi jawaban untuk setiap k.
jimmy23013

2
1tidak, tegasnya, yang nilai terbesar kedua dari 1,1(2 misalnya) itu nilai kedua ketika diurutkan menurun.
Jonathan Allan

Mungkin aku hanya bodoh (walaupun aku curiga aku bisa benar-benar memulai akhir pekan ..), tapi aku masih tidak yakin bagaimana ini bekerja. Bisakah seseorang ELI5 menjadi test case terakhir untuk saya? Dua kasus uji pertama yang dapat saya selesaikan dengan hanya mengulang daftar, menentukan minimum daftar saat ini, dan kemudian menghapus item itu (atau lebih mudah: mengurutkan daftar dan menghapus item terakhir). Ini memberikan hasil yang benar untuk dua kasus uji pertama, tetapi jelas salah (dan akan memberikan -1, 0, 0, 1, 1, 2untuk kasus uji terakhir.)
Kevin Cruijssen

1
@KevinCruijssen Ingat dua angka terbesar yang pernah Anda lihat. Dalam kasus terakhir, Anda mulai dengan 2 sebagai yang terbesar, dan menghasilkan apa-apa / apa pun karena tidak masuk akal pada saat ini. Kemudian Anda mengubah ke 1 dan 2 pada iterasi berikutnya, sehingga Anda menghasilkan 1. Ini tetap sama sampai Anda mencapai 2 di akhir, dan kemudian Anda memiliki 2 dan 2 sebagai yang terbesar dan kedua terbesar
FryAmTheEggman

Jawaban:



5

Sekam , 9 7 byte

Disimpan satu atau dua byte berkat @Zgarb

mȯ→hOtḣ

Pengembalian 0untuk "maksimum kedua" pertama

Penjelasan

         -- implicit input, e.g          [1,5,3,6]
      ḣ  -- prefixes                     [[],[1],[1,5],[1,5,3],[1,5,3,6]]
     t   -- remove the first element     [[1],[1,5],[1,5,3],[1,5,3,6]]
mȯ       -- map the composition of 3 functions
    O    --   sort                       [[1],[1,5],[1,3,5],[1,3,5,6]]
   h     --   drop the last element      [[],[1],[1,3],[1,3,5]
  →      --   return the last element    [0,1,3,5]
         -- implicit output

Cobalah online!


1
Anda bisa memetakan →hOdan menyimpan satu byte.
Zgarb


3

JavaScript (ES6), 58 51 50 byte

Disimpan 1 byte berkat @Neil

Tambahkan undefineduntuk k = 1 .

a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[])

Uji kasus

NB: Cuplikan ini digunakan JSON.stringify()untuk keterbacaan, yang - sebagai efek samping - dikonversi undefinedke null.


1
Saya pikir a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[])hanya 50.
Neil

@Neil Nice. :-)
Arnauld

2

Pyth , 8 byte

m@Sd_2._

Cobalah online! atau Coba Test Suite!


Bagaimana?

Ini menampilkan elemen pertama dari daftar sebagai nilai pertama dalam daftar, sesuai spesifikasi. Anda dapat menampilkan nilai arbitrer untuk elemen pertama .

m@Sd_2._ - Program lengkap dengan input implisit.

m ._Q - Memetakan di atas awalan input dengan variabel d.
  Sd - Mengurutkan awalan saat ini.
 @ - Mendapat elemen ...
    _2 - Pada indeks - 2 (tertinggi kedua).
           - Cetak secara implisit.

2

Jelly , 8 byte

ḣJṢ€Ṗ€Ṫ€

Cobalah online!

Nilai pertama akan menjadi 0, selalu, dan angka-angka berikut akan menjadi maksimum kedua dari setiap awalan.

Penjelasan

ḣJṢ€Ṗ€Ṫ€  Input: array A
 J        Enumerate indices, [1, 2, ..., len(A)]
ḣ         Head, get that many values from the start for each, forms the prefixes
  Ṣ€      Sort each
    Ṗ€    Pop each, removes the maximum
      Ṫ€  Tail each

@ Challenger5 Saya tidak percaya itu berhasil
mil

@ Challenger5 Itu tidak berhasil ...
Erik the Outgolfer

@EngtheOutgolfer Oh, ok.
Buah Esolanging

2

Java (OpenJDK 8) , 87 86 byte

a->{int x,y=x=1<<-1;for(int c:a){if((c>x?x=c:c)>y){x=y;y=c;}System.out.print(x+" ");}}

Cobalah online!


+1 untuk int x,y=x=. Saya tidak tahu deklarasi dan penugasan terpisah dapat dilakukan dalam pernyataan yang sama.
Jakob

2

Python 2 , 45 byte

f=lambda l:l[1:]and f(l[:-1])+[sorted(l)[-2]]

Cobalah online!

Sisi kanan kode cukup jelas. Namun, apa yang kita taruh di sebelah kiri and? Karena kita menyatukan bagian-bagian dari daftar secara rekursif, kita perlu sisi kiri untuk menjadi jujur ​​jika lmemiliki 2 elemen atau lebih, dan sebaliknya daftar kosong. l[1:]memenuhi kriteria ini dengan baik.




1

Batch, 123 byte

@set/af=s=%1
@for %%n in (%*)do @call:c %%n
@exit/b
:c
@if %1 gtr %s% set s=%1
@if %1 gtr %f% set/as=f,f=%1
@echo %s%


1

05AB1E , 5 byte

Menemukan 5-byter lain, sangat berbeda dari solusi Erik . Nilai arbitrer adalah elemen pertama dari daftar.

ηε{Áθ

Cobalah online!


Penjelasan

ηε{Áθ  - Full program that reads implicitly from STDIN and outputs to STDOUT.

η      - Push the Prefixes of the list.
 ε     - Apply to each element (each prefix):
  {      - Sort the prefix list.
   Á     - Shift the list to the right by 1, such that the first element goes to the 
           beginning  and the second largest one becomes the last.
    θ    - Get the last element (i.e. the second largest)
         - Print implicitly.

Mari kita ambil contoh, agar lebih mudah dipahami.

  • Pertama kita mendapatkan input implisit, katakanlah itu [1, 5, 2, 3, 5, 9, 5, 8] .

  • Kemudian, kami mendorong awalannya menggunakan η-[[1], [1, 5], [1, 5, 2], [1, 5, 2, 3], [1, 5, 2, 3, 5], [1, 5, 2, 3, 5, 9], [1, 5, 2, 3, 5, 9, 5], [1, 5, 2, 3, 5, 9, 5, 8]] .

  • Sekarang, kode memetakan daftar dan mengurutkan setiap awalan menggunakan {-[[1], [1, 5], [1, 2, 5], [1, 2, 3, 5], [1, 2, 3, 5, 5], [1, 2, 3, 5, 5, 9], [1, 2, 3, 5, 5, 5, 9], [1, 2, 3, 5, 5, 5, 8, 9]] .

  • Kami kemudian mengambil elemen terakhir dan memindahkannya ke awal: [[1], [5, 1], [5, 1, 2], [5, 1, 2, 3], [5, 1, 2, 3, 5], [9, 1, 2, 3, 5, 5], [9, 1, 2, 3, 5, 5, 5], [9, 1, 2, 3, 5, 5, 5, 8]] .

  • Tentu saja, sekarang kode mendapatkan elemen terakhir dari setiap sublist menggunakan θ- [1, 1, 2, 3, 5, 5, 5, 8](yang pertama adalah nilai arbitrer.




1

Japt , 12 10 byte

Array output terdiri dari elemen pertama dalam array input diikuti oleh urutan yang diinginkan.

£¯YÄ n< g1

Menguji


Penjelasan

Input array secara implisit U.

£

Peta berakhir U, di mana Yindeks saat ini.

¯YÄ

Potong Udari 0menjadi Y+1.

n<

Sortir turun.

g1

Dapatkan elemen kedua.

Secara implisit menampilkan array yang dihasilkan.


1

MATL , 19 10 byte

Terima kasih kepada Luis Mendo untuk mencukur off 9 bytes!

"GX@:)SP2)

Coba di sini .

Penjelasan

"GX@:)SP2)
"                  for all the values in the input
 G                 get input
  X@:)             get values up to the iteration
      SP           sort it in descending order
        2)         get the second value
                   implicit end of loop and output

@LuisMendo Wow! Pergi untuk menunjukkan betapa aku tahu tentang MATL. Terima kasih untuk bantuannya!
DanTheMan

1

J, 13 byte

_2&{@/:~ ::#\

Cobalah online!Elemen pertama selalu 1.

Penjelasan

_2&{@/:~ ::#\
            \  Apply to prefixes
_2&{@/:~        Sort and take second-to-last atom
     /:~         Sort upwards
_2 {             Take second-to-last atom
         ::     If there's an error (i.e only one atom)
           #     Return the length of the list (1)

Ruang itu penting.


1

Ohm , 10 8 byte

-2 byte berkat ETHproductions.

∙p»îS2~ª

Cobalah online!

Eh, ini aneh tapi saya tidak tahu bagaimana lagi untuk menekan angka negatif ... Saya tidak benar - benar tahu Ohm. : P


1
Oke, 0 2-sepertinya sangat aneh ...
Tn. Xcoder

1
Hanya dengan melihat dokumen (saya tidak tahu apa-apa tentang Ohm), dapatkah Anda melakukannya 2~ ?
ETHproduksi

@TEHProduk Oh, jauh lebih baik. Terima kasih!
totallyhuman



0

Swift 3 , 67 byte

func g(l:[Int]){print((1..<l.count).map{l[0...$0].sorted()[$0-1]})}

Test Suite.

Swift 3 , 65 byte

{l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int]

Test Suite.


Bagaimana cara menjalankannya?

Yang pertama adalah fungsi lengkap yang mengambil input sebagai parameter fungsi dan mencetak hasilnya. Anda dapat menggunakannya persis seperti yang ditunjukkan pada tautan pengujian. Saya memutuskan untuk menambahkan instruksi, karena tipe fungsi kedua digunakan sangat jarang dan kebanyakan orang bahkan tidak tahu keberadaannya. Pemakaian:

g(l: [1, 1, 2, 2, 3, 3, 4] )

Yang kedua adalah fungsi anonim, seperti lambdas. Anda dapat menggunakannya persis seperti yang Anda lakukan itu Python, mendeklarasikan variabel fdan memanggilnya:

var f = {l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int]

print(f([1, 1, 2, 2, 3, 3, 4]))

atau bungkus di antara tanda kurung dan panggil langsung ( (...)(ArrayGoesHere)):

print(({l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int])([1, 1, 2, 2, 3, 3, 4]))

0

PHP, 53 byte

for(;a&$n=$argv[++$i];rsort($a),print$a[1]._)$a[]=$n;

mengambil input dari argumen baris perintah. Output dibatasi, dipimpin, dan dibuntuti oleh semicola.
Jalankan dengan -nratau coba online .

Menghasilkan peringatan di PHP 7.1; ganti a&dengan ""<untuk memperbaiki.
Atau gunakan for(;++$i<$argc;rsort($a),print$a[1]._)$a[]=$argv[$i];(54 byte)


0

Mathematica 42 Bytes

Secara mandiri tiba pada jawaban yang sangat mirip dengan @Jenny_mathy tetapi 3 byte lebih pendek

Sort[#[[;;i]]][[-2]]~Table~{i,2,Length@#}&

Menyadari bahwa max berjalan pertama hanya membutuhkan 15 byte dan dua panggilan fungsi !:

Max~FoldList~#&

Ini dapat dilakukan secara ringkas karena Maxmemiliki atribut Flatdan OneIdentitytetapi itu tidak benar untuk RankedMaxyang akan menjadi pengganti yang logis. Sayangnya mendefinisikan atribut atau memodifikasinya pada fungsi yang ada memakan terlalu banyak byte, sehingga perataan harus dilakukan dengan cara lain.

Semua max berjalan n dapat ditemukan dalam 48 byte:

PadLeft[Sort/@Flatten/@FoldList[{##}&,{},#&@#]]&


0

k , 13 byte

{x(>x)1}'1_,\

Cobalah online!

           ,\ /sublists of increasing lengths (scan concat)
         1_   /remove the first sublist
{      }'     /for each sublist:
  (>x)        /    indices to permute sublist into largest to smallest
      1       /    get second index
 x            /    get sublist[that index]

0

Oktaf, 51 byte

@(a){[~,I]=cummax(a);a(I(2:end))=-inf;cummax(a)}{3}

- Nilai arbitrer dikembalikan untuk elemen pertama.

Cobalah online!


0

JavaScript (ES6), 43 51 byte

Sunting: Menambahkan 8 byte karena diinginkan penyortiran numerik. :(

a=>a.map((_,b)=>a.slice(0,b+1).sort((a,b)=>b-a)[1])

Menjaga yang ini di sini, meskipun, karena lebih pendek memberikan yang diinginkan memesan leksikografis:

a=>a.map((_,b)=>a.slice(0,b+1).sort()[b-1])

Kedua ekspresi menghasilkan undefinedelemen pertama.

Kode uji


Perhatikan bahwa saya lebih suka mengomentari pos JS yang ada jika bukan karena sistem reputasi.
Aaron Hill

Selamat datang di PPCG! Saya tidak suka ambang komentar 50-rep juga, tapi saya kira mereka membutuhkannya untuk mencegah spammer berkomentar. Lagi pula, saya pikir ini akan gagal jika input berisi angka dua digit seperti 10, seperti .sort()mengurutkan secara leksikografis secara default (yaitu 1,10,100,11,12,13, ..., 2,20,21, ...). Anda harus memasukkan (a,b)=>a-batau serupa untuk mengurutkan berdasarkan nomor.
ETHproduk

Terima kasih, @ETHproductions. Saya telah memperbarui untuk pemesanan numerik, yang berarti ini tidak lagi cukup baik. Baiklah.
Aaron Hill

0

Clojure, 56 byte

#(for[i(drop 2(reductions conj[]%))](nth(sort-by - i)1))

Mungkin ada cara yang lebih baik untuk menghasilkan awalan tersebut.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.