Sıfır ağırlığı


21

Sıralı bir numara listesi göz önüne alındığında (muhtemelen baştaki sıfırlarla), sayıları dikey olarak düzenleyin, sonra tüm sıfırların en alta düşmesine izin verin ve tüm çıkıntılar en alt açık yuvaya düşsin. Baştaki sıfırları kaldırarak, sonuçtaki tamsayıları çıktılar.

Çalıştı örnek

Girdi olarak aşağıdakilere sahip olduğumuzu söyleyin:

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

İlk önce dikey olarak düzenleriz:

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

Daha sonra, sütunlar halinde sütunlar, sıfırları diğer sayılar arasında "aşağıya" bırakın, böylece altta dururlar ve diğer sayıları "yukarı çeker". Bu, ilk çift adımlarının aşağıdaki gibi olmasına yol açacaktır:

2000312941295
339124000124581598
12852353800451258
10235923505185190
0491359102149
^

2300312941295
329124000124581598
14852353800451258
10235923505185190
0091359102149
 ^

2390312941295
328124000124581598
14252353800451258
10935923505185190
0001359102149
  ^

...

2391312941295
328524538124581598
14232323525451258
10915991001185190
0000350000049
                ^

Sonra, tüm çıkıntıları sanki yerçekimi kum gibi çekiyormuş gibi bırakın.

2391312941295
3285245381245 1598
14232323525458258
10915991001181190
00003500000495
             ^

2391312941295
3285245381245  598
14232323525458158
10915991001181290
000035000004951
              ^

...

2391312941295
3285245381245
14232323525458159
10915991001181258
000035000004951908
                 ^

Son olarak, baştaki sıfırları kaldırarak bu sayıları çıktılayın. Çalışılan örneğimiz için çıktı:

[2391312941295, 3285245381245, 14232323525458159, 10915991001181258, 35000004951908]

Başka bir örnek için, girişini varsayalım [1234000,12345678,1234,12340608,12341234].

1234000
12345678
1234
12340608
12341234

Sıfırları bırak:

1234  
12345678
1234163
12340208
12340004

Kalan taşma haneleri bırakın:

1234  
1234567
12341638
12340208
12340004

Çıktı olduğunu [1234, 1234567, 12341638, 12340208, 12340004].

kurallar

  • Giriş , baştaki sıfır içerebilir. Çıktı , baştaki sıfır içermemelidir.
  • Mümkünse, giriş / çıkışın dilinizin ana Tamsayı türüne sığacağını varsayabilirsiniz.
  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlevse, çıktıyı yazdırmak yerine geri gönderebilirsiniz.
  • Standart boşluklar yasaktır.
  • Bu bu nedenle normal golf kurallarının tümü geçerli olur ve en kısa kod (bayt cinsinden) kazanır.

2
Çıkış numaralarının dilimizin kesinliğini aşmayacağını varsayabilir miyiz? (JS mermi 14232323525458159için 14232323525458160)
ETHproductions

@ETHproductions Ben bunun bir PPCG varsayılanı olduğunu düşünüyorum.
Outgolfer Erik,

and all overhangs drop to the bottom-most open slotKırık mücadelem için iyi bir çözüm oldu :).
Magic Octopus Urn,

1
@PeterCordes Evet, giriş başında sıfır içerebilir, bu nedenle bunun üstesinden gelebilmelidir. Çoğu dil için bir dize olarak girdi almak anlamına gelir.
AdmBorkBork

1
@PeterCordes Girdi ve çıktının mutlaka üs-10'da olması gerekmez (izin verilen varsayılan G / Ç yöntemlerinde), farklı bir temel kullanmak görevi önemsiz hale getirmediği sürece (standart bir boşluk). İkincisi, sanırım amaç olmasına rağmen baştaki sıfırların tamamen kaldırılması gerektiğini belirtmedim . Çıktıyı çıktılamaktan . 1234çok farklı olduğu için sıfırları boşluklarla değiştirmenin yasak olacağına karar vereceğim 1234.
AdmBorkBork

Yanıtlar:


10

Jöle , 8 bayt

Z¬Þ€UZṚḌ

Çevrimiçi deneyin!

Nasıl çalışır

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
NE? Şu soruyu okuduğumda şunu düşünüyordum: "Sonunda, bunun için birisinin 20 bayttan daha az çekmesine imkan yok". Çılgınlık
Cruncher

