Codegolf - Вес Нуля

  • Автор темы Milador
  • Обновлено
  • 22, Oct 2024
  • #1

Учитывая упорядоченный список чисел (возможно, с ведущими нулями), расположите числа вертикально, затем позвольте всем нулям опуститься до самого низа, а все выступающие части опуститься в самый нижний открытый слот. Выведите полученные целые числа, удалив ведущие нули.

Рабочий пример

Скажем, нам было дано следующее в качестве входных данных:

 
 
 
 
 
 
 
 [1234, 1234567, 12341638, 12340208, 12340004] 

Сначала расположим его вертикально:

1234 1234567 12341638 12340208 12340004

Затем, столбец за столбцом, опускайте нули «через» другие числа, чтобы они оказались внизу, и «подталкивайте» другие числа вверх. В результате первые несколько шагов будут выглядеть следующим образом:

1234 12345678 1234163 12340208 12340004

Затем опустите все выступы, как будто сила тяжести тянет их вниз, как песок.

1234000 12345678 1234 12340608 12341234

Наконец, выведите эти числа, удалив ведущие нули. Для нашего рабочего примера выведите:

[1234000,12345678,1234,12340608,12341234]

В качестве другого примера предположим, что введено [2391312941295, 3285245381245, 14232323525458159, 10915991001181258, 35000004951908] .

2391312941295 3285245381245 1598 14232323525458258 10915991001181190 00003500000495 ^ 2391312941295 3285245381245 598 14232323525458158 10915991001181290 000035000004951 ^ ... 2391312941295 3285245381245 14232323525458159 10915991001181258 000035000004951908 ^

Отбросьте нули:

2000312941295 339124000124581598 12852353800451258 10235923505185190 0491359102149 ^ 2300312941295 329124000124581598 14852353800451258 10235923505185190 0091359102149 ^ 2390312941295 328124000124581598 14252353800451258 10935923505185190 0001359102149 ^ ... 2391312941295 328524538124581598 14232323525451258 10915991001185190 0000350000049 ^

Отбросьте оставшиеся нависающие цифры:

0000312941295 239124000124581598 32852353800451258 10235923505185190 1491359102149

Выход: ['0000312941295', '239124000124581598', '32852353800451258', '10235923505185190', '1491359102149'] .

Правила

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

#код-гольф #код-гольф #массив

Milador


Рег
26 Jan, 2013

Тем
83

Постов
209

Баллов
654
  • 26, Oct 2024
  • #2

Желе, 8 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ⍎⍤1⍉{⍵[⍒⌈9÷⍨⎕d⍳⍵]}⍤1⍉⎕
 

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

Как это работает

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

05AB1E, 11 байт

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

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

 

Hisham


Рег
13 Dec, 2006

Тем
79

Постов
193

Баллов
598
  • 26, Oct 2024
  • #3

Шелуха, 12 байт

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

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

Объяснение

0 ||answer||

Питон 2, 118 байт

0000312941295 239124000124581598 32852353800451258 10235923505185190 1491359102149

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

Версия без гольфа

p0

Первые две строки эквивалентны +2 , the default behaviour if for заполнить s if one list is shorter than the other.
⍎⍤1 is equivalent to row∩'0' , потому что если это любая цифра (1~9), она будет иметь более высокий код, а (любая) строка выше, чем ' 0' .

 

Dreazyasype


Рег
12 Sep, 2011

Тем
79

Постов
191

Баллов
626
  • 26, Oct 2024
  • #5

Ретина 0.8.2, 95 92 байта

Попробуйте онлайн! Объяснение: На первом этапе удаляются нависающие цифры, поскольку это облегчает (отредактируйте: даже проще для сохранения 3 байтов) на втором этапе удаление нулей. Затем на третьем этапе удаляются ведущие нули.

 

Modem


Рег
02 Jul, 2011

Тем
72

Постов
188

Баллов
618
  • 26, Oct 2024
  • #6

Руби, 104 байта

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

Объяснение

||answer||

APL (Диалог Юникод), 26 байтыСБКС

Анонимная неявная префиксная функция, принимающая в качестве аргумента символьную матрицу и возвращающая список чисел.

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

,  transpose the input (as we need to work on the columns)

row~' 0'~  примените следующую неявную функцию к каждой строке (подмассиву тензорного ранга 1) с , as верно аргумент ( row∩' ' swaps the arguments) :

' 0'  intersection of the row and
 and
 the first of
 (т.е. ; all the spaces from each row)

' 0'  followed by…

)⍤1⍨  the set difference
 (т.е. ' 0'( ; the row but without spaces and zeros)

 followed by…

⍎⍤1∘⍉' 0'(∩∘⊃,~,∩∘⊃∘⌽)⍤1⍨⍉  intersection of the row and
->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 }  and
->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}}  the first
m(+`^((.)*)(.+)(¶(?<-2>.)*)(?(2)_)$ $1$4$3 +`^((.)*)0(.*¶(?>(?<-2>.)*))([^0]) $1$4${3}0 ^0+  of
iRT_C_M!DMC  the reversed None
 (т.е. cell != '0' and cell != None ; all the zeros from each row)

e>'0'  evaluate each row (sub-array of tensor rank 1)
None  of
map  the transpose of that (i.e. each column; the now modified input rows)

 

MyncSherryreX23


Рег
11 May, 2008

Тем
69

Постов
178

Баллов
533
  • 26, Oct 2024
  • #7

Перл 5, -p0 77 байт

Счет по старому стилю: 79 байт ( map(lambda*a...) for 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)] )

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

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

Было немного сложно опустить свес и 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] dropping into one regex

md↔TmoÖ±miT↔

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

 

Fill1


Рег
11 Sep, 2006

Тем
77

Постов
196

Баллов
591
  • 26, Oct 2024
  • #8

Руби, 203 байта

ζεð†R0†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. ||answer||

АПЛ (Диалог Классик), 24 23 22 байта

Z¬Þ€UZṚḌ

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

на основе решения Адама

 

Nikitosrules


Рег
15 Apr, 2006

Тем
75

Постов
200

Баллов
595
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно