Знищення списків


12

Подаючи список зі списками, вкладеними всередині нього, поверніть список із вкладеними елементами списків.

Вхідні дані

Список матиме, максимум, 4-глибокі вкладені списки. Порахуйте всі 0 у вході як нульовий пробіл.

Вихідні дані

Індивідуально роздруковуйте кожен предмет. Не роздруковуйте вихід у вигляді списку. Ви можете відокремити кожен елемент будь-яким пробілом.

Приклади справ

[[1, 0], [2, 0], [2, 3]] -> 1 2 2 3
[[[4, 5, 8]], [[5, 6, 20]], [[1, 20, 500]]] -> 4 5 8 5 6 20 1 20 500
[[[1, 0], [0, 0], [0, 0]], [[1, 0], [1, 2], [2, 0]], [[2, 0], [0, 0], [0, 0]]] -> 1 1 1 2 2 2

Виграє найкоротший код.


Ви повинні включити принаймні один приклад 4-глибокого списку. Якщо я правильно зрозумів, 4-глибокий - це щось на кшталт [[[[5]]]], правда?
сергіол

[[[[5]]]]працює на tio.run/…, але не на tio.run/…
сергіол

Важко розпізнати це Count all 0's within the input as a null space.середнє значенняignore zeros
l4м2

Відповіді:


7

APL (10)

0~⍨⍎⍞~'[]'