1
Sort each row of the transpose by logical NOT, pushing 0's to the end.Bu istikrarlı bir sıralama garanti mi?
Cruncher

1
Evet, Jelly sortedstabil olduğu garantili Python's kullanıyor .
Dennis,

Bu değişmeli görünen versiyonu ṚZẸÞ€ZṚḌ
Jonathan Allan


4

Kabuğu , 12 bayt

md↔TmoÖ±miT↔

Çevrimiçi deneyin!

açıklama

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 bayt

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

Çevrimiçi deneyin!

Ungolfed versiyonu

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

İlk iki satır, bir liste diğerinden kısaysa , s ile doldurulacaksa map(lambda*a...)varsayılan davranışa eşdeğerdir . eşittir , çünkü herhangi bir rakam (1 ~ 9) ise kod noktası daha yüksek olur ve (herhangi bir) dizgeden daha büyük olur .mapNone
e>'0'cell != '0' and cell != NoneNone


Bunun eski bir versiyonunu yayınlamak ister misin?
Peter Cordes

@PeterCordes ungolfed versiyonunu ve bazı belirsiz noktalara kısa bir açıklama ekledi
Rod


2

Retina 0.8.2 , 95 92 bayt

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

Çevrimiçi deneyin! Açıklama: İlk aşama, ikinci aşamadaki sıfırları düşürmeyi kolaylaştırdığından (basamak: 3 baytlık bir tasarruf için daha kolay) çıkıntı yapan haneleri düşürür. Üçüncü aşama daha sonra baştaki sıfırları kaldırır.


2

Ruby , 104 bayt

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

Çevrimiçi deneyin!

açıklama

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

Anonim tacit önek işlevi, karakter matrisini argüman olarak alarak ve bir sayılar listesini döndürür.

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

Çevrimiçi deneyin!

 girişi çevirmek (sütunlar üzerinde çalışmamız gerektiği gibi)

' 0'(... )⍤1⍨ ile her satır (tensör rank 1 alt dizi) için aşağıdaki zımni işlevi uygulamak ' 0'olarak doğru argüman ( takası argümanlar):

 sıranın kesişimi ve
 ve
 ilki ' 0'
 (yani row∩' 'her satırdaki tüm boşluklar)

, bunu takiben…

~ küme farkı
 (yani row~' 0'satır ancak boşluk ve sıfır olmadan)

, bunu takiben…

 satır ve kesişim
 ve
 birinci
 ve
 ters ' 0'
 (yani row∩'0', her bir sıradan tamamen sıfırlı)

⍎⍤1 Her bir satır değerlendirmek (tensör rank 1 alt dizisi)
 ve
 bunun devrik (yani, her bir sütun, şimdi değiştirilmiş giriş dizisi)


Parantez içindeki bit akıllıdır. Bireysel squiggleların ne yaptığını bilmeme rağmen, oradaki niyeti anlamak biraz zaman aldı. Bir kere anladığımda, yenmesi kolay: ⍎⍤1∘⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1∘⍉( ⎕io←0) Daha da golfe atılabilir, örneğin ben
dyadic

Aslında, yukarıdakiler tam bir program olarak daha kısadır (tren değil):⍎⍤1⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1⍉⎕
ngn

@ngn Böyle farklı bir yöntem kendi gönderisini hak ediyor. İşlem öncesi ve sonrası açıktır.
Adâm

1

Perl 5 , -p0 77 bayt

Eski stil sayımı: 79 bayt ( +2için p0)

STDIN'de son satırsonu olmadan satır olarak giriş yapın (aksi halde her şey çıkma olarak görülür ve son satırsonu giriş dizesi çöktüğünde en üste çıkar). Örneğin:

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

Bu bir çıkıntısı bırakarak ve almak zor biraz edildi 0biri regex içine bırakarak

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

Çevrimiçi deneyin!


0

Ruby , 203 bayt

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

Çevrimiçi deneyin!

Bir dizi dizisini kabul eden ve bir dizi diziyi döndüren bir lambda. Bir şeyleri özlediğimi hissediyorum; bu çok büyük: /

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

Bunu (şimdilik) çok yedim
Unihedron

@Unihedron Wow, beni% 50 yendin. Kesinlikle + 1'im var.
benj2240

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.