Вага нуля


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.
Ерік Аутгольфер

and all overhangs drop to the bottom-most open slotбуло гарним виправленням мого розбитого виклику :).
Чарівний восьминіг Урна

1
@PeterCordes Так, вхід може містити провідні нулі, тому він повинен мати можливість це впоратися. Я думаю, що для більшості мов це означає приймати введення як рядок.
AdmBorkBork

1
@PeterCordes Введення та виведення не обов'язково повинні знаходитись у base-10 (це в дозволених методах вводу / виводу за замовчуванням), доки використання іншої бази не виконує завдання (це стандартна лазівка). По-друге, я думаю, я не вказав, що провідні нулі повинні бути видалені повністю , хоча це було наміром. Я буду правити, що заміна нулів пробілами заборонена, оскільки виведення . 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 байт". Божевілля
Cruncher

1
Sort each row of the transpose by logical NOT, pushing 0's to the end.Чи гарантована ця стабільність?
Cruncher

1
Так, Jelly використовує Python's sorted, який гарантовано стабільний.
Денніс

Мені подобається ця комутативна версія: ṚZẸÞ€ZṚḌ:)
Джонатан Алан


4

Лушпиння , 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.


Не хочете опублікувати версію цього документа?
Пітер Кордес

@PeterCordes додав версію без вогків і коротке пояснення деяких незрозумілих моментів
стрижень


2

Сітківка 0,8.2 , 95 92 байт

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

Спробуйте в Інтернеті! Пояснення: На першому етапі випадають цифри, що пересуваються, оскільки це полегшує (відредагуйте: ще простіше для 3-байтового збереження) для другого етапу скинути нулі. Потім третій етап видаляє провідні нулі.


2

Рубін , 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) Це може бути ігорним, наприклад, я не досліджував
діадію

на самому справі, вище коротше повна програма ( а не поїзд):⍎⍤1⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1⍉⎕
NGN

@ngn Такий інший метод заслуговує власного допису. Попередня та післяобробка є очевидною.
Адам

1

Perl 5 , -p0 77 байт

Підрахунок старого стилю: 79 байт ( +2для p0)

Надайте введення як рядки на STDIN без остаточного нового рядка (інакше все сприймається як нависання, а кінцевий новий рядок піднімається до вершини, коли вхідна рядок руйнується вниз). Наприклад:

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

Трохи складно було звалити перегін і 0опуститись в один вираз

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

Спробуйте в Інтернеті!


0

Рубін , 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
}

Я перевершив це (поки що)
Уніхедрон

@Unihedron Нічого собі, ти побив мене на 50%. Ви точно отримали мій +1.
benj2240

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.