การใช้สแต็ก


44

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

ท้าทาย

งานของคุณคือการใช้สแต็กที่อนุญาตให้มีการกดและ popping ตัวเลขทดสอบการใช้งานและทำให้ I / O ง่ายเราจะใช้การตั้งค่าต่อไปนี้:

  • ข้อมูลที่ป้อนจะเป็นรายการจำนวนเต็มที่ไม่เป็นลบ

ทุกจำนวนเต็มบวกบ่งชี้และทุกบ่งชี้ว่า - ทิ้งองค์ประกอบด้านบนpush ( n ) 0 ป๊อป ()npush(n)0pop()

  • เอาต์พุตจะเป็นสแต็กที่เกิดขึ้น

ตัวอย่าง

ตัวอย่างเช่นถ้าเราได้รับ :[12,3,0,101,11,1,0,0,14,0,28]

12[12]3[3,12]0[12]101[101,12]11[11,101,12]1[1,11,101,12]0[11,101,12]0[101,12]14[14,101,12]0[101,12]28[28,101,12]

ผลลัพธ์จะเป็น:[28,101,12]

กฎระเบียบ

  • อินพุตจะเป็นรายการของจำนวนเต็มไม่เป็นลบในรูปแบบ I / O เริ่มต้นใด ๆ
    • คุณอาจใช้จำนวนเต็มลบเพื่อบอกถึงจุดสิ้นสุดของจำนวนเต็ม
  • เอาต์พุตจะเป็นรายการ / เมทริกซ์ / .. ของสแต็กที่เกิดขึ้น
    • ตัวเลือกของคุณที่องค์ประกอบด้านบนจะเป็น (ที่จุดเริ่มต้นหรือจุดสิ้นสุด) ผลลัพธ์ก็จะต้องสอดคล้องกัน
    • การส่งออกมีความยืดหยุ่น (เช่นจำนวนเต็มคั่นด้วยเส้นใหม่จะดี) สิ่งเดียวที่มีความสำคัญคือการสั่งซื้อ
    • คุณอาจใช้จำนวนเต็มลบเพื่อระบุด้านล่างของสแต็ก
  • คุณรับประกันได้ว่าจะไม่มีเมื่อสแต็กว่างเปล่า0

ตัวอย่าง

[] -> []
[1] -> [1]
[1,0,2] -> [2]
[4,0,1,12] -> [12,1]
[8,3,1,2,3] -> [3,2,1,3,8]
[1,3,7,0,0,0] -> []
[13,0,13,10,1,0,1005,5,0,0,0] -> [13]
[12,3,0,101,11,1,0,0,14,0,28] -> [28,101,12]

12
ควรสังเกตว่าตามเงื่อนไขแล้วไม่จำเป็นต้องใช้สแต็ก
Jeff Zeitlin

หากคุณต้องการให้ใครสักคนนำกองซ้อนมาใช้จริงคุณอาจต้องลองใส่บางสิ่งลงในกล่องทราย
mbomb007

@ mbomb007: ทั้งสองจะได้รับอนุญาต: "คุณเลือกที่องค์ประกอบด้านบนจะเป็น (ที่จุดเริ่มต้นหรือจุดสิ้นสุด)"
ბიმო

@ mbomb007: มันจะไม่ยากอีกต่อไปหากคุณต้องย้อนกลับอินพุตใช่มั้ย นอกจากนี้หากคุณพิจารณาว่าการตั้งค่าเป็นสแต็กที่กำหนดว่าอะไรคือด้านบนและด้านล่างคืออะไรและทำไมหนึ่งคำจำกัดความนั้นควรมีความตั้งใจน้อยกว่า?
ბიმო

@ OMᗺเนื่องจากอินพุตดูเหมือนเป็นสแต็ก / ลิสต์ / อาร์เรย์ ทีนี้ความท้าทายทั้งหมดก็คือลบหมายเลขใด ๆ ตามด้วยศูนย์
mbomb007

คำตอบ:


19

MATL , 6 ไบต์

"@?@}x

อินพุตเป็นเวกเตอร์แถวของตัวเลข

สแต็กสุดท้ายแสดงกลับหัวโดยมีองค์ประกอบล่าสุดอยู่ด้านล่าง

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

คำอธิบาย

