Görselleştirmeyi sırala


20

Gibi bir liste var [3, 0, 4, 2, 1]ve sıralamak için seçim sıralama kullanın, ben böyle görselleştirmek olabilir:

3,0,4,2,1
|-|
0,3,4,2,1
  |-----|
0,1,4,2,3
    |-|
0,1,2,4,3
      |-|
0,1,2,3,4

Bu zorluk, bu şekilde sıralamayı görselleştirmekle ilgilidir.

Giriş

Girişiniz, istediğiniz herhangi bir biçimde pozitif tamsayıların bir listesi olacaktır.

Görev

Gönderiminiz giriş listesini bir seferde yalnızca iki öğeyi değiştirerek sıralamalı ve her değiş tokuşta, gönderme listeyi ve değiştirilen öğelerin her birinin altında bir karakter görüntülemelidir. Değiştirilen bir sayının birden fazla basamağı varsa, karakter, altında herhangi bir yerde olabilir. Sonunda, gönderme sıralı listeyi görüntülemelidir.

Diğer kurallar

  • Sıralamada n 4'ten daha az takas kullanılmalıdır , burada n listenin uzunluğudur.
  • Sıralama, deterministik olmak zorunda değildir.
  • Değiştirilenlerin altındaki karakterler boşluk dışında herhangi bir karakter olabilir.

Tamsayıların benzersiz olduğunu varsayabilir miyim?
Jörg Hülsermann

n^4? Burada biraz cömert davranıyorsun.
orlp

@ JörgHülsermann No
Loovjo


3
0
Girdinin

Yanıtlar:


10

Perl, 62 bayt

İçin +3 içerir -p

STDIN'de tek bir sayı satırı olarak girdi verin:

perl -M5.010 visisort.pl <<< "3 0 4 2 1"

İlk ters çevrimi tekrar tekrar değiştirir. Takas karmaşıklığı O(n^2), zaman karmaşıklığıdır O(n^3). Değiştirilen sayıları işaret olarak kullanır:

3 0 4 2 1
3 0
0 3 4 2 1
    4 2
0 3 2 4 1
  3 2
0 2 3 4 1
      4 1
0 2 3 1 4
    3 1
0 2 1 3 4
  2 1
0 1 2 3 4

visisort.pl:

#!/usr/bin/perl -p
$&>$'&&say$_.$"x"@-".!s/(\S+) \G(\S+)/$2 $1/.$&while/\S+ /g

Program ayrıca negatif değerleri ve kayan nokta sayılarını destekler

Bir bağlantı karakterinde ısrar ederseniz, kod 66 bayt olur:

#!/usr/bin/perl -p
$&>$'&&say$_.$"x"@-".!s/(\S+) \G(\S+)/$2 $1/.$1.-$2while/\S+ /g

Ancak artık negatif sayıları ve 0'ı desteklemiyor (ancak programın zaten pozitif tamsayıları desteklemesi gerekiyor. 0Örnekte bir hatadır)


Olduğu göz önüne alındığında The characters under the swapped can be any char except space. size işareti hattında sayısı arasında boşluk olmamalıdır
edc65

@ edc65 Değiştirilecek öğelerin altındaki karakterler boşluk değil. Aralarındaki karakterler hakkında hiçbir şey söylenmez
Ton Hospel

Tamamen ikna olmadý, ama tamam. Ben çok hızlı aşağı indiriyordum (ama dikkatini çektim). Cevabınıza bir (boş) düzenleme
yaparsanız oyumu

@ edc65 Yorumunuz beni bu meydan okumayı çok dikkatli bir şekilde tekrar okuttu. Ayrıca, çok _basamaklı sayıların durumundan da bahsettiğine dikkat edin . Bu yüzden yorumumun yanındayım (OP elbette katılmıyorsa). Buit sadece seni mutlu etmek için ben de yer olmadan bir sürüm ekledi :-)
Ton Hospel

9

JavaScript (ES6), 158 bayt

