สับเปลี่ยนแถวที่ขาด


23

อาร์เรย์แบบ ragged เป็นอาร์เรย์ที่แต่ละองค์ประกอบเป็นอาร์เรย์จำนวนเต็มบวกที่ไม่ทราบจำนวน

ตัวอย่างเช่นต่อไปนี้เป็นอาร์เรย์ ragged:

[[1,2,3],[4],[9,10]]               Shape:  3,1,2
[[1],[2],[3]]                      Shape:  1,1,1
[[1,2,3,4,5,6,8]]                  Shape:  7

ต่อไปนี้ไม่ใช่ ragged arrays:

[1]   Each element will be an array
[]    The array will contain at least 1 element
[[1,2,3],[]]  Each subarray will contain at least 1 integer

คุณต้องใส่อาเรย์แบบ ragged และส่งกลับอาเรย์แบบ ragged ด้วยจำนวนเต็มแบบสับ

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

ตัวอย่างเช่นถ้าผมผ่าน: [[4],[1,2,3],[4]]แล้ว[[1],[4,4,2],[3]]จะเป็นเอาท์พุทที่ถูกต้อง แต่[[4,1,3],[3],[4]]หรือ[[4],[4],[1,2,3]]จะไม่



1
อินพุตจะเป็นอาร์เรย์ 2 มิติเสมอหรือไม่
Dennis

คำตอบ:


17

Jelly 3 ไบต์ในเพจรหัสของ Jelly

FẊṁ

คำอธิบาย:

FẊṁ
F    flatten list
 Ẋ   shuffle the output from the previous line
  ṁ  unflatten the list, shaping it like…

เนื่องจากโปรแกรมไม่สมบูรณ์ ( ไม่มีอาร์กิวเมนต์ที่สองระบุไว้) ค่าเริ่มต้นคือใช้อินพุตโปรแกรม จึงทำให้เอาต์พุตมีรูปแบบรายการย่อยเดียวกันกับอินพุต

ลองออนไลน์!


4
ว้าวการไม่บีบอัดเป็นคำสั่งที่เรียบร้อยและไม่คาดคิด
Magic Octopus Urn

3
การไม่บีบอาจไม่เป็นคำที่ดีที่สุดเนื่องจากอาร์กิวเมนต์ซ้ายไม่ต้องถูกแบน ช่วยในการจำเป็นแม่พิมพ์
Dennis

@Dennis: นั่นหมายความว่ามันจะไม่ทำงานอย่างถูกต้องสำหรับความท้าทายนี้ในอาร์เรย์ ragged อินพุตที่มีรายการเป็นองค์ประกอบแทนที่จะเป็นจำนวนเต็ม (เพราะจะทำให้รายการด้านในแบนก่อน) นั่นเป็นเรื่องที่น่าผิดหวังเล็กน้อยคุณคาดหวังให้มันทำงานได้โดยไม่คำนึงถึงประเภทของอาเรย์ที่ขาด (อัปเดต: ฉันตรวจสอบแล้วดูเหมือนว่าทั้งสองFและทำงานกับแบนหลายชั้นไม่ใช่แค่อันเดียว)

ฉันหมายความว่าอาร์กิวเมนต์ด้านซ้ายของสามารถเป็นอะไรก็ได้ไม่ใช่แค่รายการเรียบ ๆ ตัวอย่างเช่น: tio.run/nexus/jelly#@/9wZ@P///@jow11FIxidRSijXUUTEC0qY6CWWzs/...
เดนนิส

1
โอ้ฉันจะเรียกมันว่าการผ่าตัดที่ไม่แบน อาร์กิวเมนต์ด้านซ้ายกำลังถูกถือว่าเป็นรายการแบบเรียบ (มันเกิดขึ้นเพื่อให้มีรายการเป็นองค์ประกอบ แต่องค์ประกอบเหล่านั้นจะถูกตีความเป็นทึบแสง) ที่จริงแล้วฉันสงสัยว่าเราเห็นด้วยกับสิ่งที่ไม่แบน แต่ไม่เห็นด้วยกับสิ่งที่แบนคือ ...

7

PowerShell v2 +, 86 ไบต์

param($n)$a=$n-split'[^\d]'-ne''|sort{random};-join($n-split'\d+'-ne''|%{$_+$a[$i++]})

ทำงานผ่านการจัดการสตริง อินพุตถูกส่งเป็นสตริงที่แทนอาร์เรย์ในรูปแบบใดก็ได้ที่ใช้งานได้กับภาษาของคุณ ;-)