"         % For each element in the input (implicit)
  @       %   Push current element
  ?       %   If non-zero (this consumes the current element)
    @     %     Push current element again
  }       %   Else
    x     %     Delete most recent element
          %   End (implicit)
          % End (implicit)
          % Display (implicit)

13

Java (JDK 10) , 42 ไบต์

เนื่องจาก "[the] เอาต์พุตมีความยืดหยุ่น [... ] สิ่งเดียวที่สำคัญคือลำดับ" สิ่งนี้จะเปลี่ยนอาร์เรย์อินพุตเป็น0อาร์เรย์ที่สิ้นสุด ตัวอย่าง: [1,0,2]จะกลับมา[2,0,2]ซึ่งก็คือการถูกตีความว่าเป็น=[2,0,2][2]

a->{int s=0;for(int v:a)a[v>0?s++:--s]=v;}

ลองออนไลน์!

รุ่นก่อนหน้า:

Java (JDK 10) , 60 ไบต์

l->{for(int i;(i=l.indexOf(0))>0;l.remove(i))l.remove(--i);}

ลองออนไลน์!

เครดิต:

ถ้าฉันสามารถจบโปรแกรมด้วยข้อผิดพลาด: 55 ไบต์

(แม้ว่าทุกอย่างจะถูกแก้ไขอย่างถูกต้อง)

l->{for(int i;;l.remove(--i))l.remove(i=l.indexOf(0));}

ลองออนไลน์!


4
มันค่อนข้างน่าประทับใจ คุณจะสูญเสีย 1 ไบต์โดยใช้>0เนื่องจากมีไม่เคยจะเป็นศูนย์ที่จุดเริ่มต้นของรายการ (ที่จะบ่งบอกถึงด้านบนของสแต็คที่-1)
OOBalance

@OOBalance แน่นอนฉันไม่ได้คิดอย่างนั้นขอบคุณ!
Olivier Grégoire

12

Sed, 17 ไบต์

:;s/[0-9]\+,0//;t

-3 ไบต์ต้องขอบคุณ @ OMᗺ, -1 ต้องขอบคุณ @eggyal

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

รับอินพุตจาก stdin เช่น:

echo '[12,3,0,101,11,1,0,0,14,0,28]' | sed ':;s/[0-9]\+,0,//;t'

ส่งออกสแต็กในสิ่งที่ตรงกันข้าม:

[12,101,28]

อาจมีขนาดเล็กลงสองไบต์หากท้องถิ่นของฉันsedมีความเข้าใจในคลาสตัวละครเช่น\dแต่ไม่ได้ด้วยเหตุผลบางประการ


1
ยินดีต้อนรับสู่ PPCG! ดีฉันใช้เวลานานขึ้น (ใช้รูปแบบอินพุตที่แตกต่างกัน) คุณสามารถใช้ป้ายกำกับที่ว่างเปล่าเนื่องจากคุณใช้เพียง 1 และเมื่อคุณวนซ้ำกระบวนการที่gซ้ำซ้อน - ประหยัด 4 ไบต์: ลองออนไลน์!
ბიმო

g ไม่ซ้ำซ้อน! มันทำให้ความซับซ้อนของ runtime case ที่เลวร้ายที่สุดนั้นขึ้นอยู่กับความลึกของ pops ตามลำดับแทนที่จะเป็นจำนวน pops! ไม่ว่าประสิทธิภาพที่สำคัญในสนามกอล์ฟรหัส :)
Tacroy

1
ประโยคสุดท้ายของคุณตอบคำถามเกี่ยวกับความซ้ำซ้อน: P Btw คุณนับจำนวนไบต์ได้อย่างไร ฉันได้ 18 คุณอาจจะรวมบรรทัดใหม่ตอนท้ายหรืออะไรบางอย่าง
ბიმო

ใช่มันเป็นบรรทัดใหม่
Tacroy

1
หากองค์ประกอบสุดท้ายของการป้อนข้อมูลเป็น 0 แล้วมันจะไม่ได้รับการจับคู่โดย regex ของคุณ
eggyal

12

PowerShell , 46 41 40 ไบต์

$args|%{$x,$a=&({1,$_+$a},{$a})[!$_]};$a

ลองออนไลน์!

รับอินพุตผ่านการกระจายตัวอย่างเช่น$z=@(12,3,0,101,11,1,0,0,14,0,28); .\implement-stack.ps1 @zบน TIO ที่แสดงรายการเป็นอาร์กิวเมนต์ที่แยกกัน