a=>{for(;;){console.log(``+a);i=a.findIndex((e,i)=>e<a[i-1]);if(i<0)break;console.log(` `.repeat(`${a.slice(0,i)}`.length-1)+`|-|`);t=a[i];a[i]=a[--i];a[i]=t}}

Kabarcık sıralama. Örnek çıktı:

3,0,4,2,1
|-|
0,3,4,2,1
    |-|
0,3,2,4,1
  |-|
0,2,3,4,1
      |-|
0,2,3,1,4
    |-|
0,2,1,3,4
  |-|
0,1,2,3,4

Hep bitişik elemanları takas ediyorum beri @nimi, hep koyabilirsiniz -altında ,ve daha sonra iki |hep bitişik sayılar altında olacak.
Neil

aah, akıllı! Teşekkürler!
nimi

1
Kabarcık sıralama, takas edilen sayıların vurgulanmasını basitleştirmek için gerçekten mantıklı bir seçimdir. Aferin!
Arnauld

9

PHP, 248 Bayt

Bubblesort sıkıcı kazançlar

<?for($c=count($a=$_GET[a]);$c--;){for($s=$i=0;$i<$c;){$l=strlen($j=join(",",$a));if($a[$i]>$a[$i+1]){$t=$a[$i];$a[$i]=$a[$i+1];$a[$i+1]=$t;$m=" ";$m[$s]=I;$m[$s+strlen($a[$i].$a[$i+1])]=X;echo"$j\n$m\n";}$s+=strlen($a[$i++])+1;}}echo join(",",$a);

PHP, 266 Bayt dizisi_slice ve min ile bir yol

I Xyerine değiştirilmiş çıktı*~~*

<?for($c=count($a=$_GET[a]);$i<$c;){$j=join(",",$s=($d=array_slice)($a,$i));$x=array_search($m=min($s),$s);echo($o=join(",",$a));$a[$x+$i]=$a[$i];$a[$i]=$m;if($i++!=$c-1){$t=" ";$t[$z=($f=strlen)($o)-($l=$f($j))]=I;$t[$l+$z-$f(join(",",$d($s,$x)))]=X;echo"\n$t\n";}}

282 Bayt

<?for($c=count($a=$_GET[a]);$i<$c;){$j=join(",",$s=($d=array_slice)($a,$i));$x=array_search($m=min($s),$s);echo($o=join(",",$a));$a[$x+$i]=$a[$i];$a[$i]=$m;if($i++!=$c-1)echo"\n".str_repeat(" ",($f=strlen)($o)-($l=$f($j))).($x?str_pad("*",$l-$f(join(",",$d($s,$x))),"~"):"")."*\n";}

Nasıl çalışır

Bir dizideki minimum değeri arar ve bunu ilk konumda alır İlk konum olmadan minimum değeri arayın .... vb. Bir değer iki katına çıkarsa ilk değer değiştirilir

Çıktı Örneği

31,7,0,5,5,5,753,5,99,4,333,5,2,1001,35,1,67
*~~~~*
0,7,31,5,5,5,753,5,99,4,333,5,2,1001,35,1,67
  *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
0,1,31,5,5,5,753,5,99,4,333,5,2,1001,35,7,67
    *~~~~~~~~~~~~~~~~~~~~~~~~~*
0,1,2,5,5,5,753,5,99,4,333,5,31,1001,35,7,67
      *~~~~~~~~~~~~~~*
0,1,2,4,5,5,753,5,99,5,333,5,31,1001,35,7,67
        *
0,1,2,4,5,5,753,5,99,5,333,5,31,1001,35,7,67
          *
0,1,2,4,5,5,753,5,99,5,333,5,31,1001,35,7,67
            *~~~*
0,1,2,4,5,5,5,753,99,5,333,5,31,1001,35,7,67
              *~~~~~~*
0,1,2,4,5,5,5,5,99,753,333,5,31,1001,35,7,67
                *~~~~~~~~~~*
