Вес ноль


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

правила

  • Ввод может содержать начальные нули. Выход не должен содержать начальных нулей.
  • Если применимо, вы можете предположить, что ввод / вывод будет соответствовать целочисленному типу вашего языка.
  • Вход и выход могут быть заданы любым удобным способом. .
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

2
Можем ли мы предположить, что выходные числа не будут превышать точность нашего языка? (JS округляет 14232323525458159до 14232323525458160)
ETHproductions

@ETHproductions Я думаю, что это PPCG по умолчанию.
Эрик Outgolfer

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 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...)поведению по умолчанию, если for mapзаполняется Nones, если один список короче другого.
e>'0'эквивалентно cell != '0' and cell != None, потому что если это любая цифра (1 ~ 9), она будет иметь более высокую кодовую точку, а (любая) строка выше, чем None.


Хотите опубликовать версию об этом?
Питер Кордес

@PeterCordes добавил версию без загадки и краткое объяснение некоторых неясных моментов
Род


2

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

Попробуйте онлайн!

Лямбда, принимающая массив строк и возвращающая массив целых чисел. Я чувствую, что что-то упустил; это кажется огромным: /

->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 Wow, вы победили меня на 50%. У тебя точно есть мой +1.
benj2240

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.