$args|%{$x,$a=&({1,$_+$a},{$a})[!$_]};$a    # Full program
$args                                       # Take input via splatting
     |%{                            };      # Loop through each item
              &(              )[!$_]        # Pseudo-ternary, if input is 0 this is 1
        $x,$a=            {$a}              # ... which will pop the first item into $x
           $a=  { ,$_+$a}                   # Else, we append the first item
        $x   =   1                          # ... and drop a dummy value into $x
                                      $a    # Leave $a on pipeline; implicit output

-5 ไบต์ต้องขอบคุณเขาวงกต
-1 ไบต์สลับ$_เป็น1


การเปิดบันทึกย่อเป็น 3 ไบต์$agrsหรือไม่ :)
mazzy

-2 ไบต์$args|%{$x,$a=&({$_,$_+$a},{$a})[!$_]};$a?
mazzy

1
@ mazzy ใช่แล้วเราเพิ่งพูดคุยเกี่ยวกับการปะทะ! ฉันลืมไปแล้ว! ขอบคุณมาก!
AdmBorkBork

จะไม่ทำเครื่องหมาย.\implement-stack.ps1 @z(ไม่ใช่$z) มิฉะนั้นคุณจะผ่านอาร์เรย์เป็นอาร์กิวเมนต์แรก / อย่างเดียวเท่านั้น
pinkfloydx33

@ pinkfloydx33 ใช่แล้ว สะกดผิดในส่วนของฉัน
AdmBorkBork

11

C (gcc) , 62 60 56 55 ไบต์

-2 -6 bytes ขอบคุณl4m2

-1 ไบต์ขอบคุณที่ceilingcat

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

r;f(int*l){~*l?f(l+1),*l?r?r--:printf("%d ",*l):r++:0;}

ลองออนไลน์!


f(l)int*l;=> f(int*l)?
l4m2

@ l4m2 โอ้โห! น่าจะเป็นเศษเล็กเศษน้อยจากวันก่อนหน้านี้ตัวแปรภาระหนักมากขึ้น
Gastropner

r=0ดูเหมือนว่าไร้ประโยชน์
l4m2

@ l4m2 ใช่แล้วจับได้ดี
Gastropner

10

Haskell, 28 ไบต์

foldl(#)[]
(_:s)#0=s
s#n=n:s

ลองออนไลน์!


ชื่อฟังก์ชั่นหลักเป็นอย่างไร? ฉันไม่รู้วิธีเรียกใช้)
ЕвгенийНовиков

@ ЕвгенийНовиков: ดูลิงก์ "ลองใช้งานออนไลน์" เพื่อดูตัวอย่างวิธีการเรียกใช้รหัส
nimi

10

R , 45 ไบต์

o={};for(e in scan())o="if"(e,c(e,o),o[-1]);o

ลองออนไลน์!

  • -4 ไบต์ขอบคุณ @Giuseppe

1
48 bytes - การทารุณกรรมFจะนำคุณไปยัง 48 bytes แต่นี่สะอาดกว่า imho
Giuseppe

ฉันไม่รู้ว่าฉันคิดถึงการผกผันของ if-else: facepalm: ... ขอบคุณ!
digEmAll


1
A R+pryrและReduceทางออกคือ44 ไบต์
JayCe

@ JayCe: ตามจริงแล้วฉันชอบที่จะให้มันเป็น "base-R" ทางออก ... แต่อย่าลังเลที่จะโพสต์มันเป็นคำตอบของคุณเอง! ;)
digEmAll


9

เยลลี่ 6 ไบต์

ṣ0Ṗ;¥/

ลองออนไลน์!

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

ṣ0Ṗ;¥/  Main link. Argument: A (array)

ṣ0      Split A at zeroes.
    ¥/  Left-reduce the resulting 2D array by this dyadic chain:
  Ṗ       Pop; discard the last element of the left argument.
   ;      Concatenate the result with the right argument.

สิ่งนี้จะเลียนแบบสาม pops หรือไม่ถ้ามีสามศูนย์ติดต่อกัน
WGroleau

ใช่. [1,3,7,0,0,0]เช่นได้รับการแบ่งออก[[1,3,7],[],[],[]]และแต่ละขั้นตอนของป๊อปลดซ้ายในองค์ประกอบของอาร์เรย์ซ้าย
เดนนิส

9

Brain-Flak , 40 36 ไบต์

([]){{}{({}<>)<>}([]){{}<>}{}([])}<>

ลองออนไลน์!

ขอบคุณ @Nitrodon สำหรับ -4 ไบต์

เนื่องจาก Brain-Flak ใช้สแต็คอยู่แล้วนี่เป็นปริศนาที่ดีสำหรับ Brain-Flak

([]){   while items on stack
    {}      pop stack count
    {       if top element is non-zero
        ({}<>)<> push it on the other stack
    }
    if we're here the stack is either empty or there's a 0 on the stack

    ([])    so, count the stack again
    {{}<>{}<>} if there are items left on the stack, pop the stack count and the last item of the other stack
    {} pop the zero or the stack count
    ([]) count the stack again for next round
}
<>  go to the output stack

2
ในกรณีพิเศษนี้{{}<>{}<>}สามารถตัดให้สั้นลง{{}<>}ได้
Nitrodon

@Nitrodon ขอบคุณ คุณอธิบายได้ไหมว่าทำไมสิ่งนี้ถึงยังใช้งานได้ มันไม่สลับกลับไปที่สแต็กอินพุตในลูป
Dorian

1
ด้านบนของสแต็กเอาท์พุทรับประกันว่าจะไม่เป็นศูนย์ดังนั้นลูปที่สั้นลงจะเรียกใช้งาน 0 หรือ 2 ครั้ง
Nitrodon

8

ภาษา Wolfram (Mathematica)ขนาด 28 ไบต์

#//.{a___,b_,0,c___}:>{a,c}&

ลองออนไลน์!


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

@ user202729 อ๋อ การจับคู่รูปแบบของ Mathematica นั้นไม่ใช่ความโลภดังนั้นจึงพยายามจับคู่ที่สั้นที่สุดa___ก่อน ReplaceList[#, {a___, b_, 0, c___} :> {a, c}] &หนึ่งสามารถเห็นว่าการพยายาม ในบันทึกที่เกี่ยวข้องStringReplaceเป็นจริงโลภดังนั้นการส่งนี้จะไม่ทำงานกับStringReplace(แบบเช่นa___~~b_~~"0"~~c___)
JungHwan Min

8

Python 2 , 48 ไบต์

s=[]
for x in input():s=([x]+s)[2*0**x:]
print s

ลองออนไลน์!


มีโอกาสใดที่คุณสามารถอธิบายได้ว่ามันทำงานอย่างไร? ฉันพยายามที่จะออกกำลังกายในช่วงครึ่งชั่วโมงหลัง! แน่นอน2*0**xจะเป็นไปได้0เสมอ เห็นได้ชัดว่าฉันขาดอะไรไป
ElPedro

1
@ElPedro มันไม่ใช่ศูนย์เมื่อx=0ซึ่งในกรณีนี้คือ 2
xnor

อาฉันเห็นสิ่งที่คุณหมายถึง เดาฉันดูยากเกินไปและหายไปชัดเจน! ขอบคุณและคำตอบที่ดี
ElPedro

7

ช่องว่าง , 89 ไบต์

[N
S S N
_Create_Label_LOOP_1][S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve][S N
S _Duplicate_input][N
T   T   S 
_If_neg_Jump_to_Label_EXIT][S N
S _Duplicate_input][N
T   S T N
_If_0_Jump_to_Label_DROP][N
S N
N
_Jump_to_Label_LOOP_1][N
S S S N
_Create_Label_EXIT][S N
N
_Discard_top][N
S S S S N
_Create_Label_LOOP_2][T N
S T _Print_as_integer][S S S T  S T S N
_Push_10_newline][T N
S S _Print_as_character][N
S T S S N
_Jump_to_Label_LOOP_2][N
S S T   N
_Create_Label_DROP][S N
N
_Discard_top][S N
N
_Discard_top][N
S N
N
_Jump_to_Label_LOOP_1]

เพิ่มตัวอักษรS(ช่องว่าง), T(แท็บ) และN(บรรทัดใหม่) เป็นการเน้นเท่านั้น
[..._some_action]เพิ่มเป็นคำอธิบายเท่านั้น

นำรายการบรรทัดใหม่ที่คั่นด้วยด้วย-1เพื่อระบุว่าเราทำกับอินพุต

ลองมันออนไลน์

คำอธิบายในรหัสเทียม:

Start LOOP_1:
  Integer i = STDIN as integer
  If(i is negative):
    Call function EXIT
  If(i is 0):
    Call function DROP
  Go to next iteration of LOOP_1

function EXIT:
  Start LOOP_2:
    Pop and print top as integer
    Print newline
    Go to next iteration of LOOP_2

function DROP:
  Drop the top of the stack
  Go to next iteration of LOOP_1

7

Python 2 , 60 59 57 56 ไบต์

l=input()
while 0in l:i=l.index(0);l[i-1:i+1]=[]
print l

ลองออนไลน์!


ที่บันทึกไว้:

  • -1 ไบต์ขอบคุณพุชกิน

คุณสามารถบันทึกไบต์โดยการลบช่องว่างระหว่าง0และin
pushkin

2
ขอแสดงความยินดีกับ 10K
ElPedro

6

JavaScript ขนาด 40 ไบต์

เอาต์พุตในลำดับกลับกัน

a=>a.map(x=>x?o.push(x):o.pop(),o=[])&&o

ลองออนไลน์

1 ไบต์บันทึกขอบคุณที่เฮอร์แมน L


a=>a.map(x=>x?o.push(x):o.pop(),o=[])&&oสั้นลงหนึ่งไบต์
เฮอร์แมน L

@HermanL: D'oh! แน่นอนมันเป็น! ขอบคุณ ใช้(un)shiftก่อนที่ฉันจะเห็นเอาต์พุตที่สามารถย้อนกลับได้
Shaggy

ใช้งานได้เนื่องจากoมีการอ้างอิงในการติดต่อกลับหลังจากที่กำหนดไว้ในอาร์กิวเมนต์ที่สอง
MattH

6

05AB1E , 9 ไบต์

vy>i¨ëy)˜

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