-splits จากการป้อนข้อมูลที่ไม่ตัวเลขที่, sorts พวกเขาอยู่บนพื้นฐานของrandomบล็อกสคริปต์ (ซึ่งจะกำหนดน้ำหนักสุ่มที่แตกต่างกันสำหรับการป้อนข้อมูลในการเรียงลำดับในแต่ละ), $aร้านค้าที่เป็น จากนั้นเราจะsplitมีการป้อนข้อมูลอีกครั้งคราวนี้ในตัวเลขและสำหรับแต่ละคนส่งออกมูลค่าปัจจุบัน (ปกติวงเล็บและจุลภาค) $aสตริงตัดแบ่งที่มีจำนวนที่สอดคล้องกันจาก นั่นคือการ-joinรวมกันกลับเข้าไปในสตริงและเอาท์พุทเป็นนัย

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\shuffle-a-ragged-array.ps1 "@(@(1,2,3),4)"
@(@(3,2,1),4)

PS C:\Tools\Scripts\golfing> .\shuffle-a-ragged-array.ps1 "@(@(1,2,3),4)"
@(@(1,2,4),3)

PS C:\Tools\Scripts\golfing> .\shuffle-a-ragged-array.ps1 "[[4],[1,2,3],[4]]"
[[4],[2,4,3],[1]]

PS C:\Tools\Scripts\golfing> .\shuffle-a-ragged-array.ps1 "[[10],[1,2,3],[5]]"
[[10],[5,2,1],[3]]

PS C:\Tools\Scripts\golfing> .\shuffle-a-ragged-array.ps1 "[[10],[1,2,3],[5]]"
[[5],[10,2,1],[3]]


3

JavaScript (ES6), 78 75 ไบต์

x=>x.map(y=>y.map(z=>+s.splice(Math.random()*s.length,1)),s=eval(`[${x}]`))

นี่เป็นครั้งแรกที่ฉันจำได้ว่าใช้.splice()ในการแข่งขันกอล์ฟ - รหัส ...

คุณสามารถตีสองไบต์ได้โดยการสับอาร์เรย์ก่อน:

x=>x.map(y=>y.map(z=>s.pop()),s=eval(`[${x}]`).sort(_=>Math.random()-.5))

อย่างไรก็ตามนี่ดูเหมือนจะใส่จำนวนเต็มสุดท้ายเป็นส่วนใหญ่ก่อนดังนั้นฉันจะสมมติว่าจำนวนเต็มไม่กระจายอย่างสม่ำเสมอ


"คุณสามารถสันนิษฐานได้ว่าภาษาในตัวของคุณเป็นแบบสุ่ม"
Conor O'Brien

@ ConorO'Brien "จำนวนเต็มแต่ละตัวต้องมีโอกาสเท่ากันที่จะปรากฏในแต่ละตำแหน่งที่เป็นไปได้"
ETHproductions

sortทำงานไม่ถูกต้องเมื่อให้คีย์เปรียบเทียบที่ไม่สอดคล้องกัน แม้ว่าการสุ่มของภาษาจะเป็นการสุ่มการเรียงลำดับของมันจะทำงานผิดปกติในสถานการณ์นี้และนั่นคือสิ่งที่สร้างอคติที่คุณเห็น ดังนั้นฉันคิดว่าวิธีที่สองไม่ถูกต้อง


2

Brachylogขนาด 17 ไบต์

c@~P,?:{l~l}a.cP,

ลองออนไลน์!

คำอธิบาย

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

c@~P,                 Concatenate the Input into a single list. Shuffle it and call that P.
     ?:{   }a.        The Output is the result of applying this to each element of the input:
        l~l               The Output is a list of same length as the Input.    
             .cP,     P is the concatenation of the sublists of the Output.

1

Perl, 37 ไบต์

รหัส 36 ไบต์ + -pธง

@n=/\d+/g;s/\d+/splice@n,rand@n,1/ge

วิธีเรียกใช้:

perl -pE '@n=/\d+/g;s/\d+/splice@n,rand@n,1/ge' <<< "[[4],[1,2,3],[4]"

คำอธิบาย:

@ n = / d + / g # เก็บจำนวนเต็มทั้งหมดใน @n
s / \ d + / # แทนที่แต่ละจำนวนเต็มด้วย ...
splice @ n, rand @ n, 1 / ge # a องค์ประกอบที่ตำแหน่งสุ่มของ @n (ซึ่งถูกลบออกจาก @n)

1

05AB1E , 17 ไบต์

˜.r¹vDyg£DˆgF¦}}¯

