ลำดับซ้อนกัน


29

คุณแจกไพ่ที่มีป้ายกำกับ 0 ถึง 9 จากเด็คหนึ่งครั้งสร้างสแต็คที่เริ่มต้นที่ 0 และนับได้ 1

  • เมื่อคุณแจก 0 คุณวางมันลงบนโต๊ะเพื่อเริ่มกองซ้อนใหม่
  • เมื่อคุณจัดการการ์ดอื่น ๆ คุณจะวางการ์ดบนการ์ดที่มีมูลค่าลดลงหนึ่งใบ หากไม่มีการ์ดดังกล่าวแสดงว่าเด็คไม่สามารถซ้อนกันได้

ได้รับสำรับตรวจสอบว่ามันสามารถซ้อนกันเมื่อดำเนินการตามคำสั่งที่ได้รับ ให้ลิสต์ของตัวเลขตัดสินใจว่าจะแบ่งพาร์ติชันออกเป็นส่วน ๆ แต่ละชุดของฟอร์มได้หรือไม่0,1,..,k

ตัวอย่าง

0012312425ใช้ดาดฟ้า ไพ่สองใบแรกคือ0ดังนั้นพวกเขาไปบนโต๊ะ:

Stacks: 00

  Deck: 12312425

ต่อไปเราจัดการ1ซึ่งต่อไป0ไม่สำคัญว่า:

        1
Stacks: 00

  Deck: 2312425

จากนั้นเราจัดการ2บนยอดที่เพิ่งวาง1และ3ด้านบนของมัน

        3
        2
        1
Stacks: 00

  Deck: 12425

ถัดไป1, 2และวางไว้บนกองแรกและ4บนยอดหนึ่งวินาที

        4
        3
        22
        11
Stacks: 00

  Deck: 25

ตอนนี้เราต้องวาง a 2แต่ไม่มี1atop ซ้อนกัน ดังนั้นเด็คนี้จึงไม่สามารถวางซ้อนกันได้

อินพุต:รายการที่ไม่ใช่ตัวเลข 0-9 หรือสตริงที่ไม่ใช่ตัวเลข คุณไม่สามารถสรุปได้ว่า 0 จะอยู่ในอินพุตเสมอ

เอาท์พุท : หนึ่งในสองค่าที่สอดคล้องกันที่แตกต่างกันอย่างใดอย่างหนึ่งสำหรับลำดับซ้อนได้และหนึ่งสำหรับค่าที่ไม่วางซ้อนกันได้

กรณีทดสอบ:

วางซ้อนกันได้:

0
01
01234
00011122234567890
012031
0120304511627328390

ไม่สามารถวางซ้อนกันได้:

1
021
0001111
0012312425
012301210
000112223

เพื่อความสะดวกเป็นรายการ:

[0]
[0, 1]
[0, 1, 2, 3, 4]
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[0, 1, 2, 0, 3, 1]
[0, 1, 2, 0, 3, 0, 4, 5, 1, 1, 6, 2, 7, 3, 2, 8, 3, 9, 0]

[1]
[0, 2, 1]
[0, 0, 0, 1, 1, 1, 1]
[0, 0, 1, 2, 3, 1, 2, 4, 2, 5]
[0, 1, 2, 3, 0, 1, 2, 1, 0]
[0, 0, 0, 1, 1, 2, 2, 2, 3]

จัดกลุ่ม:

[[0], [0, 1], [0, 1, 2, 3, 4], [0, 0, 0, 1, 1, 1, 2, 2, 2, 3], [0, 1, 2, 0, 3, 1], [0, 1, 2, 0, 3, 0, 4, 5, 1, 1, 6, 2, 7, 3, 2, 8, 3, 9, 0]]
[[1], [0, 2, 1], [0, 0, 0, 1, 1, 1, 1], [0, 0, 1, 2, 3, 1, 2, 4, 2, 5]]

ลีดเดอร์บอร์ด:


เราสามารถจำกัดความยาวของรายการได้หรือไม่?
orlp

@orlp ไม่มีข้อ จำกัด ที่ชัดเจน
xnor

@ xnor เขาอาจขอให้ปรับการเขียนint a[99]ใน C
Leaky Nun

@LuisMendo คุณอาจจะพูดว่า "nonempty"
xnor

@xnor Ah ขอโทษฉันไม่เห็นว่า อาร์เรย์สามารถใช้ 1 หรือไม่? นั่นคือตัวเลขตั้งแต่110
Luis Mendo

คำตอบ:



6

Haskell , 55 ไบต์

Boolฟังก์ชั่นที่ไม่ระบุชื่อการรายการของจำนวนเต็มและกลับมาเป็น