คำอธิบาย:

v        # For-each of the items in the input-list:
 y>i     #  If the current item is 0:
  ¨      #   Pop the top item of the list
 ë       #  Else:
  y      #   Push the current item to the stack
   )     #   Wrap the entire stack into a list
         #    i.e. 12 → [12]
         #    i.e. [12] and 3 → [[12], 3]
    ˜    #   Flatten the stack
         #    i.e. [[12], 3] → [12, 3]
         # (and output the list implicitly after the loop)

ทางเลือก9 ไบต์ :

vy_i\ëy])

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

คำอธิบาย:

v        # For-each of the items in the input-list:
 y_i     #  If the current item is 0:
  \      #   Discard top item of the stack
 ë       #  Else:
  y      #   Push the current item to the stack
]        # Close both the if-else and for-each (short for `}}`)
 )       # Wrap the entire stack into a list (and output implicitly)

PS: ถ้าผลลัพธ์ควรย้อนกลับเพื่อให้ตรงกับกรณีทดสอบในคำอธิบายการท้าทายเราสามารถเพิ่มการต่อท้ายRไปยังรุ่นที่สอง (ดังนั้น10 ไบต์ ) ซึ่งกลับรายการ ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด


5

เรติน่า 0.8.2 , 18 ไบต์

^
,
+1`,\d+,0

^,

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

^
,

,คำนำหน้าเป็นพิเศษ

+1`,\d+,0

ประมวลผลการดำเนินงานทั้งหมดของป๊อป

^,

ลบ,หากยังคงมี

การย้อนกลับของตัวเลขจะมีค่าใช้จ่ายเพิ่ม 8 ไบต์:

O^$`\d+

ซึ่งเพียงแค่แทนที่<number>, 0รายการย่อยทั้งหมดโดยไม่มีอะไร
user202729




5

V , 10 ไบต์

ò/ 0⏎b2dw0

ลองออนไลน์!

คำอธิบาย

ò           " run the following, until an error occurs
 / 0⏎       " | goto next zero with space in front (errors if none)
     b      " | jump one word back (to the beginning of element to pop)
      2     " | twice (element & zero itself)
       dw   " | | delete word
         0  " | goto beginning of line

เทียบเท่าในVim , 16 ไบต์

qq/ 0⏎b2dw0@qq@q

ลองออนไลน์!

คำอธิบาย

ค่อนข้างเหมือนกันยกเว้นการบันทึกแมโครqและเรียกซ้ำ:

qq                " record macro q
  / 0⏎b2dw0       " same as in V
           @q     " recursively call q (aborts on error)
             q    " quit recording
              @q  " execute the macro q

5

Java 10, 75 72 ไบต์

n->{var s="";for(int i:n)s=(s+","+i).replaceAll(",\\d+,0","");return s;}

เอาต์พุตคั่นด้วยเครื่องหมายจุลภาค ด้านบนของสแต็คสุดท้าย ลองออนไลน์ได้ที่นี่

ขอบคุณOlivier Grégoireสำหรับการเล่นกอล์ฟขนาด 2 ไบต์

กรุณาตรวจสอบคำตอบ Java ของKevin CruijssenและOlivier Grégoireด้วย พวกเขาใช้วิธีการแบบรายการแทนโดยการตีอย่างหลังด้วยอัตรากำไรที่เป็นระเบียบ

Ungolfed:

n -> { // lambda taking an integer array as argument and returning a String
    var s = ""; // we'll be using a String to implement and output the stack
    for(int i : n) // loop through the array
        s = (s + "," + i) // append the next number
               .replaceAll(",\\d+,0", ""); // remove any number followed by a zero
    return s; // output the resulting stack
}

วิธีการที่ดีกับสตริง ดีกว่าวิธีที่ไร้เดียงสาของฉันด้วยStack-object จริง +1 จากฉัน
Kevin Cruijssen

1
n->{var s="";for(int i:n)s=(s+","+i).replaceAll(",\\d+,0$","");return s;}(73 ไบต์) แต่ใส่,ตัวเลขก่อนหน้าไม่ใช่หลังจาก
Olivier Grégoire

1
n->{var s=""+n;for(int x:n)s=s.replaceFirst("\\d+, 0,? ?","");return s;}(72 bytes) ใช้รายการแทนอาร์เรย์และ messes กับเอาต์พุตเนื่องจากสามารถส่งคืนสิ่งต่าง ๆ เช่น "[, 2]"
Olivier Grégoire

@ OlivierGrégoire Nice เราสามารถวาง$เพื่อบันทึกไบต์เพิ่มเติมเนื่องจากแต่ละรายการที่0เราเพิ่มจะถูกลบออกทันที
OOBalance

@ OlivierGrégoireแนวทางที่สองของคุณน่าสนใจเช่นกัน แต่ฉันคิดว่ารูปแบบผลลัพธ์ที่ไม่สอดคล้องกันอาจทำให้โซลูชันไม่ถูกต้อง
OOBalance


5

Perl 5 -p , 17 ไบต์

ขอบคุณ @Sundar และ @DomHastings

s/\d+ 0 ?//&&redo

ลองออนไลน์!


1
-2 ไบต์ (พร้อมเอาต์พุต mankier เล็กน้อย): ลองออนไลน์!
sundar

นอกจากความคิดเห็นของ @ sundar แล้วการทำให้เข้าใจง่ายขึ้นอีกเล็กน้อย: ลองออนไลน์!
Dom Hastings

นั่นไม่ได้ล้มเหลวถ้ามีตัวเลขอย่าง 0942 อินพุต?
Xcali

1
คุณสามารถสรุปได้อย่างปลอดภัยว่าจะไม่มีศูนย์นำหน้า
OOBalance

5

> <> , 25 ไบต์

i:?\~~
(0:/:^?
!?l:!<oan;

ลองออนไลน์! (ข้อมูลจะต้องเขียนใน ascii มิฉะนั้นใช้สิ่งนี้ )

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

i:?\~~ตรวจสอบ 0, ยังคง~~ลบรายการก่อนหน้า มิฉะนั้นลงไปที่:

(0:/:^? ซึ่งจะตรวจสอบหา -1 (ไม่มีอินพุตเพิ่มเติม) จากนั้นตัดคำเพื่อลบ -1 และลูป:

!?l:!<oan; ซึ่งส่งออกแต่ละหมายเลขด้วยการขึ้นบรรทัดใหม่จากนั้นจะสิ้นสุดเมื่อสแต็กเปล่า



5

Husk , 6 ไบต์

เนื่องจากยังไม่มีคำตอบจาก Husk และฉันชอบเล่นกอล์ฟ lang:

F`?:tø

ลองออนไลน์!

คำอธิบาย