˜                 Unflatten input
 .r               tmp = shuffle(flattened_input)
   ¹v             For each sub-array
     Dyg£         Take the first length(current_array) elements from tmp
         Dˆ       Append the result to a global array
           gF¦}   Remove the first elements from tmp
               }  End for
                ¯ Display the global array

ลองออนไลน์!

ฉันกำลังรอโซลูชัน 05AB1E หรือ 2 ที่สามารถใช้งานได้โดยไม่ต้องติดตั้ง / ขึ้นรูปในตัวฉันยังไม่รู้ :)


1

APL, 35 ไบต์

ฉันเพิ่งจะเต้น Perl ก็ต้องมีสิ่งที่ฉันหายไป

{Z[?⍨⍴Z]⊂⍨(⍳⍴Z←∊⍵)∊⊃¨{⍵+⊃⌽⍺}\⍳¨⍴¨⍵}

เช่น:

      {Z[?⍨⍴Z]⊂⍨(⍳⍴Z←∊⍵)∊⊃¨{⍵+⊃⌽⍺}\⍳¨⍴¨⍵}(1 2 3)(,4)(9 10)
┌──────┬─┬───┐
│10 3 2│1│9 4│
└──────┴─┴───┘

คำอธิบาย:

  • ค้นหาดัชนีที่สอดคล้องกันของการเริ่มต้นของอาร์เรย์ย่อยในอาเรย์แบบแบน:
    • ⍳¨⍴¨⍵: สำหรับแต่ละแถวย่อยให้รับรายการดัชนี
    • {⍵+⊃⌽⍺}\: เริ่มต้นด้วยอาร์เรย์ย่อยแรกเพิ่มค่าสุดท้ายในอาร์เรย์ให้กับแต่ละค่าในอาร์เรย์ถัดไป
    • ⊃¨: รับไอเท็มแรกของอาร์เรย์ซึ่งเป็นตำแหน่งเริ่มต้น
    • (⍳⍴Z←∊⍵)∊: Zเก็บอาร์เรย์บี้ใน สร้างบิตเวกเตอร์โดยที่คนทำเครื่องหมายสถานที่ที่ควรจะเริ่มอาร์เรย์ย่อย
  • สับเปลี่ยนอาเรย์แบบแบน:
    • ?⍨⍴Z: Zสร้างการเปลี่ยนแปลงแบบสุ่มของ
    • Z[... ]: Zเปลี่ยนรูป
  • ⊂⍨: แยกการเรียงสับเปลี่ยนในอาร์เรย์ย่อยตามบิต - เวกเตอร์

1
คุณสามารถทำการแทนที่ได้ การมอบหมายให้คุณแผ่ตัวแปร:A⊣(∊A)←(∊A)[?⍨≢∊A←⎕]
กำหนด

@ Adám: ว้าวฉันไม่รู้ว่าคุณทำได้ มีรายการฟังก์ชันใดบ้างที่สามารถทำได้?
marinus

1
ใช่แล้ว และมันก็ใช้ได้กับการบ้านที่ถูกดัดแปลงด้วย
อดัม

1

Pyth, 15 ไบต์

tPc.SsQ.u+NlYQ0

โปรแกรมที่รับอินพุตจากรายการและพิมพ์ผลลัพธ์

ชุดทดสอบ

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

tPc.SsQ.u+NlYQ0  Program. Input: Q
       .u    Q0  (1) Reduce Q with starting value 0, returning all results:
         +        Add
          N       the current value
           lY     to the length of the next element of Q
     sQ          Flatten Q
   .S            (2) Randomly shuffle
  c              Chop (1) at every location in (2)
tP               Discard the first and last elements
                 Implicitly print

1

PHP , 105 ไบต์

$m=array_merge(...$i=$_GET[i]);shuffle($m);foreach($i as$v)$o[]=array_splice($m,0,count($v));print_r($o);

ลดลงไป 105 user59178ไบต์ต้องขอบคุณ

คำตอบเดิม:

PHP , 132 ไบต์

$i=$_GET['i'];$m=call_user_func_array('array_merge',$i);shuffle($m);foreach($i as$v){$o[]=array_splice($m,0,count($v));}print_r($o);

$m=array_merge(...$i=$_GET[i]);สั้นกว่า 25 ไบต์$i=$_GET['i'];$m=call_user_func_array('array_merge',$i);และทำสิ่งเดียวกัน นอกจากนี้คุณสามารถดร็อป{}หลังforeachเพื่อบันทึกอีก 2 ไบต์
user59178

1

