Залишаючи гніздо


23

Враховуючи неплоский список цілих чисел, виведіть список списків, що містять цілі числа на кожному рівні вкладення, починаючи з рівня найменшого введення, зі значеннями в їх первісному порядку в списку введення, коли читається зліва направо. Якщо два або більше списків знаходяться на одному рівні вкладеності у вхідному списку, їх слід об'єднати в єдиний список у вихідному. Вихідні дані не повинні містити порожніх списків - рівні вкладення, які містять лише списки, слід повністю пропускати.

Можна припустити, що цілі числа знаходяться у діапазоні (включно) [-100, 100]. Для списків немає максимальної довжини або глибини вкладання. Порожніх списків на вході не буде - кожен рівень введення міститиме щонайменше одне ціле число чи список.

Введення та вихід повинні бути в рідному списку / масиві / перелічуваному / ітерабельному / тощо. форматі або в будь-якому розумному, однозначному форматі, якщо у вашій мові відсутній тип послідовності.

Приклади

[1, 2, [3, [4, 5], 6, [7, [8], 9]]] => [[1, 2], [3, 6], [4, 5, 7, 9], [8]]

[3, 1, [12, [14, [18], 2], 1], [[4]], 5] => [[3, 1, 5], [12, 1], [14, 2, 4], [18]]

[2, 1, [[5]], 6] => [[2, 1, 6], [5]]

[[54, [43, 76, [[[-19]]]], 20], 12] => [[12], [54, 20], [43, 76], [-19]]

[[[50]], [[50]]] => [[50, 50]]

Відповіді:


5

Піта, 17

 us-GeaYsI#GQ)S#Y

Провідний простір важливий. Це фільтрує список за тим, чи є значення інваріантними у sфункції, потім видаляє ці значення зі списку і вирівнює його на один рівень. Ці значення також зберігаються в, Yі коли ми друкуємо, ми видаляємо порожні значення шляхом фільтрації, якщо відсортоване значення списку є правдоподібним.

Тестовий сюїт

Як варіант, відповідь на 15 байт із сумнівним вихідним форматом:

 us-GpWJsI#GJQ)

Тестовий сюїт

Розширення:

 us-GeaYsI#GQ)S#Y     ##   Q = eval(input)
 u          Q)        ##   reduce to fixed point, starting with G = Q
        sI#G          ##   get the values that are not lists from G
                      ##   this works because s<int> = <int> but s<list> = flatter list
      aY              ##   append the list of these values to Y
     e                ##   flatten the list
   -G                 ##   remove the values in the list from G
              S#Y     ##   remove empty lists from Y




1

Mathematica 55 64 62 байт

#~Select~AtomQ/.{}->Nothing&/@Table[Level[#,{k}],{k,Depth@#}]&

%&[{1, 2, {3, {4, 5}, 6, {7, {8}, 9}}}]

{{1, 2}, {3, 6}, {4, 5, 7, 9}, {8}}


1

JavaScript, 112 80 байт

F=(a,b=[],c=0)=>a.map(d=>d!==+d?F(d,b,c+1):b[c]=[...b[c]||[],d])&&b.filter(d=>d)

Дякую Нілу за те, що він допомагає відголити 32 байти.


1
Тут багато можливостей для гри в гольф. Деякі легкі з них - це видалити так, !=nullяк nullце хибне. b=Також немає необхідності. Вилучивши, ви можете потім перейти .filter(a=>x)до тієї, &&bяка потім зменшує зовнішню функцію до виклику внутрішньої функції, яку ви можете потім вбудувати. Я залишив з цим: f=(a,b=[],c=0)=>a.map(d=>d[0]?f(d,b,c+1):b[c]=[...b[c]||[],d])&&b.filter(d=>d).
Ніл

@Neil d[0]?оцінив би, falseчи дорівнює вона 0, що знаходиться в межах діапазону [-100,100]. І так биd=>d
Патрік Робертс

@Neil Кинув це в поспіху, тому я знав, що є інші можливості зменшити його, але це набагато краще, ніж я міг би зробити тоді. Спасибі! О, і Патрік має рацію, коли нульова перевірка необхідна саме з цієї причини. Я пішов з d===+dхоч, оскільки це економить 2 байти під час нульової перевірки.
Mwr247

1
@Dendrobium Це не [...,[[...]]]
вирішить

1
@PatrickRoberts d=>dвсе в порядку, оскільки dце завжди масив або нуль в цій точці, але справедлива точка щодо d[0], хоча завжди є d.mapяка-то правда для масиву, але хибна для числа.
Ніл


0

Пітон, 108 99 байт

Мені це здається трохи довгим, але я не міг скоротити одноколірний ліній, і якщо я спробую використовувати orзамість if, я отримую порожні списки в результатах.

def f(L):
    o=[];i=[];j=[]
    for x in L:[i,j][[]<x]+=[x]
    if i:o+=[i]
    if j:o+=f(sum(j,[]))
    return o

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

Редагувати: Збережено 9 байт завдяки переповненню стека


Ви повинні змінити відступи на одиничні пробіли, щоб вони відображалися належним чином у блоці коду. Ви також filter(None,o)можете видалити порожні списки, які знаходяться на самому зовнішньому рівні гніздування o.
Мего

Я вважаю за краще переглядати свій код за допомогою вкладок. Простори - це зло.
mbomb007

