ผู้สืบทอดช่วงกลับด้าน


21

รับจำนวนเต็มบวกnทำต่อไปนี้ (และส่งออกทุกขั้นตอน):

  1. เริ่มต้นด้วยรายการที่มีสำเนาของnn
  2. ทำnครั้งต่อไปนี้:
  3. ที่iขั้นตอนที่ค่อย ๆ ลดiรายการ th ของรายการจนกว่าจะถึงi

ดังนั้นสำหรับตัวอย่างเช่นถ้ากำหนดnเป็น4แล้วคุณจะเริ่มต้นด้วย[4,4,4,4]และจากนั้นในขั้นตอนแรกคุณมี[3,4,4,4], ,[2,4,4,4] [1,4,4,4]ในขั้นตอนที่สองคุณมี,[1,3,4,4] ในขั้นตอนที่สามคุณมี[1,2,4,4] [1,2,3,4]ไม่มีสิ่งใดทำในขั้นตอนที่สี่

[[4,4,4,4],[3,4,4,4],[2,4,4,4],[1,4,4,4],[1,3,4,4],[1,2,4,4],[1,2,3,4]]ดังนั้นการส่งออกของคุณ


อนุญาตรูปแบบอินพุต / เอาท์พุตที่สมเหตุสมผล


ช่องโหว่มาตรฐานใช้ นี่คือ : คำตอบที่มีจำนวนไบต์น้อยที่สุดชนะ


การดำเนินงานหลามเพื่อวัตถุประสงค์ในการตรวจสอบ


1
คุณอาจต้องการระบุอย่างชัดเจนว่าith มีการจัดทำดัชนี 1 เสมอ
Kevin Cruijssen

เราต้องจัดการกับอาร์เรย์จริงๆเหรอ? ฉันจะได้คำตอบที่สั้นกว่าโดยไม่ต้องจัดการอาเรย์ใด ๆ เพื่อสร้างเอาต์พุตที่ยอมรับได้
Olivier Grégoire

2
@ OlivierGrégoireคุณไม่ต้องทำตามขั้นตอนคุณเพียงแค่สร้างผลลัพธ์ในรูปแบบที่เหมาะสม (กล่าวคือไปข้างหน้า)
แม่ชีที่รั่ว

คำตอบ:


6

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

r€⁸Œp»\QṚ

ลองออนไลน์!

อย่างไร?

r€⁸Œp»\QṚ - Link: integer, N    e.g. 4
 €        - for €ach of implicit range of N (i.e. for i in [1,2,3,...N])
  ⁸       -   with the chain's left argument, N on the right:
r         -     inclusive range (for i<=N this yields [i, i+1, ..., N]
          - ...leaving us with a list of lists like the post-fixes of [1,2,3,....,N]
          -                     e.g. [[1,2,3,4],[2,3,4],[3,4],[4]]
   Œp     - Cartesian product* of these N lists
          -                     e.g. [[1,2,3,4],[1,2,4,4],[1,3,3,4],[1,3,4,4],[1,4,3,4],[1,4,4,4],[2,2,3,4],[2,2,4,4],[2,3,3,4],[2,3,4,4],[2,4,3,4],[2,4,4,4],[3,2,3,4],[3,2,4,4],[3,3,3,4],[3,3,4,4],[3,4,3,4],[3,4,4,4],[4,2,3,4],[4,2,4,4],[4,3,3,4],[4,3,4,4],[4,4,3,4],[4,4,4,4]]
      \   - cumulative reduce with:
     »    -   maximum (vectorises)
          -                     e.g. [[1,2,3,4],[1,2,4,4],[1,3,4,4],[1,3,4,4],[1,4,4,4],[1,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]
       Q  - de-duplicate        e.g. [[1,2,3,4],[1,2,4,4],[1,3,4,4],[1,4,4,4],[2,4,4,4],[3,4,4,4],[4,4,4,4]]
        Ṛ - reverse             e.g. [[4,4,4,4],[3,4,4,4],[2,4,4,4],[1,4,4,4],[1,3,4,4],[1,2,4,4],[1,2,3,4]]

* อาจเป็นการง่ายกว่าที่จะเห็นสิ่งที่เกิดขึ้นกับผลิตภัณฑ์คาร์ทีเซียนที่ใช้ด้านบนโดยมีอินพุตอื่น:

the Cartesian product of [[0,1,2],[3,4],[5]]
is [[0,3,5],[0,4,5],[1,3,5],[1,4,5],[2,3,5],[2,4,5]]

คุณเก่งกว่าคนที่ไม่สามารถก้าวร้าวได้
Leun Nun

5

R , 83 82 74 ไบต์

N=rep(n<-scan(),n);while({print(N);any(K<-N>1:n)})N[x]=N[x<-which(K)[1]]-1

ลองออนไลน์!

แทนที่จะเป็น double-for-loop แบบwhileวนซ้ำก็เพียงพอแล้ว: เราค้นหาดัชนีแรกที่รายการมีค่ามากกว่าดัชนีและลดลงที่นั่น

KมีTRUEทุกที่N[i]>i, ผลตอบแทนดัชนีความจริงและเราใช้เวลาครั้งแรกกับwhich(K)[1]




2

APL + WIN, 54 ไบต์

แสดงพร้อมต์สำหรับอินพุตหน้าจอของจำนวนเต็ม

((⍴m)⍴n)-+⍀m←0⍪(-0,+\⌽⍳n-1)⊖((+/+/m),n)↑m←⊖(⍳n)∘.>⍳n←⎕

เอาต์พุตเมทริกซ์ที่มีแต่ละแถวแสดงผลลัพธ์ของแต่ละขั้นตอนเช่นสำหรับ 4:

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

2

เยลลี่ 11 ไบต์

x`’Jḟḣ1Ʋ¦ÐĿ

ลองออนไลน์!

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

x`’Jḟḣ1Ʋ¦ÐĿ  Main link. Argument: n

x`           Repeat self; yield an array of n copies of n.
         ÐĿ  While the results are unique, repeatedly call the link to the left.
             Return the array of all unique results, including the initial value.
  ’     ¦      Decrement the return value at all indices specified by the chain
               in between.
       Ʋ         Combine the four links to the left into a monadic chain.
   J               Indices; yield [1, ..., n].
    ḟ              Filterfalse; remove all indices that belong to the return value.
     ḣ1            Head 1; truncate the result to length 1.

2

Python 3 , 91 ไบต์

n=int(input())
x=[n]*n;print(x)
for i in range(n):
    for j in[0]*(n-i-1):x[i]-=1;print(x)

ลองออนไลน์!


1 ช่องว่างก็เพียงพอที่จะเยื้องรหัสในหลาม การลบช่องว่างที่ไม่จำเป็นออกและเปลี่ยนไปใช้ python 2 ช่วยประหยัด 10 ไบต์: ลองดูสิ
Dead Possum

@DeadPossum แม้ว่าฉันจะรู้ว่าฉันสามารถทำได้ดีกว่าใน Python 2 แต่ในไม่ช้ามันก็จะล้าสมัยดังนั้นฉันจึงต้องการฝึกทักษะ Python 3 ของฉันให้มากที่สุด
Dat

2

Java (OpenJDK 8) , 135 ไบต์

a->{int r[]=new int[a],i=0;java.util.Arrays x=null;x.fill(r,a);for(r[0]++;i<a;r[i++]++)for(;--r[i]>i;System.out.print(x.toString(r)));}

ลองออนไลน์!

คำอธิบาย:

int r[]=new int[a],i=0;    //Initialize array and loop counter
java.util.Arrays x=null;    //reduces the number of of “Arrays” needed from 3 to 1
x.fill(r,a);    //Sets each value in array length n to int n
for(r[0]++;i<a;r[i++]++)    //Increment everything!
  for(;--r[i]>i;    //If decremented array element is larger than element number:
     System.out.print(x.toString(r)));}    //Print the array

เครดิต:

-8 ไบต์ขอบคุณJonathan Frech !

-16 ไบต์ขอบคุณKevin Cruijssen !

-1 ไบต์ต้องขอบคุณOkx !


4
import java.util.*;เป็นส่วนหนึ่งของไบต์นับฉันกลัว และ @ รหัส JonathanFrech สามารถแข็งแรงเล่นกอล์ฟโดย 4 ไบต์มากขึ้นโดยการวาง,i=0หลังr[]และการเปลี่ยนแปลงไป<-~a <=a( ลองออนไลน์144 ไบต์ ) (และฉันเปลี่ยน~-iเป็นi-1เพื่อให้อ่านง่ายขึ้น .. )
Kevin Cruijssen

1
139 ไบต์โดยการกำจัดimport java.util.*;โดยการใช้java.util.Arrays x=null;และและx.fill x.toString(หมายเหตุว่าการแก้ปัญหาในปัจจุบันของคุณเป็น 155 ไบต์กับที่จำเป็นimport java.util.*;.)
เควิน Cruijssen

1
กอล์ฟไบต์โดยใช้มากกว่าfor(;r[i-1]>i; for(;r[i-1]!=i;
Okx

2
@KevinCruijssen ไบต์อีกจะถูกบันทึกไว้โดยการเล่นกอล์ฟไป++i<=a i++<a
Jonathan Frech

1
อีก -2 for(r[0]++;i<a;r[i++]++)for(;--r[i]>i;System.out.print(x.toString(r)));ไบต์เปลี่ยนแปลงส่วนสุดท้ายที่จะ :) ลองออนไลน์135 ไบต์
Kevin Cruijssen

2

Haskell, 69 67 65 63 ไบต์

นิยามแบบเรียกซ้ำ:

f 0=[[]]
f a=map(:(a<$[2..a]))[a,a-1..2]++[1:map(+1)x|x<-f$a-1]

ขอบคุณ Laikoni 2 ไบต์!


อย่างที่สองmapคือสั้นลงสองไบต์พร้อมกับความเข้าใจในรายการ: ลองออนไลน์!
Laikoni

2

PHP, 153 ไบต์

ลองออนไลน์!

รหัส

function f($n){
$a=array_fill(0,$n,$n);$r=json_encode($a)."\n";$p=0;while($p<$n)
{if($a[$p]!=$p+1){$a[$p]--;$r.=json_encode($a)."\n";}else{$p++;}}echo$r;}

จะพยายามลดจำนวนไบต์หรือทำฟังก์ชันเรียกซ้ำให้เสร็จ

คำอธิบาย

function f($n){
  $a=array_fill(0,$n,$n);          #start with $nlength array filled with $n
  $r=json_encode($a)."\n";         #pushed to the string to output
  $p=0;                            #first position
  while($p<$n){                    #on position $n ($n-1) we do nothing
    if($a[$p]!=$p+1){              #comparing the position+1 to the value
     $a[$p]--;                     #it gets decreased by 1
     $r.= json_encode($a)."\n";    #and pushed
   } else {
     $p++;                       #when position+1 = the value,
   }                               #position is changed ++
  }
   echo $r;
  }

ดูเหมือนว่าคุณมีช่องว่างที่ไม่จำเป็นดังนั้นควรเป็น153 ไบต์ - โปรดทราบว่าฉันไม่รู้ PHP
Giuseppe

อ๋อเพิ่งรู้ขอขอบคุณแก้ไขตอนนี้
Francisco Hahn





1

เรติน่า 49 ไบต์

.+
*
_
$`_,$= 
.{*\`_+,(_+)
$.1
0`(\b(_+),\2)_
$1

ลองออนไลน์! คำอธิบาย:

.+
*

แปลงอินพุตเป็น unary

_
$`_,$= 

สร้างรายการสำเนา n i,nโดยที่iดัชนีของสำเนาอยู่ที่ไหน

.

อย่าพิมพ์อะไรเลย (เมื่อลูปเสร็จสิ้น)

{

วนซ้ำจนกว่ารูปแบบจะไม่เปลี่ยนแปลง

*\`_+,(_+)
$.1

ลบis และแปลงns เป็นทศนิยมและเอาท์พุทชั่วคราว

0`(\b(_+),\2)_
$1

ใช้รายการแรกที่มีค่าเกินดัชนีและลดค่าลง


1

Python 3 , 70 67 65 ไบต์

def f(n):
 k=0;a=[n]*n
 while k<n-1:print(a);k+=a[k]==k+1;a[k]-=1

ลองออนไลน์!

  • (67) การแปลงเป็นฟังก์ชัน: -3 ไบต์
  • (65) การลบวงเล็บที่ไม่จำเป็น: -2 ไบต์

เวอร์ชันที่ไม่ถูกปรับแต่ง:

def f(n):
    k = 0
    a = [n] * n             # create n-item list with all n's
    while k < n - 1:        # iterate through columns 0..n-1
        print(a)            # print whole list
        if a[k] == k + 1:   # move to the next column when current item reaches k+1
            k += 1
        a[k] -= 1           # decrement current item

0

C (เสียงดังกราว) , 131 141 ไบต์

i,j,k,m[99];p(){for(k=0;m[k];printf("%d ",m[k++]));puts("");}f(n){for(j=k=m[n]=0;k<n;m[k++]=n);p();for(;j<n;j++)for(i=1;i++<n-j;m[j]--,p());}

ลองออนไลน์!

สิ่งนี้จะใช้ได้กับทั้งหมดnไม่เกิน 99 TIO จะตัดทอนเอาต์พุต มันสามารถรองรับขนาดใหญ่ขึ้นโดยพลการnโดยการเปลี่ยนขนาดของอาเรย์mตามที่หน่วยความจำอนุญาต


การติดตามถูก จำกัด ไว้ที่ n = 1..9 แต่สั้นกว่ามาก

C (เสียงดังกราว) , 89 92 ไบต์

i,j;char m[12];f(n){j=!puts(memset(m,n+48,n));for(;j<n;j++)for(i=1;i++<n-j;m[j]--,puts(m));}

ลองออนไลน์!

อัปเดต: แก้ไขเพื่อหลีกเลี่ยงการพึ่งพาการกำหนดค่าเริ่มต้นคงที่


คุณstatic/global initialization because multiple test casesไม่ได้รับอนุญาตเนื่องจากฟังก์ชั่นจะต้องสามารถโทรได้มากกว่าหนึ่งครั้ง
Jonathan Frech

@Jonathan อัพเดตคำตอบแล้ว ฉันสงสัยอยู่เสมอว่าควรอนุญาตหรือไม่และตัดสินใจไม่ได้
GPS

1
นี่คือเมตาโพสต์ที่เกี่ยวข้อง: codegolf.meta.stackexchange.com/a/4940/73111
Jonathan Frech

คุณสามารถกอล์ฟm[j]--,p()ไปp(m[j]--)และบันทึกไบต์
Jonathan Frech


0

Clojure 132 ไบต์

#(loop[R[(vec(repeat % %))]j(- % 2)i 0](if(> i j)R(recur(conj R(update(last R)i dec))(if(= i j)(- % 2)(dec j))(if(= i j)(inc i)i))))

ฉันหวังว่ามันจะสั้นกว่านี้ ...

stateful น้อยลง แต่นานกว่าที่141 bytes:

#(apply map list(for[i(range %)](concat(repeat(nth(cons 0(reductions +(reverse(range %))))i)%)(range % i -1)(if(>(dec %)i)(repeat(inc i))))))

0

Python 3, 101 ไบต์

def f(n):
 p=print;m=[n for_ in range(n)];p(m)
 for i in range(n):
    while m[i]>1+i:m[i]-=1;p(m)

ฉันอาจตีกอล์ฟได้มากขึ้นด้วยการพิมพ์ แต่ฉันไม่อยู่ที่คอมพิวเตอร์และไม่แน่ใจว่ากฎของงูหลาม 2 ในการตั้งค่าตัวแปรในการพิมพ์ ฉันจะอัปเดตในภายหลังเมื่อไปถึงคอมพิวเตอร์หรือถ้ามีคนชี้แจงในความคิดเห็น


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