น้ำหนักของศูนย์


21

กำหนดรายการหมายเลขที่เรียงลำดับ (อาจเป็นศูนย์นำหน้า) จัดเรียงตัวเลขในแนวตั้งจากนั้นปล่อยให้ศูนย์ทั้งหมดเลื่อนไปจนถึงด้านล่าง เอาท์พุทจำนวนเต็มผลลบศูนย์นำ

ตัวอย่างการทำงาน

สมมติว่าเราได้รับสิ่งต่อไปนี้เป็นอินพุต:

['0000312941295', '239124000124581598', '32852353800451258', '10235923505185190', '1491359102149']

ครั้งแรกที่เราจัดเรียงมันในแนวตั้ง:

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

จากนั้นแบบคอลัมน์ต่อคอลัมน์ให้วางศูนย์ "ผ่าน" ตัวเลขอื่น ๆ เพื่อให้พวกเขาอยู่ด้านล่างและ "ผลัก" ตัวเลขอื่น ๆ ขึ้น สิ่งนี้จะส่งผลให้ขั้นตอนสองขั้นตอนแรกเป็นดังนี้:

2000312941295
339124000124581598
12852353800451258
10235923505185190
0491359102149
^

2300312941295
329124000124581598
14852353800451258
10235923505185190
0091359102149
 ^

2390312941295
328124000124581598
14252353800451258
10935923505185190
0001359102149
  ^

...

2391312941295
328524538124581598
14232323525451258
10915991001185190
0000350000049
                ^

จากนั้นวางสิ่งที่แขวนอยู่ราวกับว่าแรงโน้มถ่วงดึงลงมาเหมือนทราย

2391312941295
3285245381245 1598
14232323525458258
10915991001181190
00003500000495
             ^

2391312941295
3285245381245  598
14232323525458158
10915991001181290
000035000004951
              ^

...

2391312941295
3285245381245
14232323525458159
10915991001181258
000035000004951908
                 ^

สุดท้ายเอาท์พุทตัวเลขเหล่านี้โดยลบศูนย์นำหน้า สำหรับตัวอย่างการทำงานของเราผลลัพธ์:

[2391312941295, 3285245381245, 14232323525458159, 10915991001181258, 35000004951908]

[1234000,12345678,1234,12340608,12341234]สำหรับอีกหนึ่งตัวอย่างเช่นสมมติว่าใส่ของ

1234000
12345678
1234
12340608
12341234

ปล่อยศูนย์:

1234  
12345678
1234163
12340208
12340004

ปล่อยตัวเลขที่เหลือที่ยื่นออกมา:

1234  
1234567
12341638
12340208
12340004

[1234, 1234567, 12341638, 12340208, 12340004]เอาท์พุท

กฎระเบียบ

  • อินพุตอาจมีศูนย์นำหน้า ผลลัพธ์จะต้องไม่มีเลขศูนย์นำหน้า
  • หากเป็นไปได้คุณสามารถสันนิษฐานได้ว่าอินพุต / เอาท์พุตจะพอดีกับภาษาของคุณ Integer
  • อินพุตและเอาต์พุตจะได้รับโดยวิธีการที่สะดวกใด
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

2
เราอาจสมมติว่าตัวเลขผลลัพธ์จะไม่เกินความแม่นยำของภาษาของเราหรือไม่ (รอบ JS 14232323525458159ถึง14232323525458160)
ETHproductions

@ ETHproductions ฉันคิดว่านั่นเป็นค่าเริ่มต้น PPCG
Erik the Outgolfer

and all overhangs drop to the bottom-most open slotเป็นการแก้ไขที่ดีสำหรับความท้าทายที่แตกสลายของฉัน :)
Magic Octopus Urn

1
@PeterCordes ใช่อินพุตอาจมีศูนย์นำหน้าดังนั้นจึงควรสามารถจัดการกับสิ่งนั้นได้ ฉันจินตนาการถึงภาษาส่วนใหญ่นั่นหมายถึงรับอินพุตเป็นสตริง
AdmBorkBork

1
@PeterCordes อินพุตและเอาต์พุตไม่จำเป็นต้องอยู่ใน base-10 (นั่นเป็นวิธีการเริ่มต้น I / O ที่ได้รับอนุญาต) ตราบใดที่การใช้ฐานที่แตกต่างกันนั้นไม่ทำให้ภารกิจยุ่งยากเล็กน้อย (นั่นเป็นช่องโหว่มาตรฐาน) ประการที่สองฉันเดาว่าฉันไม่ได้ระบุว่าศูนย์นำหน้าต้องถูกลบออกอย่างสมบูรณ์แม้ว่านั่นเป็นเจตนา ฉันจะกฎว่าแทนที่ศูนย์ด้วยช่องว่างไม่ได้รับอนุญาตเนื่องจากการส่ง. 1234ออกแตกต่างจากการส่งออก1234มาก
AdmBorkBork

คำตอบ:


10

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

Z¬Þ€UZṚḌ

