ลบเลขศูนย์นำหน้าและต่อท้าย


31

รับรายการ / อาร์เรย์ที่ไม่ว่างเปล่าที่มีจำนวนเต็มไม่เป็นลบเท่านั้นเช่นนี้

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

เอาท์พุทรายการที่มีศูนย์ต่อท้ายและเลขศูนย์นำออก

ผลลัพธ์สำหรับสิ่งนี้จะเป็น:

[8, 1, 4, 3, 5, 6, 4, 1, 2]

กรณีทดสอบอื่น ๆ :

[0, 4, 1, 2, 0, 1, 2, 4, 0] > [4, 1, 2, 0, 1, 2, 4]
[0, 0, 0, 0, 0, 0] > nothing
[3, 4, 5, 0, 0] > [3, 4, 5]
[6] > [6]

รหัสที่สั้นที่สุดชนะ


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

1
เราสามารถคิดได้หรือไม่ว่าจะมีผู้นำอย่างน้อยหนึ่งคนและหนึ่งต่อท้าย 0?
DJMcMayhem

4
ไม่มีอะไรถือว่า ฉันสามารถนึกถึงสิ่งต่าง ๆ ที่เปลี่ยนแปลงใน Perl 6 Nil ()/ [] slip()/ Empty Any {}บางอย่างไม่ได้กำหนดไว้บางอย่างที่กำหนด แต่เป็นเอกพจน์บางคนที่แอบเข้าไปในรายการอื่น ๆ เช่นที่พวกเขาจะไม่เพิ่มจำนวนองค์ประกอบ (มีหลายรูปแบบที่แตกต่างกันเมื่อAnyมีคลาส / ประเภทและบทบาท)
Brad Gilbert b2gills

7
มันเป็นเรื่องบังเอิญที่ไม่มีจำนวนเต็มเกิน 10 หรือเราจะสมมติว่าตัวเลขทั้งหมดจะเป็นตัวเลขหลักเดียวได้หรือไม่?
Simmons

1
เราสามารถอินพุต / เอาต์พุตรายการเป็นสตริงแบบมีตัวคั่นได้หรือไม่? ตัวอย่างเช่น: "0,4,1,2,0,1,2,4,0" => "4,1,2,0,1,2,4"แก้ไข: เพิ่งสังเกตเห็นว่ามีหลายภาษาที่ทำสิ่งนี้อยู่แล้ว
Mwr247

คำตอบ:


25

เยลลี่ 2 ไบต์

รหัส:

t0

คำอธิบาย:

t   # Trim off...
 0  #  zero at both sides

ลองออนไลน์!


10
มันใช้งานได้? Jeez ฉันคิดว่าคำตอบของ MATL นั้นบ้า
Skyl3r

4
wut y no don do dis jelly
Addison Crump

แน่นอนว่า Jelly ทุกคนจะออกมาที่นั่นเกือบทุกครั้ง ...
Erik the Outgolfer

Jelly ใช้ในธุรกิจจริงหรือไม่?
Chromozorz

ผู้ชายฉันหวังว่าไม่
Caleb Paul

10

JavaScript (ES6) 43

a=>(f=a=>a.reverse().filter(x=>a|=x))(f(a))

น้อย golfed

a=>{
  f=a=>a.reverse().filter(x=>a|=x) // reverse and remove leading 0
  // leverage js cast rules: operator | cast operands to integer
  // an array casted to integer is 0 unless the array is made of
  // a single integer value (that is ok for me in this case)
  return f(f(a)) // apply 2 times
}

ทดสอบ

F=a=>(f=a=>a.reverse().filter(x=>a|=x))(f(a))

function test(){
  var l=(I.value.match(/\d+/g)||[]).map(x=>+x)
  O.textContent=F(l)
}

test()
#I { width:90%}
<input id=I oninput='test()' value='0 0 1 3 7 11 0 8 23 0 0 0'>
<pre id=O></pre>


1
ดี f=(a,r=f(a,a))=>r.reverse().filter(x=>a|=x)ยังเป็น 43 ไบต์
Neil

6

CJam, 13 ไบต์