F`?:tø  --
F    ø  -- foldl (reduce) with [] as the initial accumulator
 `      -- | flip arguments of
  ?:    -- | | if truthy: apply cons (prepend) to it
    t   -- | | else: return tail
        -- | : returns a function, either prepending the element or dropping 1 element

โซลูชันทางเลือก 6 ไบต์

แทนที่จะพลิกเราสามารถย้อนกลับรายการแล้วใช้การพับขวา: Ḟ?:tø↔


5

brainfuck , 214 150 ไบต์

>>,[>++++++[-<-------->]+<[>+++++[-<++++++++>]]>[-<<<[[-]<],[-]>>>>-<<]>>+[<<+<,----------[++++++++++>-]>[->>-<]>[->+<]>]<<<,]<<[[<]++++++++++<]>>[.>]

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

ลองออนไลน์!

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

Stack format:
0 (0 \d*)*


>>,[
    Setup digit == '0' conditional
    >++++++
    [-<-------->]
    +
    <[
        Read digit != '0'
        Restore the char code
        cond1 is already 1 at this stage
        >+++++
        [-<++++++++>]
    ]>[
        Read digit == '0'
        -
        Pop previous value
        <<<[
            [-]<
        ]
        Skip next input (assumed to be newline)
        ,[-]
        Skip following loop by unsetting loop flag
        >>>>-
        <<
    ]

    Move to next stack frame
    >
    Set loop flag
    >+[
        Set bit used for conditional
        <<+
        Read next character
        <,
        Compare with '\n'
        ----------[
            Not '\n': restore the char code
            ++++++++++

            >-
        ]>[
            -
            == '\n': Leave as 0
            Unset loop flag
            >>-
            <
        ]

        Copy loop flag along
        >
        [- > + <]

        Move to loop flag of next stack frame
        >
    ]

    <<<
,]


Fill in with newlines
<<[
    Skip to the cell before this value
    [<]
    Put a newline in there
    ++++++++++
    Move to next value
    <
]

Now the tape has the exact values we need to output
>>[.>]

5

Brachylogขนาด 21 ไบต์

~c₃Ckt[İ,0]≠∧C⟨hct⟩↰|

ลองออนไลน์!

-1 ไบต์และที่สำคัญกว่านี้ให้ความรู้สึกเหมือนเป็นวิธีที่น้อยมากในการทำเช่นนี้

~c₃                     % Partition the input into 3 subarrays
   C                    % Call that array-of-arrays C
    kt[İ,0]             % Its second element should be of the form [Integer, 0]
           ≠            % And its elements shouldn't be equal (i.e. 
                        %   the Integer shouldn't be 0)
            ∧C⟨hct⟩     % Then, remove that [İ, 0] element from C
                   ↰    % And call this predicate recursively
                    |   % When the above fails (when it can't find a partition with 
                        %  [İ, 0] in it), then just output the input

สำรอง 21 byter: ∋0∧ℕ₁;0;P↺c;Qc?∧P,Q↰| ลองออนไลน์!


รหัสเก่า:

22 ไบต์

∋0&b,1;?z{=|¬∋0&}ˢtᵐ↰|

ลองออนไลน์!

∋0           If input contains a 0, 
&b           Remove input's first element, getting list of "next" elements
,1           Append 1 to that to handle last element
;?z          Zip that with input
{      }ˢ    Select only zipped pairs where
 =|          both elements are equal (to keep 0s followed by 0s)
   ¬∋0&      or the pair doesn't contain a 0
             this removes both the (pairs containing the) value
              that is followed by a 0, and the 0 itself
tᵐ           Recover back the (filtered) input array elements from the zip
↰            Call this predicate recursively 
|            If input contains no 0s, input is the output 

5

คำเตือน: มีหลายบรรทัดที่ตามมา คุณได้รับการเตือน


CJam , 17 ไบต์

โค้ดที่อันตรายที่สุด
(สมมติว่าองค์ประกอบสแต็กสามารถคั่นด้วยช่องว่างในเอาต์พุตและอาเรย์อินพุตสามารถเป็นรูปแบบใดก็ได้ที่เราต้องการ)

q~{X0={;}X?}fX]S*

ลองออนไลน์!

คำอธิบาย