ลองออนไลน์!

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

Z¬Þ€UZṚḌ  Main link. Argument: M (2D array / matrix)

Z         Zip; transpose M by reading columns as rows.
 ¬Þ€      Sort each row of the transpose by logical NOT, pushing 0's to the end.
    U     Upend; reverse all sorted rows of the transpose.
     Z    Zip again, restoring rows from columns. Overhangs rise to the top.
      Ṛ   Reverse the order of the rows.
       Ḍ  Decimal; convert the rows from base 10 to integer.

4
อะไร? ในขณะที่ฉันกำลังอ่านคำถามที่ฉันคิด: "ในที่สุดไม่มีทางที่ใครบางคนสามารถดึงออกได้น้อยกว่า 20 ไบต์สำหรับเรื่องนี้" Madness
Cruncher

1
Sort each row of the transpose by logical NOT, pushing 0's to the end.นี่รับประกันได้หรือไม่ว่าเป็นประเภทที่มั่นคง?
Cruncher

1
ใช่เจลลี่ใช้ Python sortedซึ่งรับประกันว่าจะเสถียร
เดนนิส

ฉันชอบรุ่นที่เป็นลักษณะการสื่อสารแบบนี้ṚZẸÞ€ZṚḌ:) :)
Jonathan Allan


4

Huskขนาด 12 ไบต์

md↔TmoÖ±miT↔

ลองออนไลน์!

คำอธิบาย

md↔Tm(Ö±mi)T↔  -- input as list of strings, example: ["103","32","258"]
            ↔  -- reverse: ["258","32","103"]
           T   -- transpose: ["231","520","83"]
    m(    )    -- with each line do (example with "520")
        mi     -- | convert each char to digit: [5,2,0]
      Ö±       -- | sort by signum (stable): [0,5,2]
               -- : [[2,3,1],[0,5,2],[8,3]]
   T           -- transpose: [[2,0,8],[3,5,3],[1,2]]
  ↔            -- reverse: [[1,2],[3,5,3],[2,0,8]]%
md             -- convert each to integer: [12,353,208]

4

Python 2 , 118 ไบต์

lambda l:[int(''.join(z))for z in zip(*map(lambda*a:['']*a.count(None)+[e for e in a if'0'<e]+['0']*a.count('0'),*l))]

ลองออนไลน์!

เวอร์ชันที่ไม่ดี

def f(list_):
 max_len = max(len(x) for x in list_)
 transposed_list = zip(*[list(row)+(max_len-len(row))*[None] for row in list_])
 weighted_list = [['']*column.count(None)+[cell for cell in column if cell != '0' and cell != None]+['0']*column.count('0') for column in transposed_list]
 return [int(''.join(row)) for row in zip(*weighted_list)]

สองบรรทัดแรกเทียบเท่ากับmap(lambda*a...)พฤติกรรมเริ่มต้นถ้าหากmapต้องการเติมด้วยNones หากรายการหนึ่งสั้นกว่าอีกรายการหนึ่ง
e>'0'เทียบเท่ากับcell != '0' and cell != Noneเพราะถ้ามันเป็นหลักใด ๆ (1 ~ 9) ก็จะมีจุดโค้ดที่สูงขึ้นและ (ใด ๆ ) Noneสตริงสูงกว่า


สนใจที่จะโพสต์เวอร์ชั่นที่ไม่ดีขึ้นหรือไม่?
Peter Cordes

@PeterCordes เพิ่มเวอร์ชันที่ไม่ดีและคำอธิบายสั้น ๆ สำหรับบางจุดที่ไม่ชัดเจน
Rod


2

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