l~{_{}#>W%}2*

ด้วยอาร์เรย์ที่ป้อนเข้า

รุ่นที่ยาวกว่า:

l~             Puts input on the stack and parse as array
  {       }    Code block
   _           Duplicate the first thing on the stack
    {}#        Finds the index of the first non-0 value in the array, puts it on the stack
       >       Slices the array from that index
        W%     Reverses the array
           2*  Does the code block twice in total

ฉันหวังว่าฉันจะสามารถใช้ความจริงที่ว่าการแปลงไปและกลับจากฐานจะลบศูนย์นำหน้า แต่ดูเหมือนว่าจะนานเกินไป
แยกผลไม้




5

R, 43 ไบต์

function(x)x[cummax(x)&rev(cummax(rev(x)))]

หรือเป็นอ่าน / เขียน STDIN / STDOUT

x=scan();cat(x[cummax(x)&rev(cummax(rev(x)))])

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



4

Mathematica 34 27 ไบต์

#//.{0,a___}|{a___,0}:>{a}&

สิ่งนี้ใช้กฎการเปลี่ยนซ้ำ ๆ จนกระทั่งการกระทำดังกล่าวล้มเหลวในการจัดหาเอาต์พุตใหม่ บันทึกไปแล้ว 7 ไบต์ด้วย Alephalpha

กฎข้อแรกจะลบศูนย์ที่จุดเริ่มต้น กฎข้อที่สองลบศูนย์ในตอนท้ายของอาร์เรย์


3
#//.{0,a___}|{a___,0}:>{a}&
alephalpha


3

Perl, 19 + 1 = 20 ไบต์

s/^(0 ?)+|( 0)+$//g

ต้องใช้-pธง:

$ perl -pE's/^(0 )+|( 0)+$//g' <<< '0 0 0 1 2 3 4 5 6 0 0 0'
1 2 3 4 5 6

@ MartinBüttnerแม้ว่าฉันจะเหมือนกันหลังจากกดปุ่ม [เพิ่มความคิดเห็น] ตอนนี้ฉันแค่ต้องคิดออกตอนนี้เพื่อให้ markdown บันทึกบรรทัดใหม่ของฉันในบล็อกรหัส
andlrc

ผ่านแฮ็ก HTML ที่ชั่วร้าย ;)
Martin Ender

1
17 +1 ไบต์:s/^0 | 0$//&&redo
Kenney

@ เคนนีย์นั่นคือสิ่งที่สวยงาม :-) คุณควรโพสต์สิ่งนั้นเป็นคำตอบ!
andlrc

ขอบคุณ! ต้นฉบับของฉันมีขนาด 19 + 1 ไบต์ แต่จากนั้นฉันเห็นคำตอบของคุณซึ่งทำให้ฉันมีความคิดที่จะกำจัดอีก 2 รายการดังนั้นจึงเป็นของคุณถ้าคุณต้องการ Btw คำตอบของคุณคือ 18 + 1 ถ้าคุณดรอป?ตามตัวอย่าง - แต่นั่นจะไม่ลดลง"0"..
Kenney

3

เยลลี่ 10 ไบต์

Uo\U,o\PTị

นี่ไม่ได้ใช้ builtin

Uo\U            Backward running logical OR
    ,           paired with
     o\         Forward running logical OR
       P        Product
        T       All indices of truthy elements
         ị      Index the input at those values.

ลองมันนี่


3

Perl, 38 ไบต์

$\.=$_}{$\=~s/^(0\n)*|(0\n)*\n$//gs

เรียกใช้ด้วยperl -p(เพิ่ม 3 ไบต์สำหรับ-p)

ยอมรับตัวเลขบน STDIN หนึ่งรายการต่อบรรทัด ปล่อยตัวเลขบน STDOUT หนึ่งตัวต่อบรรทัดตามที่ควรปฏิบัติ

เฉพาะตัวเลขที่แสดงว่า '0' เป็นศูนย์เท่านั้น มันจะเป็นไปได้ที่จะสนับสนุนการเป็นตัวแทนอื่น ๆ ด้วยอีกไม่กี่ไบต์ใน regex

รุ่นที่ยาวกว่ายังคงสามารถเรียกใช้ได้ด้วย-p:

    # append entire line to output record separator
    $\.=$_
}{
    # replace leading and trailng zeroes in output record separator
    $\ =~ s/^(0\n)*|(0\n)*\n$//gs
    # output record separator will be implicitly printed

เวอร์ชันที่ขยายเพิ่มแสดงการโต้ตอบกับแฟล็ก -p:

# implicit while loop added by -p
while (<>) {
    # append line to output record separator
    $\.=$_
}{ # escape the implicit while loop
    # replace leading and traling 
    $\=~s/^(0\n)*|(0\n)*\n$//gs
    # print by default prints $_ followed by
    # the output record separator $\ which contains our answer
    ;print # implicit print added by -p
} # implicit closing brace added by -p

สมมติว่าคุณกำลังทำงานกับperl -Eที่ธงมักจะถูกนับเป็นเพียงหนึ่งไบต์เนื่องจากมีเพียงคนเดียวที่แตกต่างกันไบต์พิเศษระหว่างที่และ-p perl -pE
Chris

3

Elixir, 77 ไบต์

import Enum
z=fn x->x==0 end
reverse(drop_while(reverse(drop_while(l,z)),z))

l คืออาร์เรย์

แก้ไข: วา! การคัดลอก / พาสต้าล้มเหลว แน่นอนหนึ่งต้องนำเข้า Enum ซึ่งจะเพิ่มจำนวนไบต์ด้วย 12 (หรือใช้ Enum.function_name ซึ่งจะทำให้มันยาวขึ้น)


3

Vitsy ขนาด 13 ไบต์

Vitsy ค่อยๆดีขึ้นเรื่อย ๆ ... (ฉันจะมาหาคุณ Jelly ಠ_ಠ)

1mr1m
D)[X1m]

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

คำอธิบาย:

1mr1m
1m      Do the second line of code.
  r     Reverse the stack.
   1m   I'ma let you figure this one out. ;)

D)[X1m]
D       Duplicate the top item of the stack.
 )[   ] If the top item of the stack is zero, do the stuff in brackets.
   X    Remove the top item of the stack.
    1m  Execute the second line of code.

โปรดทราบว่าสิ่งนี้จะส่ง StackOverflowException สำหรับอินพุตขนาดใหญ่อย่างไม่มีเหตุผล

TryItOnline!


2
Vitsy จะได้รับ Jelly ในบางวัน
Conor O'Brien

เพิ่มการจับคู่วงเล็บเหลี่ยมอัตโนมัติใน EOL / EOF
Cyoce

3

R, 39 ไบต์

function(x)x[min(i<-which(x>0)):max(i)]

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



2

Dyalog APL ขนาด 15 ไบต์

{⌽⍵↓⍨+/0=+\⍵}⍣2

               ⍣2     Apply this function twice:
{             }       Monadic function:
           +\⍵        Calculate the running sum.
       +/0=           Compare to zero and sum. Number of leading zeroes.
   ⍵↓⍨               Drop the first that many elements from the array.
 ⌽                   Reverse the result.

ลองมันนี่


แล้วไง{⌽⍵/⍨×+\⍵}⍣2ล่ะ
lstefano

2

Ruby, 49 44 ไบต์

->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}

ขอบคุณที่ทำนาสำหรับการตัด 5 ไบท์ด้วยวิธีที่แตกต่างอย่างสิ้นเชิง!

นี่dropเป็นองค์ประกอบแรกของอาร์เรย์ที่whileเป็น 0 ย้อนกลับอาร์เรย์ทำซ้ำและในที่สุดก็กลับอาร์เรย์เพื่อกลับไปยังลำดับที่ถูกต้อง


อุ๊ยตาย ตอนนี้แม้แต่.drop_while()โซลูชันพื้นฐานก็จะสั้นลง (หากใช้ 2 ฟังก์ชั่น):f=->a{a.drop_while{|i|i<1}.reverse};->a{f[f[a]]}
manatwork

Doh ไม่จำเป็นต้องมี 2 ฟังก์ชั่นเพียงบางส่วนอัปลักษณ์:eval ->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}
จัดการ

@manatwork ไม่แน่ใจว่าทำไมผมไม่ได้คิดว่าการ<1อยู่แล้ว ขอบคุณ!
Doorknob

2

Vim 16 Keystrokes

i<input><esc>?[1-9]<enter>lD0d/<up><enter>

อินพุตจะถูกพิมพ์โดยผู้ใช้ระหว่างiและesc, และไม่นับเป็นการกดแป้น สิ่งนี้อนุมานว่าจะมีอย่างน้อยหนึ่งผู้นำและหนึ่งศูนย์ต่อท้าย หากนั่นไม่ใช่ข้อสันนิษฐานที่ถูกต้องเราสามารถใช้เวอร์ชันที่ยาวกว่านี้เล็กน้อย: (18 Keystrokes)

i <input> <esc>?[1-9]<enter>lD0d/<up><enter>

