Bir listenin ikinci maksimum sayısını çalıştırma


20

Tamsayıların bir listesi verildiğinde, göreviniz ilk k öğelerindeki ikinci en büyük değeri , her k için 2 ile giriş listesinin uzunluğu arasında çıktı almaktır.

Başka bir deyişle, girdinin her öneki için ikinci en büyük değeri girin.

İlk eleman için rasgele bir değer çıktısı alabilirsiniz (burada k = 1) veya 1 elemanlık bir liste için ikinci bir maksimum olmadığından bu değeri atlayabilirsiniz. Girişte en az 2 öğe olduğunu varsayabilirsiniz.

En kısa kod kazanır.

Örnekler

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

İngilizcem en iyisi değil, nasıl kbelirlenir?
LiefdeWen

@LiefdeWen Her k için cevabı içeren bir liste çıkar.
jimmy23013

2
1değil, kesinlikle, konuşma olduğu ikinci en büyük değeri arasında 1,1(2 örnek) ikinci değer sıralı inen bu.
Jonathan Allan

Belki sadece aptalım (haftasonunun gerçekten başlayabileceğinden şüphelenmeme rağmen ..), ama bunun nasıl çalıştığından hala emin değilim. Birisi bana son test davası ELI5 olabilir mi? İlk iki test vakası, sadece liste üzerinde döngü yaparak, listenin geçerli minimum değerini belirleyerek ve daha sonra bu öğeyi kaldırarak (veya daha kolay: listeyi sırala ve son öğeyi kaldır) çözebileceğim. İlk iki test vakası için doğru sonuçları verir, ancak açıkça yanlıştır (ve -1, 0, 0, 1, 1, 2son test vakası için verecektir .)
Kevin Cruijssen

1
@KevinCruijssen Gördüğünüz en büyük iki sayıyı hatırlayın. Son durumda, 2 en büyük olmakla başlar ve bu noktada mantıklı olmadığı için hiçbir şey / hiçbir şey çıkarmazsınız. Daha sonra bir sonraki yinelemede 1 ve 2 olarak değiştirirsiniz, böylece çıkış 1 elde edersiniz. Bu, sonunda 2'ye ulaşana kadar aynı kalır ve daha sonra en büyük ve ikinci en büyük 2 ve 2
FryAmTheEggman

Yanıtlar:



5

Kabuk , 9 7 bayt

@Zgarb sayesinde bir veya iki bayt kaydetti

mȯ→hOtḣ

0İlk "ikinci maksimum" değerini döndürür

Açıklama

         -- 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

Çevrimiçi deneyin!


1
Bunun →hOyerine eşleyebilir ve bir bayt kaydedebilirsiniz.
Zgarb


3

JavaScript (ES6), 58 51 50 bayt

@Neil sayesinde 1 bayt kaydedildi

K = 1undefined için eklenir .

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

Test senaryoları

Not: Bu pasaj, JSON.stringify()yan etki olarak dönüştürülen okunabilirlik undefinediçin kullanılır null.


1
Bence a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[])sadece 50.
Neil

@Neil Nice. :-)
Arnauld

2

Pyth , 8 bayt

m@Sd_2._

Çevrimiçi deneyin! veya Test Suite'i deneyin!


Nasıl?

Bu, özelliğe göre listenin ilk öğesini listedeki ilk değer olarak verir. İlk öğe için isteğe bağlı bir değer çıktısı alabilirsiniz .

m@Sd_2._ - Örtük girdili tam program.

m ._Q - d değişkeniyle girişin öneklerini eşleyin.
  Sd - Geçerli öneki sıralar.
 @ - Öğeyi alır ...
    _2 - İndekste - 2 (en yüksek ikinci).
           - Örtük olarak yazdırın.

2

Jöle , 8 bayt

ḣJṢ€Ṗ€Ṫ€

Çevrimiçi deneyin!

İlk değer her zaman 0 olur ve aşağıdaki sayılar her ön ekin ikinci maksimumları olur.

açıklama

ḣ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 Bunun işe yaradığına inanmıyorum
mil

@ Challenger5 Bu işe yaramıyor ...
Outgolfer Erik

@EriktheOutgolfer Oh, tamam.
Esolanging Fruit


2

Python 2 , 45 bayt

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

Çevrimiçi deneyin!

Kodun sağ tarafı açıklayıcıdır. Ancak, soluna ne koyarız and? Bir listenin bölümlerini yinelemeli olarak birleştirdiğimiz için l, 2 veya daha fazla öğeye sahipse sol tarafın doğru olması ve aksi takdirde boş bir listeye ihtiyacımız vardır. l[1:]bu kriteri iyi karşılar.




1

Toplu, 123 bayt

@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 bayt

Erik'in çözümünden çok farklı bir 5 bayt daha buldum . Rasgele değer listenin ilk öğesidir.