m(+`^((.)*)(.+)(¶(?<-2>.)*)(?(2)_)$
$1$4$3
+`^((.)*)0(.*¶(?>(?<-2>.)*))([^0])
$1$4${3}0
^0+

ลองออนไลน์! คำอธิบาย: ขั้นตอนแรกจะวางตัวเลขที่ยื่นออกมาซึ่งจะทำให้ง่ายขึ้น (แก้ไข: ง่ายยิ่งขึ้นสำหรับการประหยัดแบบ 3 ไบต์) สำหรับขั้นตอนที่สองเพื่อปล่อยค่าศูนย์ ขั้นตอนที่สามจะลบศูนย์นำหน้า


2

Ruby , 104 ไบต์

->a{a.map{|x|x.ljust(99).chars}.transpose.map{|x|x.sort_by{|x|x<?1?x:?!}}.transpose.map{|x|x.join.to_i}}

ลองออนไลน์!

คำอธิบาย

->a{
  a.map{|x|x.ljust(99).chars}  # Fill spaces to make this rectangular
    .transpose.map{|x|
       x.sort_by{|x|x<?1?x:?!} # Treat all chars but " 1" as ! (see ascii table)
    }.transpose.map{|x|x.join.to_i} # Convert back to numbers
                       # note: if no leading 0s, eval x*'' , doesn't work here
}

1

APL (Dyalog Unicode) , 26 ไบต์SBCS

ฟังก์ชั่นคำนำหน้าโดยปริยายโดยไม่ระบุชื่อรับเมทริกซ์ตัวละครเป็นอาร์กิวเมนต์และส่งกลับรายการของตัวเลข

⍎⍤1∘⍉' 0'(∩∘⊃,~,∩∘⊃∘⌽)⍤1⍨⍉

ลองออนไลน์!

 เคลื่อนย้ายอินพุต (เนื่องจากเราจำเป็นต้องทำงานกับคอลัมน์)

' 0'(... )⍤1⍨ ใช้ฟังก์ชั่นโดยปริยายต่อไปนี้เพื่อแต่ละแถว (ย่อยอาร์เรย์ของเมตริกซ์อันดับ 1) มี' 0'ฐานะทางขวาอาร์กิวเมนต์ ( แลกเปลี่ยนขัดแย้ง):

 จุดตัดของแถวและ
 และ
 ส่วนแรกของ' 0'
 (เช่นrow∩' '; ช่องว่างทั้งหมดจากแต่ละแถว)

, ติดตามโดย…

~ ความแตกต่างที่ตั้งไว้
 (เช่นrow~' 0'; แถว แต่ไม่มีช่องว่างและเลขศูนย์)

, ติดตามโดย…

 จุดตัดของแถวและ
 และ
 ส่วนแรก
 ของ
 การย้อนกลับ' 0'
 (เช่นrow∩'0'ศูนย์ทั้งหมดจากแต่ละแถว)

⍎⍤1 ประเมินแต่ละแถว (แถวย่อยของเมตริกซ์อันดับ 1)
 ของ
 การแปลงของ (เช่นแต่ละคอลัมน์; แถวอินพุตที่แก้ไขแล้ว)


บิตในวงเล็บคือฉลาด ฉันใช้เวลาสักครู่เพื่อทำความเข้าใจความตั้งใจที่นั่นถึงแม้ว่าฉันจะรู้ว่าสิ่งที่แต่ละกลุ่มทำ เมื่อฉันเข้าใจแล้วมันเป็นเรื่องง่ายที่จะเอาชนะ: ⍎⍤1∘⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1∘⍉( ⎕io←0) มันอาจจะเป็นสนามกอล์ฟเพิ่มเติมเช่นฉันไม่ได้สำรวจ dyadic
ก.ย.

จริงๆแล้วข้างต้นจะสั้นกว่าเนื่องจากเป็นโปรแกรมที่สมบูรณ์ (ไม่ใช่รถไฟ):⍎⍤1⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1⍉⎕
ก.ย.

@ngn วิธีการอื่นที่แตกต่างกันคือข้อดีของการโพสต์ ก่อนและหลังการประมวลผลชัดเจน
Adám

1

Perl 5 , -p0 77 ไบต์

การนับแบบเก่า: 79 ไบต์ ( +2ต่อp0)

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

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

มันค่อนข้างยากที่จะได้รับสิ่งที่แขวนอยู่และ0หล่นลงใน regex หนึ่ง

#!/usr/bin/perl -p0
s/^.{@{+}}\K((0)|.+$)(.*
.{@{+}})((?(2)[1-9]|$))/$4$3$1/m while/|/g;s/^0+//mg

ลองออนไลน์!


0

Ruby , 203 ไบต์

->a{t=->b{b[0].zip(*b[1..-1])}
m=a.map{|s|s.size}.max
a.map!{|s|(s+" "*m)[0...m].chars}
a=t[a].map{|c|c.size.times{|i|" 0"[c[i]]&&(c.slice!(i)==?0?c.push(?0):c.unshift(" "))}
c}
t[a].map{|r|r.join.to_i}}

ลองออนไลน์!

แลมบ์ดายอมรับอาร์เรย์ของสตริงและส่งกลับอาร์เรย์ของ ints ฉันรู้สึกว่าฉันขาดอะไรไป รู้สึกอย่างนี้มาก: /

->a{
  t = -> b { b[0].zip(*b[1..-1]) }     # t is a lambda that transposes 2D arrays
  m = a.map{ |s| s.size }.max          # m is the maximum input string length
  a.map!{ |s| (s+" "*m)[0...m].chars } # Right-pad every string to the same length
  a = t[a].map{ |c|                    # Transpose a, and for every row (column)
    c.size.times{ |i|                  # For every character in the column
      " 0"[c[i]] && (                  # If the character is 0 or space
        c.slice!(i) == ?0 ?            # Remove it from the column, and if it was 0,
          c.push(?0) :                 # Push a 0 to the end (bottom) of the column, else
          c.unshift(" ")               # Add a space to the top of the column
      )
    }
    c
  }
  t[a].map{ |r| r.join.to_i }          # Transpose a back, and parse each row to int
}

ฉันoutgolfedนี้ (ตอนนี้)
Unihedron

@ Unihedron Wow คุณชนะฉันลง 50% คุณได้ +1 ของฉันอย่างแน่นอน
benj2240

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