Berat Nol


21

Diberikan daftar angka yang terurut (mungkin dengan angka nol di depan), atur angka secara vertikal, lalu biarkan semua angka nol turun sampai ke bawah dan semua overhang jatuh ke slot paling bawah yang terbuka. Keluarkan bilangan bulat yang dihasilkan, menghapus nol di depan.

Contoh yang berhasil

Katakanlah kita diberi masukan sebagai berikut:

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

Pertama-tama kita mengaturnya secara vertikal:

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

Kemudian, kolom demi kolom, letakkan nol "melalui" angka-angka lain sehingga mereka bertengger di bagian bawah dan "tekan" angka-angka lainnya ke atas. Ini akan menghasilkan langkah pasangan pertama sebagai berikut:

2000312941295
339124000124581598
12852353800451258
10235923505185190
0491359102149
^

2300312941295
329124000124581598
14852353800451258
10235923505185190
0091359102149
 ^

2390312941295
328124000124581598
14252353800451258
10935923505185190
0001359102149
  ^

...

2391312941295
328524538124581598
14232323525451258
10915991001185190
0000350000049
                ^

Selanjutnya, jatuhkan semua overhang seolah-olah gravitasi menariknya ke bawah seperti pasir.

2391312941295
3285245381245 1598
14232323525458258
10915991001181190
00003500000495
             ^

2391312941295
3285245381245  598
14232323525458158
10915991001181290
000035000004951
              ^

...

2391312941295
3285245381245
14232323525458159
10915991001181258
000035000004951908
                 ^

Akhirnya, keluarkan angka-angka ini, dengan menghapus angka nol di depan. Untuk contoh yang dikerjakan kami, keluaran:

[2391312941295, 3285245381245, 14232323525458159, 10915991001181258, 35000004951908]

Sebagai contoh lain, anggaplah input dari [1234000,12345678,1234,12340608,12341234].

1234000
12345678
1234
12340608
12341234

Jatuhkan nol:

1234  
12345678
1234163
12340208
12340004

Jatuhkan sisa angka yang menggantung:

1234  
1234567
12341638
12340208
12340004

Output adalah [1234, 1234567, 12341638, 12340208, 12340004].

Aturan

  • Input mungkin mengandung nol di depan. Output tidak boleh mengandung angka nol di depan.
  • Jika berlaku, Anda dapat mengasumsikan bahwa input / output akan sesuai dengan tipe Integer asli bahasa Anda.
  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

2
Bisakah kita berasumsi bahwa angka-angka output tidak akan melebihi ketepatan bahasa kita? (Putaran JS 14232323525458159ke 14232323525458160)
ETHproduksi

@ ETHproductions Saya pikir itu adalah standar PPCG.
Erik the Outgolfer

and all overhangs drop to the bottom-most open slotadalah perbaikan yang baik untuk tantangan saya yang rusak :).
Magic Octopus Urn

1
@PeterCordes Ya, input mungkin berisi angka nol di depan, jadi harus bisa mengatasinya. Saya membayangkan untuk sebagian besar bahasa, itu berarti mengambil input sebagai string.
AdmBorkBork

1
@PeterCordes Input dan output tidak perlu menjadi dalam basis-10 (yang dalam memungkinkan standar I / O metode), asalkan menggunakan dasar yang berbeda tidak meremehkan tugas (yang celah standar). Kedua, saya kira saya tidak menentukan bahwa angka nol di depan harus dihapus sepenuhnya , meskipun itu maksudnya. Saya akan memutuskan bahwa mengganti nol dengan spasi tidak diperbolehkan, karena keluaran . 1234sangat berbeda dari keluaran 1234.
AdmBorkBork

Jawaban:


10

Jelly , 8 byte

Z¬Þ€UZṚḌ

Cobalah online!

Bagaimana itu bekerja

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
APA? Ketika saya membaca pertanyaan saya berpikir: "Akhirnya, tidak mungkin seseorang dapat melakukan kurang dari 20 byte untuk ini". Madness
Cruncher

1
Sort each row of the transpose by logical NOT, pushing 0's to the end.Apakah ini dijamin jenis yang stabil?
Cruncher