1
ฉันไม่คิดว่าคุณต้องใส่รหัสเพื่ออนุญาตให้ผู้ใช้ป้อนหมายเลข ( iและ<esc>) ในสนามกอล์ฟนักกอล์ฟเริ่มต้นด้วยอินพุตที่มีอยู่แล้วในไฟล์โหลดบัฟเฟอร์และเคอร์เซอร์ที่มุมซ้ายบน แต่ผู้ใช้ยังต้องบันทึกและออก ( ZZโดยปกติจะเป็นวิธีที่เร็วที่สุด) จากนั้นคุณสามารถทำสิ่งที่ชอบd[1-9]<enter>$NlDZZ(13 การกดแป้น) Note N/ nแทน/<up><enter>
daniero

2

ES6, 51 ไบต์

f=a=>a.map(x=>x?t=++i:f<i++||++f,f=i=0)&&a.slice(f,t)

tถูกตั้งค่าเป็นดัชนีหลังจากค่าที่ไม่เป็นศูนย์ล่าสุดในขณะที่fเพิ่มขึ้นตราบใดที่มีค่าศูนย์เท่าที่เห็น


2

Perl 6 , 23 ไบต์

{.[.grep(?*):k.minmax]}
{.[minmax .grep(?*):k]}

การใช้งาน:

# replace the built-in trim subroutine
# with this one in the current lexical scope
my &trim = {.[.grep(?*):k.minmax]}

say trim [0, 0, 0, 8, 1, 4, 3, 5, 6, 4, 1, 2, 0, 0, 0, 0];
# (8 1 4 3 5 6 4 1 2)
say trim [0, 4, 1, 2, 0, 1, 2, 4, 0];
# (4 1 2 0 1 2 4)
say trim [0, 0, 0, 0, 0, 0];
# ()
say trim [3, 4, 5, 0, 0];
# (3 4 5)
say trim [6];
# (6)


2

JavaScript (ES6), 47 ไบต์

a=>a.join(a="").replace(/(^0+|0+$)/g,a).split(a)

aอาร์เรย์อยู่ที่ไหน


4
a=>a.join(a="")...ฉันคิดว่าคุณต้องการที่จะทำให้ฟังก์ชั่นที่ไม่ระบุชื่อที่จะใช้การป้อนข้อมูล:
andlrc

2
วิธีนี้จะจัดการกับจำนวนเต็มอย่างถูกต้องเมื่อพวกเขาเป็นตัวเลขหลักเดียว
Aross

@ dev-null เรียบร้อยแล้ว
user2428118

ยังคงส่งคืนข้อผิดพลาดสำหรับจำนวนเต็มหลายหลัก จะกลับมา[14] [1, 4]
Mwr247

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


2

JavaScript (ES6), 34 ไบต์

a=>a.replace(/^(0 ?)*|( 0)*$/g,'')

"0 4 1 2 0 1 2 4 0"เข้าและส่งออกในรูปแบบของรายการที่คั่นด้วยช่องว่างเช่น



2

PHP, 56 54 52 ไบต์

ใช้การเข้ารหัส Windows-1252

วิธีการแก้ปัญหาตามสตริง

<?=preg_replace(~ÜÒ×ßÏÖÔƒ×ßÏÖÔÛÜ,"",join($argv,~ß));

ทำงานแบบนี้:

echo '<?=preg_replace(~ÜÒ×ßÏÖÔƒ×ßÏÖÔÛÜ,"",join($argv,~ß));' | php -- 0 0 123 234 0 500 0 0 2>/dev/null;echo

หากเทอร์มินัลของคุณตั้งค่าเป็น UTF-8 สิ่งนี้จะเหมือนกัน:

echo '<?=preg_replace("#-( 0)+|( 0)+$#","",join($argv," "));' | php -- 0 0 123 234 0 500 0 0 2>/dev/null;echo

การปรับแต่ง

  • บันทึก 2 ไบต์ด้วยการปฏิเสธสตริงและวางตัวคั่นสตริง
  • บันทึก 2 ไบต์โดยใช้แท็กพิมพ์แบบสั้น

1
คุณช่วยจัดหาโซลูชั่น ASCII ได้ไหม ไม่มีใครสามารถอ่านสิ่งนี้ได้!
ติตัส

1
@ แน่นอนว่าแน่นอน อย่างไรก็ตามมี esolang ที่อ่านไม่ออกมากมาย .... มันไม่เหมือนคำตอบของฉันที่ไม่รู้สึกเหมือนอยู่บ้าน
aross

อาร์เรย์เป็นพารามิเตอร์แรกของการเข้าร่วม?
JörgHülsermann