การใช้งาน: (all(<1).foldr(?)[]) [0,1,2,3,4].

all(<1).foldr(?)[]
m?l|(p,r)<-span(/=m+1)l=m:p++drop 1r

ลองออนไลน์!

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

  • foldr(?)[]พับอาร์กิวเมนต์ของรายการจากขวาไปซ้ายโดยใช้?เริ่มต้นด้วยรายการที่ว่างเปล่า ผลลัพธ์คือรายการตัวเลขในรายการที่ไม่พอดีกับตัวเลขก่อนหน้า
  • all(<1) ทดสอบว่าตัวเลขเพียงตัวเดียวที่ไม่เหมาะสมด้านบนของตัวเลขก่อนหน้าคือเลขศูนย์
  • m?lใส่ตัวเลขmในรายการlหมายเลขที่ไม่เหมาะสม ถ้ามีอยู่แล้วในรายการก็สามารถตอนนี้ถูกลบออกมันเหมาะกับด้านบนของ m+1m
    • (p,r)<-span(/=m+1)lแยกรายการlออกเป็นสองส่วนpและที่ตัวอย่างแรกของจำนวนr m+1หากไม่มีส่วนที่rถูกต้องจะว่างเปล่า
    • m:p++drop 1rprepends mไปยังส่วนที่แยก ถ้าrเป็นว่างแล้วมันต้องเริ่มต้นด้วยซึ่งจะถูกลบออกโดยm+1drop 1

ความคิดที่ดีในการทำซ้อนกันในสิ่งที่ตรงกันข้าม! ฉันพยายามขยายการ?เรียกซ้ำของคุณแต่มีความยาวเท่ากัน
xnor

54 ไบต์ด้วยData.List.delete
H.PWiz

5

Husk , 9 ไบต์

Λ¬ḞS:o-→ø

ลองออนไลน์!

ส่งคืน1สำหรับสำรับแบบเรียงซ้อนและ0สำหรับสำรับแบบเรียงซ้อนไม่ได้

ดูเหมือนว่าØrjan Johansen ในคำตอบของ Haskell ของเขาเกิดขึ้นแล้วด้วยอัลกอริทึมเดียวกัน แต่ใน Husk นี้ชัดเจนกว่ามาก

คำอธิบาย

เราจัดการปัญหาจากอีกด้านหนึ่ง: พลิกดาดฟ้าและสร้างเสาเข็มลง หากหลังจากผ่านดาดฟ้าทั้งหมดกองทั้งหมดมี 0 ที่ด้านบนดาดฟ้าจะวางซ้อนกันได้

Λ¬ḞS:(-→)ø
         ø    Starting with the empty list (each element of this list will be the top card
              of a stack)
  ḞS          Traverse the input from right to left. For each card:
      -→        Remove the successor of this card from our list (if present)
    :           Add this card to our list
Λ¬            At the end, check if all the cards in our list are zeroes (falsy)


4

C (gcc), 74 73 ไบต์

f(int*l){int s[10]={},r=1;for(;~*l;s[*l++]++)r*=!*l||s[*l-1]--;return r;}

ต้องการอาร์เรย์อินพุตเพื่อทำเครื่องหมายจุดสิ้นสุดด้วย -1 ตัวอย่างการใช้งาน:

int main(int argc, char** argv) {
    int a[] = {0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1};
    printf("%d\n",  f(a));
    return 0;
}

มีอะไรผิดปกติกับธรรมดาreturn r?
Leun Nun

4

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

O$#`(.)(?<=(\1.*?)*)
$#2
.
$*1,
^(,|1\1)+$

ลองออนไลน์!

คำอธิบาย

O$#`(.)(?<=(\1.*?)*)
$#2

การเรียงลำดับตัวเลขนี้มีความเสถียรตามความถี่ที่เกิดขึ้นก่อนหน้านี้ ผลนี้จะรวมเรียงลำดับผู้สมัครต่าง ๆ เข้าด้วยกัน สตริงผลลัพธ์จะมีการเกิดขึ้นครั้งแรกของแต่ละหลักก่อนแล้วจึงเกิดขึ้นที่สองของแต่ละหลักและอื่น ๆ ในอินพุตที่วางซ้อนกันได้ผลลัพธ์จะมีลักษณะคล้ายกับ0123...0123...0123...ที่ซึ่งวัสดุย่อยแต่ละรายการเหล่านี้อาจสิ้นสุดลง ณ จุดใด

เป็นการง่ายที่สุดในการพิจารณาว่าอินพุตมีรูปแบบเช่นนี้หรือไม่

.
$*1,