q                                    Reads input string
 ~                                   Instantly convert to array since the string is in the CJam format
  {        }fX                       For loop
   X0=                               If X (the array element currently being checked) is equal to 0
      {;}                            Pop the top element from the stack
         X                           Else push X onto the top of the stack
          ?                          If-Else flag
              ]                      Collate all stack elements into an array
               S*                    Put a space between each array element

รหัสสำรอง # 1, 27 ไบต์
(สมมติว่าองค์ประกอบสแต็กจะต้องส่งออกในรูปแบบที่แสดงในคำถามและว่าอาร์เรย์อินพุตสามารถเป็นรูปแบบอะไรก็ได้ที่เราต้องการ)

q~{X0={;}X?}fX]',S+*'[\+']+

ลองออนไลน์!

คำอธิบาย

q                                    Reads input string
 ~                                   Instantly convert to array since the string is in the CJam format
  {        }fX                       For loop
   X0=                               If X (the array element currently being checked) is equal to 0
      {;}                            Pop the top element from the stack
         X                           Else push X onto the top of the stack
          ?                          If-Else flag
              ]                      Collate stack items into an array
               ',S+                  Add together a comma and a space to create a delimiter
                   *                 Apply the delimiter to the stack
                    '[\+             Append left bracket to the left of the stack text
                        ']+          Append right bracket to the right of the stack text

รหัสสำรอง # 2, 24 ไบต์
(สมมติว่าองค์ประกอบสแต็กสามารถเรียงในเอาต์พุตและอาร์เรย์อินพุตต้องอยู่ในรูปแบบที่แน่นอนที่แสดงในคำถาม)

q',/~]S*~{X0={;}X?}fX]S*

ลองออนไลน์!

คำอธิบาย

q                        Read input string
 ',/                     Separate by commas (since commas are an invalid array delimiter in CJam)
    ~                    Turn string into an array of substrings that make up the array
     ]S*                 Add spaces in between input numbers to prevent collation in the array
        ~                Turn the string into a valid array representative of the original
         {        }fX    For loop
          X0=            If X (the array element currently being checked) is equal to 0
             {;}         Pop the top element from the stack
                X        Else push X onto the top of the stack
                 ?       If-Else flag
                     ]   Collate all stack elements into an array
                      S* Add a space between each element

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

q',/~]S*~{X0={;}X?}fX]',S+*'[\+']+

ลองออนไลน์!

คำอธิบาย

q                                      Read input string
 ',/                                   Separate by commas (since commas are an invalid array delimiter in CJam)
    ~                                  Turn string into an array of substrings that make up the array
     ]S*                               Add spaces in between input numbers to prevent collation in the array
        ~                              Turn the string into a valid array representative of the original
         {        }fX                  For loop
          X0=                          If X (the array element currently being checked) is equal to 0
             {;}                       Pop the top element from the stack
                X                      Else push X onto the top of the stack
                 ?                     If-Else flag
                     ]                 Collate stack items into an array
                      ',S+             Add together a comma and a space to create a delimiter
                          *            Apply the delimiter to the stack
                           '[\+        Append left bracket to the left of the stack text
                               ']+     Append right bracket to the right of the stack text

ขอขอบคุณ@Jo King ที่ชี้ให้เห็นว่าสิ่งที่มีเอาต์พุตที่ตรวจสอบแล้วนั้นไม่ถูกต้องเนื่องจากสิ่งต่าง ๆ เช่น[12]และ[1,2]จะแยกไม่ออก

ขอขอบคุณ@Jo King ที่มอบทางเลือกที่เหมาะสมมากให้กับเอาต์พุตแบบเรียงหน้าและตัด 9 ไบต์!


1
คนแรกคือไม่ถูกต้องเนื่องจากคุณไม่สามารถบอกความแตกต่างระหว่างและ[12] [1,2]อย่างไรก็ตามรุ่น 27 ไบต์ดูเหมือนว่าไม่เป็นไร แต่คุณสามารถกำจัดช่องว่างและวงเล็บขนาด 18 ไบต์ได้
Jo King

โอ้แน่นอนฉันเป็นใบ้มากขอบคุณ
เฮเลน

อย่างไรก็ตามมันอาจจะเป็นเรื่องยากมากกว่าที่จะแยกตัวเลขด้วยช่องว่างแทนที่จะใช้เครื่องหมายจุลภาคเนื่องจากช่องว่างใช้]S*(3) ในขณะที่ใช้เครื่องหมายจุลภาค]',*(4)
เฮเลน

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