1
@ JörgHülsermann Yup มันเป็นเอกสารวิธีอื่น ๆ แต่ยอมรับทั้งคู่
aross

คุณถูกต้องฉันไม่ได้ตระหนักถึงมัน
JörgHülsermann

2

Python 2, 69 67 ไบต์

def f(a):
 for i in(0,-1):
  while a and a[i]==0:a.pop(i)
 return a

คุณสามารถลบช่องว่างหน้า tuple ของคุณในบรรทัดที่สอง
Zach Gates

คุณสามารถทำได้for i in-1,0:
mbomb007

นอกจากนี้คุณอาจต้องการนับไบต์ของคุณอีกครั้ง ฉันนับ 67 ตามที่เป็นอยู่ นอกจากนี้คุณยังสามารถแทนที่ด้วย[space][space]while [tab]whileและสามารถ==0 mothereff.in/…<1
mbomb007


1

PowerShell ขนาด 49 ไบต์

($args[0]-join',').trim(',0').trim('0,')-split','

นำอินพุต$args[0]และใช้-joinร่วมกันด้วยเครื่องหมายจุลภาคเพื่อสร้างสตริง จากนั้นเราใช้.Trim()ฟังก์ชันที่เรียกว่าสองครั้งเพื่อลบการติดตามก่อนจากนั้นจึงนำศูนย์และเครื่องหมายจุลภาค จากนั้นเราจะ-splitใช้สตริงบนเครื่องหมายจุลภาคกลับเข้าไปในอาร์เรย์


รุ่นอื่นโดยไม่ใช้การแปลง
PowerShell ขนาด 81 ไบต์

function f{param($a)$a=$a|%{if($_-or$b){$b=1;$_}};$a[$a.Count..0]}
f(f($args[0]))

เนื่องจาก PowerShell ไม่มีฟังก์ชั่นในการตัดแต่งอาร์เรย์เราจึงกำหนดฟังก์ชันใหม่fที่จะทำครึ่งหนึ่งของสิ่งนี้สำหรับเรา ฟังก์ชั่นใช้เวลา$aเป็น input แล้ว loops |%{...}ผ่านแต่ละรายการมีห่วง $_ -or $bแต่ละซ้ำเราตรวจสอบเงื่อนไข เนื่องจากจำนวนเต็มที่ไม่ใช่ศูนย์นั้นเป็นความจริง แต่$nullเป็นเท็จ (และ$bไม่ได้ถูกนิยามไว้ก่อนหน้าเริ่มต้นเป็น$null) นี่จะประเมินเฉพาะ$trueเมื่อเราเข้าชมองค์ประกอบที่ไม่ใช่ศูนย์แรกในอาร์เรย์ จากนั้นเราตั้งค่า$b=1และเพิ่มมูลค่าปัจจุบัน$_ลงในไปป์ไลน์ จากนั้นจะดำเนินการต่อจนถึงจุดสิ้นสุดของอาร์เรย์อินพุตโดยมีศูนย์อยู่ตรงกลางและจุดสิ้นสุดที่เพิ่มเข้ากับเอาต์พุตเนื่องจากเราได้ตั้งค่า$bจริง

$aเราแค็ปซูลและเก็บผลของวงทั้งหมดกลับเข้ามา จากนั้นเราจัดทำดัชนี$aในลำดับย้อนกลับ (เช่นการย้อนกลับอาร์เรย์) ซึ่งเหลืออยู่บนไพพ์ไลน์และดังนั้นจึงเป็นค่าส่งคืนของฟังก์ชัน

เราเรียกฟังก์ชันนี้สองครั้งใน $args[0]อินพุตไปยังโปรแกรมเพื่อ "ตัด" จากด้านหน้าจากนั้นนำหน้าอีกครั้ง (ซึ่งคือด้านหลังเนื่องจากเรากลับด้าน) คำสั่งซื้อนั้นเก็บรักษาไว้เนื่องจากเราย้อนกลับสองครั้ง

รุ่นนี้เล่นหลวมเล็กน้อยกับกฎสำหรับอาร์เรย์อินพุตของศูนย์ทั้งหมด แต่เนื่องจากการละเว้นการปฏิบัติที่ยอมรับSTDERRโปรแกรมจะคายCannot index into a null arrayข้อผิดพลาดสอง (verbose) สองข้อผิดพลาด(PowerShell เทียบเท่ากับ) STDERR แล้วส่งออกไม่มีอะไร

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