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.