0,1,2,4,5,5,5,5,5,753,333,99,31,1001,35,7,67
                  *~~~~~~~~~~~~~~~~~~~~~*
0,1,2,4,5,5,5,5,5,7,333,99,31,1001,35,753,67
                    *~~~~~~*
0,1,2,4,5,5,5,5,5,7,31,99,333,1001,35,753,67
                       *~~~~~~~~~~~*
0,1,2,4,5,5,5,5,5,7,31,35,333,1001,99,753,67
                          *~~~~~~~~~~~~~~~*
0,1,2,4,5,5,5,5,5,7,31,35,67,1001,99,753,333
                             *~~~~*
0,1,2,4,5,5,5,5,5,7,31,35,67,99,1001,753,333
                                *~~~~~~~~*
0,1,2,4,5,5,5,5,5,7,31,35,67,99,333,753,1001
                                    *
0,1,2,4,5,5,5,5,5,7,31,35,67,99,333,753,1001

Bunun yerine bir bayt echo$t."\n";kullanabilir echo"$t\n";ve kaydedebilirsiniz.
Ismael Miguel

@IsmaelMiguel Geliştirilecek bir şey bulursanız yayınlarımı düzenlemekten çekinmeyin
Jörg Hülsermann

7
Yazılarda yapılan kod düzenlemeleri genellikle katılıyorum, ki tamamen katılıyorum.
Ismael Miguel

3

Haskell'in 165 164 162 bayt

