เห็นภาพการเรียงลำดับ


20

สมมติว่าฉันมีรายการเช่น[3, 0, 4, 2, 1]และฉันใช้การเรียงลำดับการเลือกเพื่อเรียงลำดับฉันสามารถจินตนาการได้ดังนี้:

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

ความท้าทายนี้เกี่ยวกับการมองเห็นการจัดเรียงเช่นนี้

อินพุต

ข้อมูลที่คุณป้อนจะเป็นรายการจำนวนเต็มบวกในทุกรูปแบบที่คุณต้องการ

งาน

การส่งของคุณควรเรียงลำดับรายการอินพุตโดยการสลับสององค์ประกอบต่อครั้งเท่านั้นและในแต่ละการสลับการส่งควรแสดงรายการและอักขระภายใต้แต่ละองค์ประกอบที่ถูกสลับ หากตัวเลขที่ถูกสลับมีมากกว่าหนึ่งหลักตัวละครสามารถอยู่ที่ใดก็ได้ที่อยู่ข้างใต้ ในตอนท้ายการส่งควรแสดงรายการเรียงลำดับ

กฎอื่น ๆ

  • การเรียงลำดับต้องใช้การสลับน้อยกว่า n 4โดยที่ n คือความยาวของรายการ
  • การเรียงลำดับไม่จำเป็นต้องกำหนดขึ้น
  • อักขระภายใต้การสลับสามารถเป็นอักขระใด ๆ ยกเว้นพื้นที่

ฉันจะสมมติว่าจำนวนเต็มนั้นไม่ซ้ำกันได้หรือไม่?
JörgHülsermann

n^4? คุณเป็นคนใจกว้างที่นี่
orlp

@ JörgHülsermann No
Loovjo

2
หากใครมีความสนใจในการเรียงลำดับtoptal.com/developers/sorting-algorithms
exussum

3
คุณบอกว่าการป้อนข้อมูลเป็นจำนวนเต็มบวก แต่ตัวอย่างของคุณมี0(โปรดแก้ไขเฉพาะตัวอย่างเพื่อที่จะไม่ทำให้คำตอบที่ไม่ถูกต้องที่ไม่สามารถจัดการได้ 0)
Ton Hospel

คำตอบ:


10

Perl, 62 ไบต์

รวมถึง +3 สำหรับ -p

ให้อินพุตเป็นตัวเลขบรรทัดเดียวบน STDIN:

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

สลับการผกผันครั้งแรกซ้ำแล้วซ้ำอีก ซับซ้อน Swap คือความซับซ้อนเวลาO(n^2) O(n^3)ใช้ตัวเลขที่สลับเป็นเครื่องหมาย:

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

โปรแกรมนี้ยังรองรับค่าลบและหมายเลขจุดลอยตัว

หากคุณยืนยันในการเชื่อมต่ออักขระรหัสจะกลายเป็น 66 ไบต์:

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

แต่ตอนนี้มันไม่รองรับจำนวนลบและ 0 อีกต่อไป (แต่โปรแกรมจะต้องสนับสนุนจำนวนเต็มบวกเท่านั้นอย่างไรก็ตาม0ในตัวอย่างนี้เป็นข้อผิดพลาด)


ระบุว่าThe characters under the swapped can be any char except space. คุณไม่ควรมีช่องว่างระหว่างตัวเลขในเส้นเครื่องหมาย
edc65

@ edc65 ตัวละครภายใต้องค์ประกอบที่ถูกสับเปลี่ยนไม่ใช่ช่องว่าง ไม่มีการพูดเกี่ยวกับตัวละครระหว่างพวกเขา
Ton Hospel

ไม่เชื่ออย่างสิ้นเชิง แต่ก็โอเค ฉัน downvoting เร็วเกินไป (แต่ฉันได้รับความสนใจของคุณ) หากคุณแก้ไข (ว่าง) เป็นคำตอบของคุณฉันจะเปลี่ยนการลงคะแนนของฉัน
edc65

@ edc65 ความคิดเห็นของคุณทำให้ฉันอ่านความท้าทายอย่างระมัดระวังอีกครั้ง โปรดสังเกตว่าเขายังพูดถึงกรณีของตัวเลขหลายหลักอย่างชัดเจนซึ่งหมายความว่าคุณสามารถทำได้เช่นเพียงแค่ใส่ตัวเลข_แรกซึ่งหมายความว่าตัวละครทุกตัวในความเป็นจริงจะเป็นช่องว่าง) ดังนั้นฉันจึงตีความการตีความของฉัน (ยกเว้นกรณีที่ OP ไม่เห็นด้วยอย่างแน่นอน) อยากให้คุณมีความสุขฉันเพิ่มรุ่นโดยไม่มีที่ว่างเช่นกัน :-)
Ton Hospel

9

JavaScript (ES6), 158 ไบต์

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

เรียงลำดับฟอง ตัวอย่างผลลัพธ์:

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

@nimi เนื่องจากฉันมักจะสลับองค์ประกอบที่อยู่ติดกันฉันสามารถใส่ส่วน-ใต้,และจากนั้นทั้งสอง|จะอยู่ภายใต้ตัวเลขที่อยู่ติดกัน
Neil

อ่าฉลาด! ขอบคุณ!
nimi

1
การเรียงลำดับฟองเป็นตัวเลือกที่สมเหตุสมผลจริงๆเพื่อลดความซับซ้อนของการสลับหมายเลข ทำได้ดี!
Arnauld

9

PHP, 248 ไบต์

ฟองสบู่ที่น่าเบื่อชนะ

<?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 ไบต์ด้วย array_slice และ min

เอาต์พุตที่ถูกแก้ไขI Xแทน*~~*

<?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 ไบต์

<?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";}