ทุบตี, 63, 58 ไบต์

การแก้ไข:

  • เพิ่มประสิทธิภาพนิพจน์sedบิต -5 ไบต์

บันทึก:

ทุบตีไม่ได้โดดสนับสนุนอาร์เรย์หลายมิติ (พวกเขาเท่านั้นที่สามารถจำลองบางส่วน) ดังนั้นแทนที่จะโปรแกรมนี้จะยอมรับ "ต่อเนื่อง" การแสดงข้อความของอาร์เรย์ที่ขรุขระเป็นที่ปรากฎในคำอธิบายงานเช่น: [[1,2,3],[4],[9,10]]และให้เอาท์พุท ในรูปแบบเดียวกัน

แข็งแรงเล่นกอล์ฟ

printf `sed 's/\w\+/%d/g'<<<$1` `grep -Po '\d+'<<<$1|shuf`

ทดสอบ

>./shuffle []
[]

>./shuffle [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
[11,12,9,5,3,6,1,15,14,2,13,7,10,8,4]

>./shuffle [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
[9,15,11,10,7,6,1,14,2,3,12,5,4,13,8]

>./shuffle [[1,2,3],[4],[9,10]]
[[10,2,4],[9],[3,1]]

>./shuffle [[1,2,3],[4],[9,10]]
[[3,4,1],[10],[2,9]]

โบนัสที่ดีคือคุณสามารถป้อนอาเรย์ที่มีความทนทานตามระดับความลึกได้:

./shuffle [[1,[2,[3,[99,101]]],[4],[9,10]]
[[9,[4,[1,[101,2]]],[10],[3,99]]

และมันจะยังคงทำงานได้อย่างถูกต้อง

ลองออนไลน์!




0

Java, 368 ไบต์

interface Z{int w(int i);default Z m(int n,int s){return i->w(i)+i>=n?s:0;}static int[][]f(int[][]r){int L=0,o=0,x,d,e=0;Z u=i->0,v=i->i;for(int[]a:r){d=a.length;L+=d;u=u.m(L,1);v=v.m(L,-d);}int[]c=new int[L];for(;e<L;)c[e++]=(int)(L*Math.random());for(int[]a:r){for(x=0;x<a.length;){d=c[x+o];e=v.w(d);d=u.w(d);L=a[x];a[x++]=r[d][e];r[d][e]=L;}o+=a.length;}return r;}}

วิธีstatic int[][] f( int[][] r ){...}แก้ความท้าทาย ตัดสินใจที่จะม้วนส่วนต่อประสานการทำงานของฉันเองเพื่อหลีกเลี่ยงการนำเข้าและเพิ่มในวิธีการเริ่มต้นเพื่อความสะดวกในการใช้งาน

interface Z{ //define my own functional interface instead of importing

  int w(int i);

  //return a new lambda
  //where w(int i) adds the value s
  //to the result when i is greater than n
  default Z m(int n,int s){
      return i->w(i)+i>=n?s:0;
  }

  static int[][]f(int[][]r){
      int L=0,o=0,x,d,e=0;
      Z u=i->0, //lambda to convert a flattened index to the input's first dimension index
        v=i->i; //lambda to convert a flattened index to the input's second dimension index
      for(int[]a:r){
          d=a.length;
          L+=d; //running total of the lengths
          u=u.m(L,1); //increment the 1st conversion by 1 at every array length
          v=v.m(L,-d); //decrement the 2nd conversion by the array length after that length
      }
      int[]c=new int[L]; //will contain flattened index swapping positions
      for(;e<L;) //randomize the swap positions
          c[e++]=(int)(L*Math.random());
      for(int[]a:r){ //swap the elements from the input
          for(x=0;x<a.length;){
              d=c[x+o]; //flattened swap index
              e=v.w(d); //convert swap index to 2nd dimension index
              d=u.w(d); //convert swap index to 1st dimension index
              L=a[x];
              a[x++]=r[d][e];
              r[d][e]=L;
          }
          o+=a.length; //increment offset for flattened index array
      }
      return r;
  }

}

0

Mathematica, 67 ไบต์

ReplacePart[#,Thread[RandomSample@Position[#,_Integer]->Union@@#]]&

คำอธิบาย: สิ่งนี้จะสับเปลี่ยนรายการตำแหน่งของจำนวนเต็มทั้งหมดในอาร์เรย์ ragged 2D Union@@สั้นสำหรับFlatten@

หมายเหตุ: ไก่เขี่ยวงเล็บจะถูกนำมาใช้แทนวงเล็บ{}[]

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