s%c=drop 2$show s>>c
p#x|(h,t:s)<-span(/=minimum x)x=id=<<[show$p++x,"\n ",[' '|p>[]],p%" ","|",h%"-",['|'|h>[]],"\n",(p++[t])#(drop 1h++take 1h++s)]|1<2=""
([]#)

Bu seçim sıralamasını görselleştirir. Kullanım örneği:

*Main> putStr $ ([]#) [31,7,0,5,5,5,753,5,99,4,333,5,2,1001,35,1,67]
[31,7,0,5,5,5,753,5,99,4,333,5,2,1001,35,1,67]
 |----|
[0,7,31,5,5,5,753,5,99,4,333,5,2,1001,35,1,67]
   |-------------------------------------|
[0,1,31,5,5,5,753,5,99,4,333,5,2,1001,35,7,67]
     |-------------------------|
[0,1,2,5,5,5,753,5,99,4,333,5,31,1001,35,7,67]
       |--------------|
[0,1,2,4,5,5,753,5,99,5,333,5,31,1001,35,7,67]
         |
[0,1,2,4,5,5,753,5,99,5,333,5,31,1001,35,7,67]
           |
[0,1,2,4,5,5,753,5,99,5,333,5,31,1001,35,7,67]
             |---|
[0,1,2,4,5,5,5,753,99,5,333,5,31,1001,35,7,67]
               |------|
[0,1,2,4,5,5,5,5,99,753,333,5,31,1001,35,7,67]
                 |----------|
[0,1,2,4,5,5,5,5,5,753,333,99,31,1001,35,7,67]
                   |---------------------|
[0,1,2,4,5,5,5,5,5,7,333,99,31,1001,35,753,67]
                     |------|
[0,1,2,4,5,5,5,5,5,7,31,99,333,1001,35,753,67]
                        |-----------|
[0,1,2,4,5,5,5,5,5,7,31,35,333,1001,99,753,67]
                           |---------------|
[0,1,2,4,5,5,5,5,5,7,31,35,67,1001,99,753,333]
                              |----|
[0,1,2,4,5,5,5,5,5,7,31,35,67,99,1001,753,333]
                                 |--------|
[0,1,2,4,5,5,5,5,5,7,31,35,67,99,333,753,1001]
                                     |
[0,1,2,4,5,5,5,5,5,7,31,35,67,99,333,753,1001]
                                         |

Nasıl çalışır:

s % clength (show s) - 2karakterin kopyalarını oluşturan bir yardımcı işlevdir c. Her ikisinden önce |, bir kez c == ' 've bir kez ile boşluk bırakmak için kullanılır c == '-'.

Ana işlev #, listenin psıralanan kısmı olan ve xhenüz sıralanmamış olan bir liste alır . Desen eşleşmesi (h,t:s)<-span(/=minimum x)xlisteyi xminimum öğesinde böler ve minimumdan hönceki kısma t, minimumdan kendisine ve minimumdan sonraki kısma bağlanır s. 1) listesi mevcut durumuna (en: geri kalan iki çizgi biçimlendirilirken p++x) ve 2) |----|bir yinelemeli çağrı ardından kısım #ile teklenmiş pve bir kafa hkuyruk arasına yerleştirilir hve s.

Not: negatif ve / veya kayan nokta sayılarıyla da çalışır:

*Main> putStr $ ([]#) [-3,-1,4e33,-7.3]
[-3.0,-1.0,4.0e33,-7.3]
 |----------------|
[-7.3,-1.0,4.0e33,-3.0]
      |-----------|
[-7.3,-3.0,4.0e33,-1.0]
           |------|
[-7.3,-3.0,-1.0,4.0e33]
                |

Düzenleme: @BlackCap 2 bayt kaydetti. Teşekkürler!


id=<<[show$p++x,"\n ",[' '|p>[]],p%" ","|",h%"-",['|'|h>[]],"\n",(p++[t])#(drop 1h++take 1h++s)]
BlackCap

1

Python 2, 267 bayt

Ondalık sayılar ve negatif sayılarla da çalışır.

p=1
while p!=len(a):    
 q=p-1;k=a[p:];m=min(k);n=k.index(m)+p;b=map(str,a)
 if a[q]>m:print','.join(b)+'\n'+''.join(' '*len(i)for i in b[:q])+' '*q+'*'+'-'*(len(b[n])+n-q-2)+''.join('-'*len(i)for i in b[q:n])+'*';a[q],a[n]=[a[n],a[q]]
 p+=1
print','.join(map(str,a))

Örnek:

7,2,64,-106,52.7,-542.25,54,209,0,-1,200.005,200,3,6,1,0,335,-500,3.1,-0.002
*----------------------*
-542.25,2,64,-106,52.7,7,54,209,0,-1,200.005,200,3,6,1,0,335,-500,3.1,-0.002
        *-------------------------------------------------------*
-542.25,-500,64,-106,52.7,7,54,209,0,-1,200.005,200,3,6,1,0,335,2,3.1,-0.002
             *-----*
-542.25,-500,-106,64,52.7,7,54,209,0,-1,200.005,200,3,6,1,0,335,2,3.1,-0.002
                  *-------------------*
-542.25,-500,-106,-1,52.7,7,54,209,0,64,200.005,200,3,6,1,0,335,2,3.1,-0.002
                     *-----------------------------------------------------*
-542.25,-500,-106,-1,-0.002,7,54,209,0,64,200.005,200,3,6,1,0,335,2,3.1,52.7
                            *--------*
-542.25,-500,-106,-1,-0.002,0,54,209,7,64,200.005,200,3,6,1,0,335,2,3.1,52.7
                              *-----------------------------*
-542.25,-500,-106,-1,-0.002,0,0,209,7,64,200.005,200,3,6,1,54,335,2,3.1,52.7
                                *------------------------*
-542.25,-500,-106,-1,-0.002,0,0,1,7,64,200.005,200,3,6,209,54,335,2,3.1,52.7
                                  *-------------------------------*
-542.25,-500,-106,-1,-0.002,0,0,1,2,64,200.005,200,3,6,209,54,335,7,3.1,52.7
                                    *--------------*
-542.25,-500,-106,-1,-0.002,0,0,1,2,3,200.005,200,64,6,209,54,335,7,3.1,52.7
                                      *-------------------------------*
-542.25,-500,-106,-1,-0.002,0,0,1,2,3,3.1,200,64,6,209,54,335,7,200.005,52.7
                                          *------*
-542.25,-500,-106,-1,-0.002,0,0,1,2,3,3.1,6,64,200,209,54,335,7,200.005,52.7
                                            *-----------------*
-542.25,-500,-106,-1,-0.002,0,0,1,2,3,3.1,6,7,200,209,54,335,64,200.005,52.7
                                              *----------------------------*
-542.25,-500,-106,-1,-0.002,0,0,1,2,3,3.1,6,7,52.7,209,54,335,64,200.005,200
                                                   *----*
-542.25,-500,-106,-1,-0.002,0,0,1,2,3,3.1,6,7,52.7,54,209,335,64,200.005,200
                                                      *--------*
-542.25,-500,-106,-1,-0.002,0,0,1,2,3,3.1,6,7,52.7,54,64,335,209,200.005,200
                                                         *-----------------*
-542.25,-500,-106,-1,-0.002,0,0,1,2,3,3.1,6,7,52.7,54,64,200,209,200.005,335
                                                             *---------*
-542.25,-500,-106,-1,-0.002,0,0,1,2,3,3.1,6,7,52.7,54,64,200,200.005,209,335

1

JavaScript (ES6), 147 155

N * n kullanımı, ancak asgari takas sayısını karşılaştırır. Ve takas konumları, sıkıcı kabarcık türüne göre daha değişkendir.

l=>l.reduce((z,v,i)=>l.map((n,j)=>s+=`${j>i?n<l[i]?l[p=j,t=s,i]=n:0:u=s,n},`.length,s=p=0)|p?z+`
${l[p]=v,' '.repeat(u)}^${Array(t-u)}^
`+l:z,''+l)

Daha az golf ve umarım daha anlaşılır

l=>
  l.reduce( (z,v,i) => // update z for each list element v at position i
    ( // begin outer loop body
      // loop to find the least value that is to be placed at pos i
      l.map( (n,j) => // for each list element n at position j
        ( // begin inner loop body
          j > i ? // check if at position after i
            n < l[i] && // check if lower value 
            (
              p = j, // remember position in p 
              l[i] = n, // store value in l[i] (could change later)
              t = s // in t, string length of list elements up element preciding j
            )
          : // else, position up to i
            u = s, // in u, string length of list elements up element preciding i
          s += `${n},`.length, // string length of list elements up to this point (value length + comma)
        ) // end inner loop body
        , s = p = 0 // init s and p at start of inner loop
      ), 
      p ? (// if found a lower value, complete the swap and update output
          l[p] = v, // complete swap, l[i] was assigned before
          z + '\n' + ' '.repeat(u) + // spaces to align 
               '^' + // left marker
               Array(t-u) + // swap highlight, using sequence of commas
               '^\n' + // right marker, newline
               l + // list values after the swap, newline
      )
      : z // else output is unchanged
    ) // end outer loop body
    , ''+l // init string output at start of outer loop
  ) // output is the result of reduce

Ölçek

f=
l=>l.reduce((z,v,i)=>l.map((n,j)=>s+=`${j>i?n<l[i]?l[p=j,t=s,i]=n:0:u=s,n},`.length,s=p=0)|p?z+`
${l[p]=v,' '.repeat(u)}^${Array(t-u)}^
`+l:z,''+l)

function sort()
{
  var list=I.value.match(/-?[\d.]+/g).map(x=>+x)
  O.textContent = f(list)
}

sort()
#I { width:80% }
<input id=I value='3, 0, 4, 2, 1'>
<button onclick='sort()'>Sort</button>
<pre id=O></pre>


0

Java 7, 256241 282 Bayt

15 bayt tasarruf için @Geobits ve @Axelh'e teşekkürler

 void f(int[]a){int m,i,j,l=a.length;for(i=0;i<l;j=a[i],a[i]=a[m],a[m]=j,i++){for(int k:a)System.out.print(k+" ");System.out.println();for(j=i+1,m=i;j<l;m=a[j]<a[m]?j:m,j++);for(j=0;j<=m&i!=l-1;j++)System.out.print(j==i|j==m?a[j]+" ":"  ");System.out.println();}}

Ungolfed

 void f(int[]a){
    int m,i,j,l=a.length;
for(i=0;i<l;j=a[i],a[i]=a[m],a[m]=j,i++){
    for(int k:a)
        System.out.print(k+" ");
    System.out.println();
     for(j=i+1,m=i;j<l;m=a[j]<a[m]?j:m,j++);
      for(j=0;j<=m&i!=l-1;j++)
      System.out.print(j==i|j==m?a[j]+" ":"  ");
      System.out.println();        

}
}

çıktı

3 0 1 4 2 
3 0 
0 3 1 4 2 
  3 1 
0 1 3 4 2 
    3   2 
0 1 2 4 3 
      4 3 
0 1 2 3 4 

4
Bu hala bildirimini eksik, kodunuzda bir yere outbenzer bir şey koymanız gerekiyor PrintStream out=System.out;.
Loovjo

2
İçe / dışa outaktarmayı düzelttikten if/elsesonra, her iki dalda da yazdırmak yerine bir üçlü kullanmanız gerekir . Bunun out.print(a>b?a:b);yerine bir şeyif(a>b)out.print(a);else out.print(b);
Geobits

Eğer başka bir şekilde bunu ifşa ederseniz azaltabilirsiniz: if(j==i|j==m)out.print(a[j]);out.print(" ");veya bir üçlü ile daha da iyi out.print((j==i|j==m?a[j]:" ")+" ");olabilir ve daha sonra döngü PS'nin {} 'i kaldırabilirsiniz: Tamam ise, dışarıda örneği için bir içe aktarma statik kullanıyorum;)
AxelH

Hmm, diğerlerinin golf ipuçlarının yanı sıra, çıktı yanlış .. İşte kodunuz kopyalanmış (ve s'nin System.önüne eklenmiş ) bir ideone ve son iki takas satırında ve outeksik . 23
Kevin Cruijssen

@KevinCruijssen Düzelttim. Aslında bu değişkene i değişkenini j değişkeni ile karıştırmalıyım (i olmalı)for(j=0;j<=m&i!=l-1;j++)
Numberknot

0

Jöle , 36 bayt

I;0CMḢ;L‘ṬCœṗ¹UF©µÐĿ,n+32Ọ$¥¥2\;/®ṭG

Çevrimiçi deneyin!

açıklama

I;0CMḢ;L‘ṬCœṗ¹UF©µÐĿ,n+32Ọ$¥¥2\;/®ṭG
                 µÐĿ                 Repeat until we see a previously seen value:
I;0                                    Take differences of adjacent inputs, and 0
   CM                                  Find the indices (M) of the smallest (C) 
           œṗ                          Split {the input} into pieces
        ‘Ṭ                               that end
      ;L  C                              everywhere except
     Ḣ                                 the first of the chosen deltas
             ¹                         Resolve parser ambiguity
              U                        Reverse each piece
               F                       Concatenate the pieces back into a list
                ©                      Store the value in a register
                                     Then, on the accumulated list of results:
                             2\        Look at each consecutive pair of results
                    ,       ¥  ;/      and return the first element, followed by
                      +32Ọ$            the character with code 32 plus
                     n     ¥           1 (if unequal), 0 (if equal)
                                 ®ṭ  Append the value of the register
                                   G Output in grid form

TIO bağlantısında gösterilen örnek, bu program için özellikle zor bir örnektir; ;0başlangıcına yakın döngü sadece giriş sıralanmış olur noktada bitmesini sağlamak için gereklidir. Bu normalde gerekli değildir (çünkü bir tekrarlamadan sonra sona erecektir), ancak son takas ilk iki unsurdan (burada görüldüğü gibi) ise, bir-tekrarlama gerçekleşmez ve bitirmeyi imkansız hale getirir liste sürekli olarak. Bu nedenle, son döngü yinelemesinde hiçbir şeyi değiştirmememiz gerekir.

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.