ηε{Áθ

Çevrimiçi deneyin!


açıklama

ηε{Áθ  - 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.

Anlaşmayı kolaylaştırmak için bir örnek alalım.

  • İlk olarak örtük girdiyi alıyoruz, diyelim [1, 5, 2, 3, 5, 9, 5, 8].

  • Sonra biz kullanarak önekleri itmek η- [[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]].

  • Şimdi, kod listeyi eşler ve {- ile her öneki sıralar [[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]].

  • Sonra en son eleman alıp başına hareket: [[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]].

  • Tabii ki, şimdi kod θ- kullanarak her alt listenin son öğesini alır [1, 1, 2, 3, 5, 5, 5, 8](ilki rastgele değerdir.




1

Japt , 12 10 bayt

Çıkış dizisi, giriş dizisindeki ilk öğeden sonra istenen diziden oluşur.

£¯YÄ n< g1

Dene


açıklama

Örtülü dizi girişi U.

£

Harita üzerinde U, Ygeçerli dizin nerede .

¯YÄ

Dilim Ugelen 0etmek Y+1.

n<

Azalan şekilde sırala.

g1

İkinci unsuru alın.

Ortaya çıkan diziyi dolaylı olarak çıktılar.


1

Matl , 19 10 bayt

9 byte'ı tıraş ettiği için Luis Mendo'ya teşekkürler!

"GX@:)SP2)

Dene Burada .

açıklama

"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 Vay canına! MATL hakkında ne kadar bilgim olduğunu gösterir. Yardım için teşekkürler!
DanTheMan

1

J, 13 bayt

_2&{@/:~ ::#\

Çevrimiçi deneyin!İlk eleman daima 1'dir.

açıklama

_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)

Alan önemlidir.


1

Ohm , 10 8 bayt

ETHproductions sayesinde -2 bayt.

∙p»îS2~ª

Çevrimiçi deneyin!

Ah, ... Bu garip ama negatif bir sayı itmek başka nasıl bilmiyorum ben yok gerçekten Ohm biliyorum. : P


1
Tamam, 0 2-çok garip görünüyor ...
Bay Xcoder

1
Sadece dokümanlara bakıyorum (Ohm hakkında hiçbir şey bilmiyorum), yapabilir misin 2~?
ETHproductions

@TEHProductions Oh, çok daha iyi. Teşekkürler!
totallyhuman



0

Swift 3 , 67 bayt

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

Test odası.

Swift 3 , 65 bayt

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

Test odası.


Bunları nasıl çalıştırırım?

Birincisi, girdiyi işlev parametresi olarak alan ve sonucu basan eksiksiz bir işlevdir. Bunları tam olarak test bağlantısında gösterildiği gibi kullanabilirsiniz. Yine de talimatlar eklemeye karar verdim, çünkü ikinci tip fonksiyon çok nadiren kullanılıyor ve çoğu insan varlığını bile bilmiyor. Kullanımı:

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

İkincisi, lambdalar gibi anonim bir işlevdir. Bir değişkeni bildirip fçağırmak için tam olarak yaptığınız gibi Python kullanabilirsiniz :

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]))

veya parantez arasına sarın ve doğrudan çağırın ( (...)(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 bayt

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

komut satırı bağımsız değişkenlerinden girdi alır. Çıktı sınırlandırılmış, kurşun ve noktalı virgül tarafından izlenir.
Birlikte çalışın-nr veya çevrimiçi deneyin .

PHP 7.1'de bir uyarı verir; düzeltmek için a&ile değiştirin ""<.
Veya kullanın for(;++$i<$argc;rsort($a),print$a[1]._)$a[]=$argv[$i];(54 bayt)


0

Mathematica 42 Bayt

Bağımsız olarak @Jenny_mathy çok benzer bir cevap geldi ama 3 bayt daha kısa

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

İlk çalıştırma maksimum değerinin yalnızca 15 bayt ve iki işlev çağrısı aldığını fark etti !:

Max~FoldList~#&

Bu çok kısaca yapılabilir Max, çünkü nitelikleri vardır Flatve OneIdentitybu doğru değildirRankedMax bu mantıksal yerine geçecek olan . Ne yazık ki nitelikleri tanımlamak veya mevcut işlevler üzerinde değiştirmek çok fazla bayt gerektirir, bu nedenle düzleştirme başka yollarla yapılmalıdır.

Tüm n. Çalışma maksimumları 48 baytta bulunabilir:

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


0

k , 13 bayt

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

Çevrimiçi deneyin!

           ,\ /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

JavaScript (ES6), 43 51 bayt

Düzenleme: Sayısal sıralama istendiğinden 8 bayt eklendi. :(

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

Bununla birlikte, burada tutmak, sözlükbilimsel düzen istiyorsa daha kısa olduğu için:

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

Her iki ifade undefinedde ilk öğe için üretilir.

Test kodu


Itibar sistemi için olmasaydı sadece mevcut JS yazı üzerine yorum yapmayı tercih ederdim.
Aaron Hill

PPCG'ye Hoşgeldiniz! Ben de 50 tekrarlı yorum eşiğini sevmiyorum, ama sanırım spam göndericilerinin yorum yapmasını engellemek için buna ihtiyaçları var. Her neyse, giriş varsayılan 10olarak .sort()sözlükbilimsel olarak sıralandığı gibi (örneğin, 1,10,100,11,12,13, ..., 2,20,21, ...) gibi çift haneli bir sayı içeriyorsa, bu başarısız olacağını düşünüyorum . (a,b)=>a-bSayıya göre sıralamak için dahil etmeniz veya benzer bir şey yapmanız gerekir .
ETHproductions

Teşekkürler, @ETHproductions. Sayısal sipariş için güncelledim, yani bu artık yeterince iyi değil. Oh iyi.
Aaron Hill

0

Clojure, 56 bayt

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

Belki de bu önekleri oluşturmanın daha iyi bir yolu vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.