Waga zera

21

Biorąc pod uwagę uporządkowaną listę liczb (ewentualnie z wiodącymi zerami), ustaw liczby w pionie, a następnie pozwól, aby wszystkie zera spadły do ​​samego dołu, a wszystkie zwisy opadły do ​​najniższego otwartego miejsca. Wypisz wynikowe liczby całkowite, usuwając początkowe zera.

Przykład działania

Powiedzmy, że otrzymaliśmy następujące dane wejściowe:

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

Najpierw ułóżmy go pionowo:

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

Następnie, kolumna po kolumnie, upuszczaj zera „przez” inne liczby, aby spoczywały na dole i „popychaj” pozostałe liczby w górę. Spowodowałoby to, że pierwsze kroki byłyby następujące:

2000312941295
339124000124581598
12852353800451258
10235923505185190
0491359102149
^

2300312941295
329124000124581598
14852353800451258
10235923505185190
0091359102149
 ^

2390312941295
328124000124581598
14252353800451258
10935923505185190
0001359102149
  ^

...

2391312941295
328524538124581598
14232323525451258
10915991001185190
0000350000049
                ^

Następnie upuść wszystkie zwisy, jakby grawitacja ciągnęło je jak piasek.

2391312941295
3285245381245 1598
14232323525458258
10915991001181190
00003500000495
             ^

2391312941295
3285245381245  598
14232323525458158
10915991001181290
000035000004951
              ^

...

2391312941295
3285245381245
14232323525458159
10915991001181258
000035000004951908
                 ^

Na koniec wypisz te liczby, usuwając wiodące zera. W naszym sprawdzonym przykładzie dane wyjściowe:

[2391312941295, 3285245381245, 14232323525458159, 10915991001181258, 35000004951908]

W innym przykładzie załóżmy, że wprowadzono [1234000,12345678,1234,12340608,12341234].

1234000
12345678
1234
12340608
12341234

Usuń zera:

1234  
12345678
1234163
12340208
12340004

Upuść pozostałe wystające cyfry:

1234  
1234567
12341638
12340208
12340004

Dane wyjściowe to [1234, 1234567, 12341638, 12340208, 12340004].

Zasady

  • Dane wejściowe mogą zawierać początkowe zera. Dane wyjściowe nie mogą zawierać zer wiodących.
  • Jeśli dotyczy, możesz założyć, że wejście / wyjście będzie pasować do rodzimego typu Integer w twoim języku.
  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
AdmBorkBork
źródło
2
Czy możemy założyć, że liczby wyjściowe nie przekroczą precyzji naszego języka? (JS zaokrągla 14232323525458159do 14232323525458160)
ETHprodukcje
@ETHproductions Myślę, że to domyślne PPCG.
Erik the Outgolfer
and all overhangs drop to the bottom-most open slotbyło dobrym rozwiązaniem dla mojego zepsutego wyzwania :).
Magic Octopus Urn
1
@PeterCordes Tak, dane wejściowe mogą zawierać początkowe zera, więc powinno być w stanie to obsłużyć. Wyobrażam sobie, że dla większości języków oznacza to, że weź dane wejściowe jako ciąg znaków.
AdmBorkBork
1
@PeterCordes Wejścia i wyjścia niekoniecznie muszą znajdować się w bazie 10 (to w dozwolonych domyślnych metodach we / wy), o ile użycie innej bazy nie powoduje trywializacji zadania (jest to standardowa luka). Po drugie, chyba nie określiłem, że zera wiodące muszą zostać całkowicie usunięte , chociaż taka była intencja. Będę rządzić, że zamiana zer na spacje nie jest dozwolona, ​​ponieważ wypisywanie . 1234jest bardzo różne niż wypisywanie 1234.
AdmBorkBork

Odpowiedzi:

10

Galaretka , 8 bajtów

Z¬Þ€UZṚḌ

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
4
CO? Kiedy czytałem pytanie, myślałem: „Wreszcie nie ma możliwości, aby ktoś pobrał do tego mniej niż 20 bajtów”. Madness
Cruncher
1
Sort each row of the transpose by logical NOT, pushing 0's to the end.Czy gwarantuje to stabilność?
Cruncher
1
Tak, Jelly używa Pythona sorted, co gwarantuje stabilność.
Dennis
Podoba mi się ta wersja ṚZẸÞ€ZṚḌzamienna : :)
Jonathan Allan
5

05AB1E , 11 bajtów

ζεð†R0†R}øï

Wypróbuj online!

Erik the Outgolfer
źródło
Nigdy wcześniej nie był używany, niezły.
Magic Octopus Urn
4

Łuska , 12 bajtów

md↔TmoÖ±miT↔

Wypróbuj online!

Wyjaśnienie

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]
ბიმო
źródło
4

Python 2 , 118 bajtów

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

Wypróbuj online!

Wersja bez golfa

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

Pierwsze dwa wiersze są równoważne map(lambda*a...)domyślnemu zachowaniu, jeśli mapnależy wypełnić Nones, jeśli jedna lista jest krótsza od drugiej.
e>'0'jest równoważne cell != '0' and cell != None, ponieważ jeśli jest to dowolna cyfra (1 ~ 9), będzie miała wyższy punkt kodowy, a (dowolny) ciąg znaków będzie wyższy niż None.

Pręt
źródło
Chcesz opublikować wersję bez golfa?
Peter Cordes
@PeterCordes dodał nieprzygotowaną wersję i krótkie wyjaśnienie niektórych niejasnych punktów
Rod
2

Retina 0.8.2 , 95 92 bajtów

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

Wypróbuj online! Objaśnienie: Pierwszy etap upuszcza wiszące cyfry, ponieważ ułatwia to (edytuj: jeszcze łatwiejsze zapisywanie 3-bajtowe) drugiemu etapowi upuszczanie zer. Trzeci etap usuwa następnie wiodące zera.

Neil
źródło
2

Rubinowy , 104 bajty

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

Wypróbuj online!

Wyjaśnienie

->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
}
Unihedron
źródło
1

APL (Dyalog Unicode) , 26 bajtów SBCS

Anonimowa funkcja milczącego prefiksu przyjmująca macierz znaków jako argument i zwracająca listę liczb.

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

Wypróbuj online!

 transponuj dane wejściowe (ponieważ musimy pracować nad kolumnami)

' 0'(... )⍤1⍨ zastosować następującą funkcję milczącą do każdego wiersza (sub-macierzy tensora od rangi 1) z ' 0'jak prawego argumentu ( swapy argumentów):

 Przecięcie wiersza i
 i
 pierwszy ' 0'
 (tj row∩' ', wszystkie przestrzenie z każdego rzędu)

, śledzony przez…

~ ustawiona różnica
 (tj row~' 0'. wiersz, ale bez spacji i zer)

, śledzony przez…

 Przecięcie rzędzie i
 a
 , pierwszą
 z
 odwróconą ' 0'
 (to znaczy row∩'0', wszystkie zera z każdego rzędu)

⍎⍤1 ocenić każdy wiersz (pod matrycą z napinaczem stopień 1)
 z
 transpozycję że (tj każdej kolumnie, obecnie zmodyfikowane wiersze wejściowe)

Adám
źródło
Bit w nawiasach jest sprytny. Zrozumienie intencji zajęło mi trochę czasu, choć wiem, co robią poszczególne zawiłości. Kiedy to zrozumiałem, łatwo go pokonać: ⍎⍤1∘⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1∘⍉( ⎕io←0) Może być jeszcze gra w golfa, np. Nie
odkryłem dyadic
tak naprawdę powyższe jest krótsze jako pełny program (nie pociąg):⍎⍤1⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1⍉⎕
ngn
@ngn Taka inna metoda zasługuje na własny post. Przetwarzanie wstępne i końcowe jest oczywiste.
Adám
1

Perl 5 , -p0 77 bajtów

Liczenie w starym stylu: 79 bajtów ( +2dlap0 )

Podaj dane wejściowe jako wiersze na STDIN bez końcowej nowej linii (w przeciwnym razie wszystko jest widziane jako zwis, a końcowa nowa linia wznosi się na górę, gdy łańcuch wejściowy ulega awarii). Na przykład:

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

To było trochę trudne, aby upuścić zwis i 0upuścić w jednym wyrażeniu regularnym

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

Wypróbuj online!

Ton Hospel
źródło
0

Ruby , 203 bajty

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

Wypróbuj online!

Lambda akceptuje tablicę ciągów znaków i zwraca tablicę liczb całkowitych. Czuję, że czegoś mi brakuje; wydaje się to ogromne: /

->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
}
benj2240
źródło
Wygrałem z golfem (na razie)
Unihedron
@Unihedron Wow, pokonałeś mnie o 50%. Na pewno masz moją +1.
benj2240