Bana nasıl sallanacağını söyle


29

Bilgisayar bilimcileri olarak, pop ve push'ın temel liste işlemlerini muhtemelen biliyorsunuzdur . Bunlar bir eleman listesini değiştiren basit işlemlerdir. Ancak, operasyon flopunu hiç duydunuz mu? ( flip- flop'ta olduğu gibi )? Bu oldukça basit. Bir sayısı göz önüne alındığında , n , ilk ters n listesinin elemanları. İşte bir örnek:

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a.flop(4)
[4, 3, 2, 1, 5, 6, 7, 8, 9, 10]

Flop işlemi ile ilgili en güzel şey, onu sıralama gibi bir listeye güzel şeyler yapmak için kullanabilmenizdir . Flop ile benzer bir şey yapacağız:

Bir tamsayı listesi verildiğinde, "Komşu". Başka bir deyişle, her yinelenen öğenin art arda görünmesini sağlayacak şekilde sıralayın.

Bu floplar ile yapılabilir! Örneğin, aşağıdaki listeyi alın:

>>> a = [3, 2, 1, 4, 3, 3, 2]
>>> a.flop(4)
[4, 1, 2, 3, 3, 3, 2]
>>> a.flop(3)
[2, 1, 4, 3, 3, 3, 2]
>>> a.flop(6)
[3, 3, 3, 4, 1, 2, 2]

Bu bizi bugünün zorluğunun tanımına götürür:

Bir tamsayı listesi verildiğinde, listenin komşulmasına neden olacak herhangi bir flop kümesini çıktılar.

Örnek olarak son listeyi kullanarak çıktı almalısınız:

4
3
6

çünkü listeyi 4'e, sonra 3'e, ardından 6'ya kaydırmak komşu bir listeye neden olacaktır. Eğer do unutmayın değil mümkün olan en kısa listesini yazdırmak için gereken komşular bir liste flop. Yazdıysanız:

4
4
4
3
1
1
6
2
2

Bunun yerine, bu hala geçerli bir çıktı olacaktır. Ancak, hiçbir zaman listenin uzunluğundan daha büyük bir sayı veremezsiniz . Bunun nedeni bir liste için a = [1, 2, 3]aramaların a.flop(4)saçma olmasıdır.

İşte bazı örnekler:

#Input:
[2, 6, 0, 3, 1, 5, 5, 0, 5, 1]

#Output
[3, 7, 8, 6, 9]


#Input
[1, 2]

#Output
<any list of integers under 3, including an empty list>


#Input
[2, 6, 0, 2, 1, 4, 5, 1, 3, 2, 1, 5, 6, 4, 4, 1, 4, 6, 6, 0]

#Output
[3, 19, 17, 7, 2, 4, 11, 15, 2, 7, 13, 4, 14, 2]


#Input
[1, 1, 1, 1, 2, 2, 2, -1, 4]

#Output
[]


#Input
[4, 4, 8, 8, 15, 16, 16, 23, 23, 42, 42, 15]

#Output
[12, 7]

Bu örneklerin her birinde, verilen çıktının yalnızca bir geçerli potansiyel çıktı olduğunu unutmayın. Daha önce de söylediğim gibi , verilen listeye komşu olan herhangi bir flop seti geçerli bir çıktıdır . Belirli bir flop listesinin bir listeyle doğru şekilde komşuluk edip etmediğini doğrulamak için bu python komut dosyasını kullanabilirsiniz .

Herhangi bir makul formatta girdi ve çıktı alabilirsiniz. Örneğin, fonksiyon argümanları / return değeri, STDIN / STDOUT, bir dosyayı okumak / yazmak vb. Geçerlidir. Her zamanki gibi, bu , bu yüzden mümkün olan en kısa programı yapın ve eğlenin! :)


3
Fl (oating point) op (eration) olarak duydum.
Weijun Zhou,

3
@WeijunZhou Bu, py bir donanım parçası gerçekleştirilen işlemlerin sayılması için bir hesaplama hızının ölçüsüdür. en.wikipedia.org/wiki/FLOPS
iPhoenix

3
Başvurular deterministik olmak zorunda mı yoksa dizi gruplanıncaya kadar rasgele rasgele flop yapabilir miyim?
Dennis

3
Çıkışta sıfır flop görülmesine izin verilir mi?
Laikoni,

4
İlgili . NB Bu sorunun herhangi bir cevabı, bu sorunun cevabı olacaktır, ancak sıralanması "komşusu" ndan daha güçlü bir durum olduğu için, onları dışarı atmak mümkün olabilir; şimdiye kadar cevaplar cesaret verici değildir.
Peter Taylor,

Yanıtlar:


7

Haskell , 98 71 bayt

h.r
h(x:s)|(a,b)<-span(/=x)s=l b:l s:h(b++r a)
h e=e
r=reverse
l=length

Çevrimiçi deneyin!

açıklama

Bir uzunluk listesi için nbu yöntem 2*nflop üretir . Listenin son öğesine bakarak, daha önce listedeki aynı öğeyi arayarak ve ikinci ila son konuma çevirerek çalışır. Ardından son elemanın kaldırıldığı liste tekrar tekrar "komşudur".

Liste [1,2,3,1,2]için algoritma şöyle çalışır:

[1,2,3,1,2]  flip longest prefix that ends in 2: flop 2
[2,1,3,1,2]  bring first element to second to last position: flop n-1 = flop 4
[1,3,1,2,2]  recursively work on n-1 list
[1,3,1,2]    there is no other 2: flop 0
[1,3,1,2]    flop n-1 = flop 3
[1,3,1,2]    recurse
[1,3,1]      flop 1
[1,3,1]      flop 2
[3,1,1]      recurse
[3,1]        flop 0
[3,1]        flop 1
 ...