SE Markdown перетворює вкладки на 4 проміжки, тому жодного разу не уникає їх :) Використання одного простору в Markdown робить кількість байтів кодового блоку фактично збігається з кількістю байтів коду.
Мего

Мій код сам містить вкладки, якщо ви хочете відредагувати його. Що враховує внутрішню сторону. ;)
mbomb007

0

Python 3, 109 байт

Як ніколи, дурні функції Python 2, такі як порівняння ints і lists, означають, що Python 3 виходить позаду. Ну добре...

def d(s):
 o=[]
 while s:
  l,*n=[],
  for i in s:
   try:n+=i
   except:l+=[i]
  if l:o+=[l]
  s=n
 return o

0

Perl, 63 байти

{$o[$x++]=[@t]if@t=grep{!ref}@i;(@i=map{@$_}grep{ref}@i)&&redo}

Вхід очікується в @i, виробництво в @o. (Я сподіваюся, що це прийнятно).

Приклад:

@i=[[54, [43, 76, [[[-19]]]], 20], 12];                              # input

{$o[$x++]=[@t]if@t=grep{!ref}@i;(@i=map{@$_}grep{ref}@i)&&redo}      # the snippet

use Data::Dumper;                                                    # print output
$Data::Dumper::Indent=0;  # keep everything on one line
$Data::Dumper::Terse=1;   # don't print $VAR =
print Dumper(\@o);

Вихід:

[[12],[54,20],[43,76],[-19]]

0

Clojure, 119 байт

(116 із послідовністю та введенням у вигляді списків, тривіальна модифікація)

(defn f([v](vals(apply merge-with concat(sorted-map)(flatten(f 0 v)))))([l v](map #(if(number? %){l[%]}(f(inc l)%))v)))

Краще призначено:

(defn f([v]  (vals(apply merge-with concat(sorted-map)(flatten(f 0 v)))))
       ([l v](map #(if(number? %){l[%]}(f(inc l)%))v)))

При {level: value}виклику з двома аргументами (поточний рівень і колекція) він або створює одноелементну невпорядковану карту на зразок , або викликає fрекурсивно, якщо бачиться не число (імовірно колекція).

Потім ці міні-карти об'єднуються в єдині, sorted-mapа зіткнення ключів обробляються concatфункцією. valsповертає значення карти з першого рівня до останнього.

Якщо число є єдиним на своєму рівні, воно залишається а vec, інші перетворюються на списки по concat.

(f [[54, [43, 76, [[[-19]]]], 20], 12])
([12] (54 20) (43 76) [-19])

Якщо введення було listзамість того, vecтоді його number?можна було б замінити seq?, як не дивно, вектор є, seq?але він є sequential?. Але я лінивий реалізовувати цю версію, повторювати приклади тощо.


0

Ракетка 259 байт

(let((ol'())(m 0))(let p((l l)(n 0))(cond[(empty? l)][(list?(car l))(set! m(+ 1 n))
(p(car l)(+ 1 n))(p(cdr l)n)][(set! ol(cons(list n(car l))ol))(p(cdr l)n )]))
(for/list((i(+ 1 m)))(flatten(map(λ(x)(cdr x))(filter(λ(x)(= i(list-ref x 0)))(reverse ol))))))

Безголівки:

(define (f l)
  (define ol '())
  (define maxn 0)
  (let loop ((l l)              ; in this loop each item is added with its level
             (n 0))
    (cond
      [(empty? l)]
      [(list? (first l))
       (set! maxn (add1 n))
       (loop (first l) (add1 n))
       (loop (rest l) n)]
      [else
       (set! ol (cons (list n (first l)) ol))
       (loop (rest l) n )]))

  ; now ol is '((0 1) (0 2) (1 3) (2 4) (2 5) (1 6) (2 7) (3 8) (2 9)) 

  (for/list ((i (add1 maxn)))   ; here similar levels are combined
    (flatten
     (map (λ (x) (rest x))      ; level numbers are removed
          (filter (λ (x) (= i(list-ref x 0)))
                  (reverse ol))))))

Тестування:

(f '[1 2 [3 [4 5] 6 [7 [8] 9]]])

Вихід:

'((1 2) (3 6) (4 5 7 9) (8))

0

MATL , 37 байт

j']['!=dYsXKu"GK@=)'[\[\],]'32YXUn?1M

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

Працює з поточним випуском (13.0.0) мови / компілятора.

Це дає результат у вигляді рядків з розділеними пробілами значеннями, де кожен рядок відповідає одному і тому ж рівню вкладення, а різні рівні вкладення розділені новими рядками.

j            % read input as string (row array of chars)
']['!        % 2x1 array containing ']'  and '['
=            % test for equality, all combinations
d            % row array obtained as first row minus second row
Ys           % cumulative sum. Each number is a nesting level
XK           % copy to clibdoard K
u            % unique values: all existing nesting levels
"            % for each nesting level
  G          %   push input
  K          %   push array that indicates nesting level of each input character
  @          %   push level corresponding to this iteration
  =          %   true for characters corresponding to that nesting level
  )          %   pick those characters
  '[\[\],]'  %   characters to be replaced
  32         %   space
  YX         %   regexp replacement
  U          %   only numbers and spaces remain: convert string to array of numbers
  n?         %   if non-empty
    1M       %     push that array of numbers again
             %   end if implicitly
             % end for each implicitly
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.