มันทำงานอย่างไร

ค้นหาขั้นต่ำในอาร์เรย์และดำเนินการนี้ในตำแหน่งแรกค้นหาขั้นต่ำโดยไม่มีตำแหน่งแรก .... และอื่น ๆ หากค่าเป็นสองเท่าค่าแรกจะสลับ

ตัวอย่างผลลัพธ์

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

แทนที่จะecho$t."\n";ใช้คุณสามารถใช้echo"$t\n";และบันทึกไบต์
Ismael Miguel

@IsmaelMiguel รู้สึกอิสระที่จะแก้ไขโพสต์ของฉันหากคุณพบสิ่งที่ต้องปรับปรุง
JörgHülsermann

7
การแก้ไขโค้ดในโพสต์มักจะขมวดคิ้วซึ่งฉันเห็นด้วยอย่างยิ่ง
Ismael Miguel

3

Haskell, 165 164 162 ไบต์

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=""
([]#)

สิ่งนี้แสดงให้เห็นการเรียงลำดับการเลือก ตัวอย่างการใช้งาน:

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

มันทำงานอย่างไร:

s % cเป็นหน้าที่ผู้ช่วยที่ทำให้สำเนาของตัวละครlength (show s) - 2 cโดยจะใช้สำหรับระยะห่างก่อนที่ทั้งสอง|เวลาหนึ่งและครั้งเดียวกับc == ' 'c == '-'

ฟังก์ชั่นหลัก#ใช้รายการpซึ่งเป็นส่วนที่จัดเรียงของรายการและxซึ่งเป็นส่วนที่ยังเรียงลำดับ การจับคู่รูปแบบ(h,t:s)<-span(/=minimum x)xแยกรายการxที่องค์ประกอบขั้นต่ำของมันและผูกhกับส่วนก่อนขั้นต่ำtไปยังตัวเองขั้นต่ำและsส่วนหลังขั้นต่ำ ส่วนที่เหลือจะจัดรูปแบบสองสาย 1) รายการที่รัฐในปัจจุบัน ( p++x) และ 2) |----|ส่วนหนึ่งตามด้วยโทร recursive ของ#ที่มีtต่อท้ายpและหัวของhแทรกระหว่างหางของและhs

PS: ทำงานได้กับตัวเลข negativ และ / หรือ floating point:

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

แก้ไข: @BlackCap บันทึก 2 ไบต์ ขอบคุณ!


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

1

Python 2, 267 ไบต์

มันทำงานกับทศนิยมและตัวเลขลบเช่นกัน

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

ตัวอย่าง:

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 เปรียบเทียบ แต่ (ฉันเชื่อว่า) จำนวนแลกเปลี่ยนขั้นต่ำ และตำแหน่งการแลกเปลี่ยนเป็นตัวแปรมากกว่าเมื่อเปรียบเทียบกับการจัดเรียงฟองที่น่าเบื่อ

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)

หักกอล์ฟและหวังว่าจะเข้าใจได้มากขึ้น

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

ทดสอบ

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 256 241 282 ไบต์

ขอบคุณ @Geobits และ @Axelh สำหรับการบันทึก 15 ไบต์

 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();        

}
}

เอาท์พุต

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
สิ่งนี้ยังขาดการประกาศoutคุณจะต้องใส่บางอย่างPrintStream out=System.out;ในรหัสของคุณ
Loovjo

2
หลังจากแก้ไขการนำเข้า / การประกาศของoutคุณควรใช้ ternary แทนif/elseหากคุณกำลังจะพิมพ์บนทั้งสองสาขา สิ่งที่ต้องการout.print(a>b?a:b);แทนif(a>b)out.print(a);else out.print(b);
Geobits

คุณสามารถลดคำตอบหากเป็นอย่างนี้: if(j==i|j==m)out.print(a[j]);out.print(" ");หรือดีกว่าด้วย ternary out.print((j==i|j==m?a[j]:" ")+" ");แล้วคุณสามารถลบ {} ของลูป PS: ฉันใช้ static static import สำหรับอินสแตนซ์ out ถ้าไม่เป็นไร)
AxelH

อืมนอกเหนือจากเคล็ดลับการเล่นกอล์ฟจากคนอื่นแล้วผลลัพธ์ไม่ถูกต้อง .. นี่คืออุดมคติที่มีการคัดลอกโค้ดของคุณ (และเพิ่มSystem.ไว้ด้านหน้าout) และมันหายไป2และ3ในสองบรรทัดสลับสุดท้าย
Kevin Cruijssen

@KevinCruijssen ฉันแก้ไขแล้วจริงๆแล้วฉันรวมตัวแปร i กับตัวแปร j (ควรเป็น i) ในบรรทัดนี้for(j=0;j<=m&i!=l-1;j++)
Numberknot

0

เยลลี่ขนาด 36 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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 นั้นยากมากสำหรับโปรแกรมนี้ ;0ใกล้จุดเริ่มต้นเป็นสิ่งที่จำเป็นเพื่อให้มั่นใจว่าห่วงจบลงเพียงในจุดที่มีการป้อนข้อมูลจะกลายเป็นเรียง ตามปกติแล้วไม่จำเป็น (เพราะมันจะจบลงหลังจากการทำซ้ำอีกครั้ง) แต่ถ้าการสลับครั้งสุดท้ายเป็นสององค์ประกอบแรก (ดังที่เห็นที่นี่) การทำซ้ำมากกว่าหนึ่งครั้งจะไม่เกิดขึ้นและทำให้เป็นไปไม่ได้ รายการอย่างสม่ำเสมอ ด้วยเหตุนี้เราจึงต้องแน่ใจว่าเราจะไม่สลับสิ่งใดในการวนซ้ำครั้งล่าสุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.