Hep birlikte bu, flopları [2,4,0,3,1,2,0,1,0,0]ve komşu listeyi verir [3,1,1,2,2].


6

Wolfram Dili (Mathematica) , 71 bayt

If[(n=Tr[1^#])<1,{},{i=Last@Ordering@#,n,n-1,i-1}~Join~#0[#~Drop~{i}]]&

Çevrimiçi deneyin!

Nasıl çalışır

Bir uzunluk dizisi verildiğinde, diziyi artan düzende sıralayan nbir dizi 4nflop üretir : özellikle, yinelenen öğeleri yan yana koyarak.

Fikir şu ki, bir diziyi sıralamak için, en büyük elemanını sona taşıyoruz ve ardından n-1dizinin ilk elemanlarını sıralıyoruz. Flop işlemini uygulamaktan kaçınmak için, en büyük elemanı, diğer elemanları rahatsız etmeyecek şekilde sonuna kadar hareket ettiririz:

{3, 2, 1, 5, 3, 3, 2}    starting array, with largest element in position 4
{5, 1, 2, 3, 3, 3, 2}    flop 4 to put the largest element at the beginning
{2, 3, 3, 3, 2, 1, 5}    flop 7 to put the largest element at the end
{1, 2, 3, 3, 3, 2, 5}    flop 6 (7-1) to reverse the effect of flop 7 on other elements
{3, 2, 1, 3, 3, 2, 5}    flop 3 (4-1) to reverse the effect of flop 4 on other elements

Genel olarak, eğer en büyük eleman pozisyondaysa i, onu sonuna kadar hareket ettiren flop dizisidir i, n, n-1, i-1.


Sadece en büyük elemanı sonuna kadar hareket ettirebilirsiniz i, n. Neden o zaman do n-1, i-1? Sabit bir sıralamaya gerek yok .
Peter Taylor,

@PeterTaylor Cevabın aslında floplar yaptığını sanmıyorum, bunun yerine her seferinde en büyük elemanı kaldırıyor ve bu işlemin eşdeğerini floplar olarak çıkarıyor.
Neil


3

Jöle , 19 17 bayt

ỤỤạ‘Ḣ
ỤÇÐƤĖµUż’ṚF

Listeyi sıralar.

Çevrimiçi deneyin!


Modulo ỤŒ¿’Æ!‘ṚĖµUż’ṚFolduğundan beri ters sıralama düşünüyorum . Œ¿L!
Jonathan Allan,

Her ne sebeple olursa olsun, bu son test davası için işe yaramaz, bu muhtemelen benim kodumun bazı kesin kenar durumları için başarısız olacağı anlamına gelir ...
Dennis

Ve gerçekten girdi için başarısız [4, 3, 2, 1, 3]. Aylak.
Dennis

Ah, canım; bu utanç verici.
Jonathan Allan,

Ụ>Ṫ$ƤSạỤĖµUż’ṚFyardımcı bağlantıyı değiştirerek 2 bayt tasarrufu.
miller

2

Temiz , 88 bayt

Sanırım gardiyanlarla ilgili daha kısa bir tane var, ama henüz bulamadım.

import StdEnv
$[h:t]#(a,b)=span((<>)h)t
=map length[b,t]++ $(b++r a)
$e=e
r=reverse

$o r

Çevrimiçi deneyin!

Bir fonksiyon olarak değişmez. Laikoni'nin Haskell'in cevabıyla aynı şekilde çalışır , ancak biraz farklı şekilde ve elbette farklı bir dilde golf oynar.


1

JavaScript, 150 bayt

(a,f=n=>(a=[...a.slice(0, n).reverse(),...a.slice(n)],n),l=a.length,i=0)=>a.reduce(c=>[...c,f(a.indexOf(Math.max(...a.slice(0, l-i)))+1),f(l-i++)],[])

Çevrimiçi deneyin!

JavaScript, 151 bayt

a=>{f=n=>(a=[...a.slice(0,n).reverse(),...a.slice(n)],n),r=[];for(i=a.length+1;--i>0;)r.push(f(a.indexOf(Math.max(...a.slice(0, i)))+1),f(i));return r}

Çevrimiçi deneyin!

Her ikisi de, temel olarak, maksimum sayıyı başlangıcı ile çevirerek ve ardından geri çevirerek geri kalan diziyle tekrarlayarak diziyi sıralar. Birincisi azaltma, ikincisi bir for döngüsü kullanır.

Ungolfed:

array => {
  let flop = n => {
    array = [...array.slice(0, n).reverse(), ...array.slice(n)]; 
    return n;
  }
  let flops = [];
  for (let i = array.length + 1; --i > 0;) 
  {
    let maxIndex = array.indexOf(Math.max(...array.slice(0, i)));
    flops.push(flop(maxIndex + 1), flop(i));
  }
  return flops;
}

0

5,10 Perl (veya üstü), 66 bayt

Kapsar +3için 5.10 ücretsiz kabul edilir perl seviyeye dili getirmek-nuse 5.10.0

#!/usr/bin/perl -n
use 5.10.0;
$'>=$&or$.=s/(\S+) \G(\S+)/$2 $1/*say"$. 2 $."while$.++,/\S+ /g

STDIN'de giriş ile bir satır olarak çalıştırın:

flop.pl <<< "1 8 3 -5 6"

Listeyi sırayla herhangi bir inversiyon bularak, öne doğru kaydırıp sonra inversiyonu bırakarak ve her şeyi eski konumuna geri getirerek sıralar.

Bu konuda python ile aynı ballpark'a girmek şaşırtıcı derecede zordu :-)


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.