Пояснення:

  • ⍞~'[]': Введення користувачем ( ) без ( ~) символів. '[]'
    Це дає щось подібне'1,2,0,2,3'
  • : Оцініть цей рядок. Так трапляється, що ,це оператор конкатенації, тому тепер у нас є список: 1 2 0 2 3(списки APL розділені пробілами за замовчуванням)
  • 0~⍨: Видаліть із цього списку всі числа 0. (На сьогодні це список чисел, а не рядків, тому нулі в номерах не видаляються.
  • Це значення виводиться (за замовчуванням, тому що це значення всієї програми, на зразок Golfscript). Списки APL за замовчуванням розділені пробілами, так що це виглядає точно як у питанні.

Найкоротша відповідь, тож цей бере торт. Для всіх невідповідей я вказав +, якщо ваш код справді короткий або креативний.
beary605

7

Сід, 20 чарів

Рішення засноване на розширеному регулярному вираженні POSIX.

s;[^0-9]+0|[],[]+;;g

Вихід :

bash-3.2$ sed -rf sedFile <<< "[[[4, 5, 8]], [[5, 6, 20]], [[1, 20, 500]]]" 
4 5 8 5 6 20 1 20 500

Редагувати : Основне регулярне вираження POSIX (рішення @clueless ), 19 символів :

s/[^0-9][^1-9]*/ /g

1
s/[^0-9][^1-9]*/ /gтакож працює, і не вимагає розширених регулярних виразів.
Clueless

7

Пітона, 45

w00, виняток роботи в гольфі!

def d(x):
 try:map(d,x)
 except:print`x`*(x!=0)

Дуже розумний спосіб перевірки типів.
beary605

Мені подобається рішення, хоча я думаю, що це обман, щоб не включати d(input())рядок у кількість символів.
Clueless

Виклик невиразний ... ней, суперечливий, коли йдеться про введення / виведення.
виставка

5

Perl, 20 16 13 символів

perl -ple 's/\D+0?/ /g'

-lВимикач необхідно зберегти кінцевий символ нового рядка у висновку.

Ось альтернативна версія, яка насправді працює зі списками семантично (51 символ).

perl -E '$,=$";sub p{map{ref$_?p(@$_):$_||""}@_}say p eval<>'

Обидві ці програми користуються умовою проблеми, що вона "може відокремлювати кожен елемент будь-яким пробілом" і замінює нулі пробілами, замість того, щоб видаляти їх прямо.


4

К, 12

{x@?&x:,//x}

.

k){x@?&x:,//x}((1;0);(2;0);(2;3))
1 2 2 3
k){x@?&x:,//x}(((4;5;8));((5;6;20));((1;20;500)))
4 5 8 5 6 20 1 20 500
k){x@?&x:,//x}(((1;0);(0;0);(0;0));((1;0);(1;2);(2;0));((2;0);(0;0);(0;0)))
1 1 1 2 2 2

Залежно від версії k, ви можете використовувати "крім" ( x^y) на зразок: {(,//x)^0}або навіть {,/x^0}/. Працює в johnearnest.github.io/ok/index.html
1717

3

Perl 13 , 14 char dit: pрахуйте за один char

s/\D+|\b0/ /g

використання:

cat '[[1, 0], [2, 0], [2, 3]]' | perl -pe 's/\D+|\b0/ /g'

Молодці. Хоча ваш рахунок насправді становить 14 символів (вам потрібно включити pперемикач у рахунку).
хлібниця

@breadbox: Так, ти маєш рацію. Я пропустив це.
Toto

З відлунням замість різання це навіть спрацювало б - нейтральна операція у великій кількості.
користувач невідомий

2

Рубі, 38 символів

puts eval(gets).flatten.reject &:zero?

Номери друкуються розділеними перервою рядка.


2

Гольфскрипт 15

~{[]*}4*{},' '*

Вхідні дані

Запустіть з командного рядка так:

echo [[[1 0] [0 0] [0 0]] [[1 0] [1 2] [2 0]] [[2 0] [0 0] [0 0]]] | ruby golfscript.rb x.gs

(припустимо, що x.gsфайл містить код, представлений вище).

Зауважте, що ,при визначенні масивів немає коми ( ); це синтаксис Golfscript

Вихідні дані

Коли команда, описана в розділі " Введення ", видається:

1 1 1 2 2 2

2

Пітон 3, 49 символів

import re
print(*re.findall('[1-9]\d*',input()))

Python 2, 58 символів

import re
print re.sub('\D[^1-9]*',' ',raw_input())[1:-1]

2

Japt , 5 байт

c f ¸

Перевірте це


Пояснення

Неявне введення масиву U. Вирівняти масив с c. Відфільтруйте його, fщоб видалити 0s. Приєднайте його до рядка, використовуючи пробіли з ¸. Неявний вихід отриманого рядка.


2

Java 10, 106 байт

void c(Object i){for(var o:(Object[])i)try{System.out.print((int)o>0?o+" ":"");}catch(Exception e){c(o);}}

Введення як вкладене Object[], вихід надруковано на STDOUT.

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


46 байт

s->s.replaceAll("[^0-9 ]","").replace(" 0","")

Вхід і вихід як String.

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


@Giuseppe На жаль .. Це досить дурна помилка. Слід виправити зараз.
Кевін Кройсейсен

1

C, 45 символів

for(;s=strtok(s,"[], ");s=0)atoi(s)&&puts(s);

Він передбачає, що вхід подається у зміненій області пам'яті, на яку вказує s.


Чи не повинна відповідь бути програмою чи принаймні функцією? Якщо номер не вдається 01(мені здається законним). І *s-49&&puts(s)коротше.
ugoren

@ugoren Я не знайшов жодних вимог, що обмежували б відповідь лише на повну програму / функції. Чи є?
Олександр Бакулін

@ugoren Переписаний, щоб впоратися з числами з провідними нулями. І дякую за скорочення пропозиції!
Олександр Бакулін

1

Пітон, 99 111 символів

def d(l):
    if list==type(l):return[y for x in l for y in d(x)]
    return[str(l)]*(l!=0)
print" ".join(d(input()))

Попередня версія 99 знаків - не вдається, коли включені лише списки з нулями:

d=lambda l:list==type(l)and[y for x in l for y in d(x)]or[str(l)]*(l!=0)
print" ".join(d(input()))

d(l)рекурсивно вирівнюється список l, фільтруючи нулі та перетворюючи числа в рядки.


Він повертає 1 [0, 0] [0, 0] 1 1 2 2 2 [0, 0] [0, 0] для третього тестового випадку.
beary605

@ beary605, я просто пропустив цей тест ... Я використовую a and b or cзамість C a?b:c, але він не вдається, коли bоцінюється на false (порожній список у цьому випадку).
ugoren

1

Скала, 42 ч

Токенізовано рядок нецифровими та нецифровими, з наступним нулем

print(readLine split"\\D|\\b0"mkString" ")

1

Пролог (79)

Він вводить список як термін, тому вам потрібно поставити "." після списку на вході.

Насправді перелік вирівнювання.

x([H|T]):-x(H),x(T).
x(0). x([]).
x(M):-write(M),put(32).
:-read(X),x(X),halt.



0

Скала 147:

Робота над реальними списками, а не за рядками:

def f[A](l:List[_]):List[_]=l match{
case Nil=>l
case(l:List[_])::s=>(f(l):::f(s))
case e::s=>e::f(s)}
def p(l:List[_])=f(l)filter(!=0)mkString " "

Тепер тестові дані:

val l1 = List (List (1, 0), List (2, 0), List (2, 3))
val l2 = List (List (List (4, 5, 8)), List (List (5, 6, 20)), List (List (1, 20, 500)))
val l3 = List (List (List (1, 0), List (0, 0), List (0, 0)), List (List (1, 0), List (1, 2), List (2, 0)), List (List (2, 0), List (0, 0), List (0, 0)))
val l4 = List (l1, l2, l3)

scala> l4.map(p)
res94: List[String] = List(1 2 2 3, 4 5 8 5 6 20 1 20 500, 1 1 1 2 2 2)

scala> p(l4)
res95: String = 1 2 2 3 4 5 8 5 6 20 1 20 500 1 1 1 2 2 2

0

баш: 29 символів

l=$(echo "[[[1, 0], [0, 0], [0, 0]], [[1, 0], [1, 2], [2, 0]], [[2, 0], [0, 0], [0, 0]]]")
echo $l|tr -d '][,'|sed 's/\b0\b/ /g'
1           1   1 2 2   2          

підрахунок рядка 2 лише без 'ехо $ l |'. Тест на 3 зразки:

  1    2    2 3
   4 5 8   5 6 20   1 20 500
   1               1    1 2  2     2            

0

Tcl , 47 байт

proc D L {concat {*}[concat {*}[concat {*}$L]]}

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

Якщо припустити 4-глибину - це щось подібне {{{{5}}}}. Оскільки в тестових випадках немає прикладу такого, це може бути щось подібне {{{5}}}; якщо це, я можу скоротити код!

Tcl , 66 байт

proc D L {lsearch -al -inl -not "[string map {\{ "" \} ""} $L]" 0}

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





0

Брахілог , 8 байт

ċ∋↰|ℕ₁ẉ⊥

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

Здійснює вхід через вхідну змінну і друкує вихід, розділений новими рядками. Зазвичай я б скаржився на вихідний формат, але він насправді врятував мені байт таким чином, який я, можливо, не подумав би інакше - надягати ẉ⊥на кінець коротше, ніж загортати його {}ᶠ.

ċ           If the input is a list,
 ∋          pick some element of it
  ↰         and recur with it as the input.
   |        Otherwise, if the input
    ℕ₁      is a natural number,
      ẉ     print it with a trailing newline
       ⊥    then trigger backtracking.

Якщо елементи списку не обмежуються невід'ємними цілими числами:

Брахілог , 11 байт

ċ!∋↰|0!⊥|ẉ⊥

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


0

PHP , 70 байт

function($a){array_walk_recursive($a,function($a){echo$a?"$a ":'';});}

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

Це не буде найкоротшим (ні найдовшим), але подумав, що це буде шанс отримати використання array_walk_recursive(), який до сьогоднішнього дня я не можу подумати про те, щоб колись користуватися ним! Принаймні, вона повинна мати можливість обробляти глибокі вкладені списки довільного рівня.


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