เราแทนที่แต่ละหลักnด้วยn 1 s ตามด้วยเครื่องหมายจุลภาคเพื่อแยกแต่ละหลัก

^(,|1\1)+$

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


3

TI-Basic (83 series), 25 ไบต์ (49 ตัวอักษร)

:min(seq(min(cumSum(Ans=I)≤cumSum(Ans=I-1)),I,1,9

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

Ansจะเข้าเป็นรายการใน เอาต์พุต1สำหรับอินพุตแบบเรียงซ้อน0มิฉะนั้น

สำหรับแต่ละI, cumSum(Ans=I)คำนวณรายการจำนวนครั้งที่Iเกิดขึ้นในแต่ละกลุ่มเริ่มต้นดังนั้นmin(cumSum(Ans=I)≤cumSum(Ans=I-1))เพียง 1 ถ้าในทุกตำแหน่งที่เราได้เห็นI-1อย่างน้อยหลาย ๆ Iครั้งตาม การแสดงออกโดยรวมก็คือเมื่อใดก็ตามที่นี้ถือสำหรับแต่ละ1I


3

JavaScript (ES6), 61 45 40 ไบต์

รับอินพุตเป็นรายการ

a=>a.every(k=>a[~k]=!k|a[-k]--&&-~a[~k])

กรณีทดสอบ

อย่างไร?

สำหรับแต่ละค่า0 ... 9เราจะติดตามจำนวนสแต็คที่มีอยู่ด้วยการ์ดก่อนหน้านี้ ตัวนับเหล่านี้ถูกเก็บไว้ใน[-9]ถึง[0]โดยที่[]เป็นอาร์เรย์อินพุตดั้งเดิม ตัวนับเดียวที่ชนกับข้อมูลอินพุตคือ[0]แต่เราไม่สนใจเรื่องนี้เพราะ 1) การ์ดที่มีป้ายกำกับ0ได้รับอนุญาตเสมอและต้องดำเนินการแยกต่างหากและ 2) ค่าอินพุตa [0] ]ถูกประมวลผลก่อนที่จะมีโอกาสได้รับการอัปเดต

a => a.every(k =>  // given the input array a, for each card k in a:
  a[~k] =          // the card is valid if:
    !k |           //   - it's a 0 or
    a[-k]-- &&     //   - there's at least one stack with the card k-1 atop
    -~a[~k]        // in which case we allow a new card k+1 and go on with the next card
)                  // otherwise, every() fails immediately

คุณเร็วกว่าฉัน: o
Leun Nun

@LeakyNun คุณต้องไป 20 นาที ... ;)
Arnauld

2

MATL , 16 ไบต์

0*GQ"@yQy=f1)(]a

อินพุตคืออาร์เรย์ของตัวเลข

โค้ดเอาต์พุต1ใน STDOUT ถ้าอินพุตเป็น stackable หรือออกโดยมีข้อผิดพลาดและเอาต์พุตว่างใน STDOUT หากอินพุตไม่สามารถวางซ้อนกันได้

ลองออนไลน์!





2

R , 88 ไบต์

function(d){s={}
for(e in d)if(!e)s=c(s,0)else{k=match(e,s+1)
if(is.na(k))T=F
s[k]=e}
T}

ลองออนไลน์!

ฟังก์ชั่นที่รับเวกเตอร์ R ส่งคืนTRUEสำหรับ stackable และFALSEunstackable

คำอธิบาย:

function(d){
 s <- {}              # initialize the stacks as empty
 for(e in d){         # iterate over the deck
  if(!e)              # if e is zero
   s <- c(s,0)        # start a new stack
  else {              # otherwise
   k <- match(e,s+1)  # find where e should go in s, NA if not there
   if(is.na(k))       # if no match (unstackable)
    T <- F            # set T to F (False)
   s[k] <- e          # set s[k] to e
  }
 T                    # return the value of T, which is TRUE by default and only gets changed in the loop to F.
}

2

Nim, 133 ไบต์

proc s(d:seq[int]):int=
 var
  t= @[0]
  r=1
 for c in d:(t.add(0);var f=0;for i,s in t.pairs:(if s==c:(t[i]=c+1;f=1;break));r*=f)
 r

1ถ้ามันใช้งานได้; 0ถ้าไม่

ต้องดึงธุรกิจที่ขี้ขลาดบางอย่างมาจัดการกับความผันแปรของตัวแปรในวงวนได้ดี


1

Haskell , 77 75 ไบต์

import Data.List
g[]=1<3
g(x:r)|s<-r\\[x-1]=g r&&(x<1||s/=r&&g s)
g.reverse

ลองออนไลน์! การใช้งาน: g.reverse $ [0,1,2]. ส่งคืนTrueสำหรับอินพุตที่เรียงซ้อนได้และFalseอย่างอื่น

นี่เป็นโซลูชันแบบเรียกซ้ำซึ่งลัดไปตามรายการที่กำหนดจากหลังไปข้างหน้า มันดำเนินการสังเกตว่า

  • รายการที่ว่างเปล่าสามารถวางซ้อนกันได้
  • รายการที่ไม่ว่างพร้อมคำนำหน้าrและองค์ประกอบสุดท้ายxสามารถวางซ้อนกันได้หากrวางซ้อนกันและอาจxเป็นศูนย์หรือทั้งคู่x-1ปรากฏในrและrพร้อมx-1ลบออกก็สามารถวางซ้อนกันได้

1

Java 8, 168 150 142 ไบต์

a->{int x[]=new int[a.length],s=0,i;a:for(int n:a){if(n<1){s++;continue;}for(i=0;i<s;i++)if(x[i]==n-1){x[i]=n;continue a;}return 0;}return 1;}

ผลตอบแทน0/ 1ไม่ว่าจะวางซ้อนกันได้อย่างถูกต้องหรือไม่

คำอธิบาย:

ลองที่นี่

a->{                         // Method with integer-array parameter and integer return-type
  int x[]=new int[a.length], //  Array for the stacks, (max) size equal to input-size
      s=0,                   //  Amount of stacks, starting at 0
      i;                     //  Index integer
  a:for(int n:a){            //  Loop (1) over the input
    if(n<1){                 //   If the current item is a zero:
      s++;                   //    Increase amount of stacks `s` by 1
      continue;}             //    And go to the next iteration
    for(i=0;i<s;i++)         //   Inner loop (2) over the stacks
      if(x[i]==n-1){         //    If a top item of a stack equals the current item - 1:
        x[i]=n;              //     Set this item in the stacks-array
        continue a;}         //     And go to the next iteration of loop (1)
    return 0;                //   If we haven't encountered a `continue`, return 0
  }                          //  End of loop (1)
  return 1;                  //  Return 1 if we were able to correctly stack everything
}                            // End of method

1

C, 248 ไบต์

หมายเหตุ: หากต้องการพิมพ์สถานะการคืนสินค้าให้พิมพ์ "echo $ status" ลงในเทอร์มินัล

สถานะการส่งคืน 0: ไม่สามารถวางซ้อนกันได้

สถานะการส่งคืน 1: วางซ้อนกันได้

คำอธิบาย: เพิ่มองค์ประกอบอาร์เรย์ที่มีดัชนีเทียบเท่ากับตัวเลขที่เป็นตัวเลขมากที่สุดในสแต็ก จากนั้นโปรแกรมจะตรวจสอบว่าองค์ประกอบอาร์เรย์ที่เพิ่งเพิ่มขึ้นนี้มีขนาดใหญ่กว่าองค์ประกอบที่อยู่ก่อนหน้าหรือไม่ ถ้าเป็นเช่นนั้นจะส่งกลับ 0 หากโปรแกรมทำให้ส่วนท้ายของอาร์เรย์ส่งคืน 1

 main(int argc, char ** argv)
{
    static int stack[10];

    while ( *++argv != 0x0 )
    {
        stack[**argv - 0x30]++;

        if ( **argv - 0x30 > 0 )
        {
            if ( stack[**argv - 0x30] > stack[**argv - 0x30 - 1] )
            {
                return 0;
            }

        }

    }   

    return 1;
}

3
ยินดีต้อนรับสู่ Code Golf! รหัสของคุณและจำนวน bytecount ของคุณควรตรงกันดังนั้นโปรดตรวจสอบให้แน่ใจว่าได้ระบุรหัสของคุณในเวอร์ชันกอล์ฟ รุ่น ungolfed เป็นรุ่นเสริม
Stephen

0

เยลลี่ 15 ไบต์

œp@ŒQẎµ0rṀ⁼Qµ¿Ẹ

ลิงก์ monadic ที่รับรายการจำนวนเต็มที่ไม่เป็นลบและส่งคืน0ถ้าวางซ้อนกันได้หรือ1ไม่วางซ้อนกันได้

ลองออนไลน์!

อย่างไร?

œp@ŒQẎµ0rṀ⁼Qµ¿Ẹ - Link: list
             ¿  - while loop:
      µ     µ   - ...condition chain:
       0        -      literal zero
         Ṁ      -      maximum of current list
        r       -      inclusive range = [0,1,2,...,max(list)]
           Q    -      de-duplicate list (unique values in order of appearance)
          ⁼     -      equal?
                - ...do:
   ŒQ           -      distinct sieve (1s at first occurrences 0s elsewhere)
  @             -      use swapped arguments:
œp              -        partition (the list) at truthy values (of the distinct sieve)
     Ẏ          -      tighten (makes the list flat again ready for the next loop)
              Ẹ - any truthy? 1 if the resulting list has any non-zero integers remaining
                -           - effectively isNotEmpty for our purposes since a list of only
                -             zeros gets reduced to an empty list via the loop.

การเคลื่อนไหวของคุณ: P: P
Leun Nun

เฮ้ฉันสงสัยว่าฉันจะชนะ 11 (หรือ 10?!) และต้องนอน: D
Jonathan Allan

0

Japt , 16 ไบต์

£=k_¥T©°T}T=0ÃUd

ทดสอบออนไลน์! เอาต์พุตfalseสำหรับวางtrueซ้อนกันได้

คำอธิบาย

 £   = k_  ¥ T© ° T}T=0Ã Ud
UmX{U=UkZ{Z==T&&++T}T=0} Ud    Ungolfed
                               Implicit: U = input array
UmX{                   }       For each item X in the array:
                    T=0          Set T to 0.
      UkZ{         }             Remove the items Z where
          Z==T&&++T              Z == T (and if so, increment T).
                                 This has the effect of removing the largest stack.
    U=                           Reset U to the result.
                               This process is repeated U.length times, which is
                               evidently enough to handle any U.
                         Ud    Return whether there are any truthy items in U.
                               Any items not part of a stack are non-zero/truthy,
                               so this works for every possible case.

0

05AB1E , 25 ไบต์

ηε[DõQ#ZƒDNåiNõ.;Dëˆ#]¯OĀ

ความท้าทายไม่ได้ดูยากขนาดนั้นทั้งหมด แต่มันค่อนข้างยากใน 05AB1E (สำหรับฉันอย่างน้อย .. )

ส่งออก0ถ้าวางซ้อนกันได้และ1ถ้าไม่วางซ้อนกันได้

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

η             # Prefixes of the (implicit) input
              #  i.e. '012031' → ['0','01','012','0120','01203','012031']
              #  i.e. `021` → ['0','02','021']
 ε            # Map each to:
  [           # Start an infinite inner loop
   D          # Duplicate the current value
    õQ#       # If it's an empty String, stop the infinite loop
   Z          # Get the maximum (without popping)
              #  i.e. '01203' → 3
              #  i.e. '02' → 2
    ƒ         # Inner loop `N` in the range [0,max]
     D        # Duplicate the current value
      Nåi     # If it contains the current digit `N`
              #  i.e. '01203' and 1 → 1 (truthy)
              #  i.e. '02' and 1 → 0 (falsey)
         Nõ.; # Remove the first one (by replacing the first `N` with an empty string)
              #  i.e. '1203' and 1 → '203'
         D    # And duplicate it again for the next iteration of the inner loop
      ë       # Else (does not contain the digit `N`):
       ˆ      # Push `N` to the global stack
        #     # And break the infinite loop
 ]            # Close the if-else, inner loop, infinite loop, and mapping (short for `}}}}`)
  ¯           # Push the global stack
   O          # Take the sum
              #  i.e. [] → 0
              #  i.e. ['2'] → 2
    Ā         # And get the trutified value of that (which we implicitly output as result)
              #  i.e. 0 → 0
              #  i.e. 2 → 1

0

Java 8, 87 ไบต์

แทนที่จะสร้างสแต็คฉันแค่คำนวณว่าองค์ประกอบใดที่ไม่สามารถซ้อนทับได้ในองค์ประกอบก่อนหน้าและส่งคืน 0 เมื่อพบองค์ประกอบที่ไม่สามารถซ้อนทับได้ ถ้าฉันถึงจุดสิ้นสุดสตริงทั้งหมดสามารถวางซ้อนกันได้และส่งคืน 1:

s->{int l[]=new int[10];for(int n:s)if(n!=0&&l[n]>=l[n-1]||l[n]++<0)return 0;return 1;}

ลองออนไลน์!

คำอธิบาย:

s->{
  int l[]=new int[10];                # initialise the counts of each digit encountered prefix of element, all initialised to 0
  for(int n:s)                        # Iterate over all entries in input
    if(n!=0&&l[n]>=l[n-1]||++l[n]<0)  # Check if the element is stackable on the previous elements. Last check is always evaluated and false, but the sideeffect is to add the element to the handled, prefixed element og the next element.  
      return 0;                       # Unstackable
  return 1;                           # No unstackable elements, so the result is stackable
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.