1
Ya, Jelly menggunakan Python sorted, yang dijamin stabil.
Dennis

Saya agak suka versi yang tampak komutatif ini: ṚZẸÞ€ZṚḌ:)
Jonathan Allan


4

Sekam , 12 byte

md↔TmoÖ±miT↔

Cobalah online!

Penjelasan

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 byte

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))]

Cobalah online!

Versi tidak disatukan

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)]

Dua baris pertama sama dengan map(lambda*a...), perilaku default jika untuk mapmengisi dengan Nones jika satu daftar lebih pendek dari yang lain.
e>'0'setara dengan cell != '0' and cell != None, karena jika itu adalah digit (1 ~ 9), ia akan memiliki titik kodep yang lebih tinggi, dan (mana) string lebih tinggi dari None.


Ingin memposting versi yang tidak disatukan ini?
Peter Cordes

@PeterCordes menambahkan versi yang tidak diklik dan penjelasan singkat untuk beberapa poin yang tidak jelas
Rod


2

Retina 0.8.2 , 95 92 byte

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

Cobalah online! Penjelasan: Tahap pertama menjatuhkan angka yang menggantung karena ini membuatnya lebih mudah (edit: lebih mudah untuk penghematan 3-byte) untuk tahap kedua untuk menjatuhkan nol. Tahap ketiga kemudian menghapus angka nol di depan.


2

Ruby , 104 byte

->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}}

Cobalah online!

Penjelasan

->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 byte SBCS

Fungsi awalan tersembunyi anonim mengambil matriks karakter sebagai argumen dan mengembalikan daftar angka.

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

Cobalah online!

 transpos input (karena kita perlu mengerjakan kolom)

' 0'(... )⍤1⍨ terapkan fungsi tacit berikut untuk setiap baris (sub-array dari tensor rank 1) dengan ' 0'sebagai argumen benar ( menukar argumen):

 persimpangan baris dan
 dan
 yang pertama dari ' 0'
 (yaitu row∩' '; semua spasi dari setiap baris)

, diikuti oleh…

~ perbedaan set
 (yaitu row~' 0'; baris tetapi tanpa spasi dan nol)

, diikuti oleh…

 persimpangan baris dan
 dan
 yang pertama
 dari
 yang terbalik ' 0'
 (yaitu row∩'0'; semua nol dari setiap baris)

⍎⍤1 mengevaluasi setiap baris (sub-array dari tensor rank 1)
 dari
 transpos itu (yaitu setiap kolom; baris input yang sekarang dimodifikasi)


Bit yang di kurung adalah pintar. Butuh beberapa saat untuk memahami maksud di sana, meskipun saya tahu apa yang dilakukan pertengkaran individu. Setelah saya mengerti itu, sangat mudah untuk mengalahkan: ⍎⍤1∘⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1∘⍉( ⎕io←0) Mungkin golfable lebih lanjut, misalnya saya tidak mengeksplorasi diad
ngn

sebenarnya, di atas lebih pendek sebagai program lengkap (bukan kereta api):⍎⍤1⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1⍉⎕
ngn

@ ngn Metode yang berbeda layak mendapat posting sendiri. Proses pra dan pasca jelas.
Adám

1

Perl 5 , -p0 77 byte

Penghitungan gaya lama: 79 byte ( +2untuk p0)

Berikan input sebagai garis pada STDIN tanpa baris baru akhir (jika tidak semuanya terlihat sebagai menggantung dan baris baru akhir naik ke atas saat string input mogok). Misalnya:

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

Agak sulit untuk mendapatkan overhang dropping dan 0dropping ke dalam satu regex

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

Cobalah online!


0

Ruby , 203 byte

->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}}

Cobalah online!

Seorang lambda menerima array string dan mengembalikan array int. Saya merasa seperti kehilangan sesuatu; ini terasa luar biasa: /

->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
}

Saya mengungguli ini (untuk sekarang)
Unihedron

@ Unihedron Wow, Anda mengalahkan saya dengan 50%. Anda pasti mendapatkan +1 saya.
benj2240

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.