Згладьте масив!


34

У цьому виклику ваше завдання - створити програму, яка займає вкладений масив і повертає одновимірний сплющений масив. Для прикладу [10,20,[30,[40]],50]слід вивести [10,20,30,40,50].


Вхідні дані

Вхід буде вкладеним масивом (напр. [10,20,[[[10]]]]). Він буде містити лише цілі числа (як негативні, так і позитивні), рядки та масиви. Ви можете взяти введення як аргумент функції, STDIN або що завгодно відповідно до вашої мови. Можна припустити, що вхідний масив не матиме порожній масив.


Вихідні дані

Виведенням буде плоский одновимірний масив з тими ж елементами того ж типу, що і в вкладеному масиві та в порядку SAME.


Випробування

[10,20,30] -> [10,20,30]
[[10]] -> [10]
[["Hi"],[[10]]] -> ["Hi",10]
[[[20],["Hi"],"Hi",20]] -> [20,"Hi","Hi",20]
[[["[]"],"[]"]] -> ["[]","[]"]


Не соромтеся запитувати будь-які роз’яснення, використовуючи коментарі. Це , тому найкоротший код у байтах виграє!

Примітка: Якщо ваша мова містить вбудований для цього, ви її НЕ повинні використовувати.


Редагувати

Будь ласка, додайте посилання на веб-сайт, на якому ваш код може бути виконаний.


7
Деякі мови трактують рядки як масиви, чи [["Привіт"], [[10]]] -> ["H", "i", 10] добре?
Адам

4
@Mego Я теж був здивований, коли дізнався, що питання про PPCG виникло, unflattenале flattenпитання не виникало.
Арджун

3
Що робити, якщо ваша мова підтримує лише підрядні маси одного розміру? (Наприклад, Java?) Що робити, якщо тип кожного елемента повинен бути однаковим? (Наприклад, Java, C ++ тощо?) Також, будь ласка, додайте, наприклад ["[",[["[",],'[',"['['"]], тестовий випадок.
невдача

4
@flawr Цей тестовий випадок має сенс лише для мов, які підтримують бот 'і "як роздільники. (Але я згоден , що тест з участю [, ], "і \всередині рядка , було б корисно.)
Мартін Ендер

4
Тестові випадки також виключають мови, які не підтримують такі види масивів з декількома типами, або з іншим позначенням для літералів масиву.
flawr

Відповіді:


40

К, 3 байти

,//

Це досить поширена ідіома. Msgstr "Приєднатися до конвергенції".

спробуйте тут .

Як це працює:

Join ( ,) зливається разом з атомами або списками, щоб створити список. Over ( /) приймає дієслово (в даному випадку приєднуйтесь) і застосовує його між кожним елементом списку, зліва направо. Таким чином, з'єднання ,/вирівняє всі елементи верхнього рівня списку. Символ /насправді має різні значення залежно від валентності (кількості аргументів) дієслова, з яким він складається. Коли ми подаємо ,/як дієслово, остаточні /дії діють як "конвергенція" - це неодноразово застосовується ,/до вводу, поки він не перестане змінюватися. Деякі інші мови називають таку функцію, як "комбінатор з фіксованою точкою". Неодноразово перетворюючи списки нижнього рівня, ви зрештою дістанетесь до єдиного плоского списку, і жодна операція не порушить порядок елементів. Це, здається, вирішує проблему.


1
Гаразд, дякую за пояснення! Хай вам заробляють +1.
Значення чорнила


1
Я придумав той самий алгоритм (але не цією мовою). +1 для вибору потрібної мови для її впровадження!
Cyoce

@Cyoce Якщо у вашій мові є еквіваленти трьох використовуваних тут операторів, це надзвичайно природне рішення. У будь-якому разі розмістіть свою варіацію.
JohnE

1
@JohnE Довга історія, я вивожу мову з алгоритмів, які я придумав, тому мова ще не закінчена (і таким чином реалізована).
Cyoce

38

JavaScript (ES6), 35 байт

Натхненний відповіддю @ user81655 :

f=a=>a.map?[].concat(...a.map(f)):a

3
Дуже розумний! +1 для [ab], використовуючи дивний спосіб JS поводження з відсутніми ключами!
Cyoce

Я можу це перемогти.
Лисий Бантха

@BaldBantha: Ми з нетерпінням чекаємо вашої відповіді :-)
Бергі

2
Crap NVM My 33-байтне рішення не вдається в одному з тестових випадків. NOOOO
Лисий Бантха

2
@BaldBantha, з'єднання-розділення не вдасться на коми всередині рядків.
Qwertiy

19

Математика, 16 14 байт

{##&@@#&//@#}&

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

{##&@@#&//@#}& @ {{{20}, {"Hi"}, "Hi", 20}}
(* {20, "Hi", "Hi", 20} *)

Пояснення

Синтаксична цукрова вечірка!

Щоб зрозуміти , як це працює, зверніть увагу , що кожен вираз в Mathematica є або атом (наприклад , числа, рядки, символи) або з'єднання вираз виду f[a, b, c, ...], де f, a, b, cсамі є будь-якими виразами. Тут fназивається голова виразу. Все інше - лише синтаксичний цукор. Наприклад {a, b, c}, просто List[a, b, c].

Почнемо з того, //@яка відображає функції на всіх рівнях списку. Наприклад:

f //@ {{{20}, {"Hi"}, "Hi", 20}}
(* f[{f[{f[{f[20]}], f[{f["Hi"]}], f["Hi"], f[20]}]}] *)

Зауважте, що це карти f атоми, а також складні вирази. Зараз ми шукаємо спосіб позбутися від списків і зберегти все інше.

ApplyФункція зазвичай використовується для подачі елементів списку в вигляді окремих аргументів функції, але його фактичне визначення є більш загальним і просто замінює главу вираження. Напр. Apply[g, f[a, b]]Дає g[a, b].

Зараз є спеціальна «голова», яка називається, Sequenceщо просто зникає. Напр. {a, Sequence[b, c], d}Оцінюється до {a, b, c, d}. Ідея вирівнювання списку полягає в тому, щоб замінити Sequenceзаголовки всіх внутрішніх списків таким чином, щоб вони потрапляли в їх навколишній список. Тож те, що ми хочемо, - Applyце голова Sequenceдо списків. Зручно, якщо ми Applyщось до атома, він просто залишає атом незмінним, тому нам взагалі не потрібно розрізняти типи виразів.

Нарешті, є одна невелика проблема: fтакож застосовується до самого зовнішнього рівня, так що вона також видаляє самий зовнішній List, який ми не хочемо. Найкоротший спосіб боротьби з цим - просто знову загорнути результат у список, щоб оточуючі Sequenceмогли спокійно зникнути.

Зауважте, що в коді немає ні цього, Applyні Sequence. @@це форма оператора Applyі ##&є стандартним трюком для гольфу, щоб скоротити довге вбудоване ім'я Sequence. Тож, дещо все переймаємось, ми отримуємо щось на кшталт:

flatten[list_] := { MapAll[Apply[Sequence], list] }

Детальніше про те, як і чому це ##&працює, дивіться у розділі "Послідовність аргументів" у моїй відповіді на поради щодо математики .


Перший раз я бачив //@. Дуже корисно знати про!
DavidC

//@фіксує акуратний візерунок. Трохи нагадує мені про деякі рекурсивні комбінатори в Joy. Чи є у вас посилання на гарне посилання на будь-які пов'язані функції в Mathematica? Мене дуже цікавлять способи розподілу явної рекурсії з програм.
JohnE

1
@JohnE Ну ось ось документи . Ви також можете подивитися на таких речах , як Map, MapAt, Apply, а також Replaceі пов'язані з ними функції. Взагалі, хоча існує багато функцій, які приймають необов'язковий параметр levelspec (див. Моє оригінальне 16-байтове рішення), що дозволяє застосовувати функцію на кількох / усіх рівнях одночасно.
Мартін Ендер

12

Python 2, 43 байти

f=lambda l:[l]*(l*0!=[])or sum(map(f,l),[])

У списку рекурсує по елементах і об'єднує результати. У рядку чи цифрі, укладається в однотонний список.

На жаль, Python 2 замовляє тип int < list < stringбутербродів listміж іншими, вимагаючи перевірити дві нерівності. Отже, натомість l*0перевіряється на порожній список [], інакше надаючи 0або "".


10

Рубі, 43 42 34 байт

Рекурсивне рішення. Тепер за винятком обробки! (може також похвалитись @akostadinov за натхнення на зміну)

f=->a{a.map(&f).inject:+rescue[a]}

IDEOne посилання


kudos for shortness, awesome
akostadinov

Я не знаю , що ви могли б використовувати rescueподібне
Cyoce

1
@Cyoce Я думаю, що це тому, що у Ruby технічно немає tryблоку, тому ви використовуєте beginнатомість для розмежування частин, які ви хочете ловити, та частин, які вам не потрібні. Отже, оскільки ви ловите за весь інший блок перед ним, технічно вам це не потрібно? Решта - просто оброблена пробіл, оскільки Рубі трактує рядок як...inject(:+) rescue [a]
Value Ink

1
@ KevinLau-notKenny, ні, порятунок на одній лінії різний, просто рятуючи цю лінію. наприклад a = raise("haha") rescue 1, призначив 1би a. Це '
акостадінов

@ KevinLau-notKenny Там є рядок rescue, як і вбудований, ifі while.
Фонд позову Моніки

8

JavaScript (ES6), 41 байт

f=a=>[].concat(...a.map(v=>v.pop?f(v):v))
<textarea id="input" rows="6" cols="40">[[[20],["Hi"],"Hi",20]]</textarea><br /><button onclick="result.textContent=JSON.stringify(f(eval(input.value)))">Go</button><pre id="result"></pre>


8

Perl 6 , 24 байти

{gather {$_».&{.take}}}

Пояснення:

{ # has $_ as an implicit parameter

  gather {

    $_\ # the parameter from the outer block
    »\  # for each single value in the structure
    .&( # call the following block as if it was a method
      { # this block has its own $_ for a parameter
        .take # call the .take method implicitly on $_
      }
    )
  }
}

Тест:

#! /usr/bin/env perl6

use v6.c;
use Test;

my &flatten = {gather {$_».&{.take}}}

my @tests = (
  [10,20,30], [10,20,30],
  [[10,],], [10,],
  [["Hi",],[[10,],],], ["Hi",10],
  [[["[]",],"[]"],], ["[]","[]"],
);

plan @tests / 2;

for @tests -> $input, $expected {
  # is-deeply cares about the exact type of its inputs
  # so we have to coerce the Seq into an Array
  is-deeply flatten($input).Array, $expected, $input.perl;
}
1..4
ok 1 - $[10, 20, 30]
ok 2 - $[[10],]
ok 3 - $[["Hi"], [[10],]]
ok 4 - $[[["[]"], "[]"],]

7

Haskell, 43 байти

data D a=L a|N[D a]
f(L x)=[x]
f(N l)=f=<<l

Haskell не має ні вкладених списків з різною глибиною підсписок, ні змішаних типів для елементів списку. Для введення я визначаю користувальницький тип даних, Dякий є або аркушем, Lякий містить якийсь елемент, або вузлом, Nякий є списком Ds. Для змішаних елементів я використовую попередньо визначений тип даних, Eitherякий поєднує два типи в один тут Either String Integer. Новий тип Dі функція вирівнювання fповністю поліморфні за типом листових елементів, тому мені не потрібно додатково піклуватися ні про що Either.

Приклад використання: f (N[N[L(Right 20)], N[L(Left "Hi")], L(Left "Hi") , L(Right 20)])-> [Right 20,Left "Hi",Left "Hi",Right 20].


6

Pyth, 7 6 5 байт

us+]Y

Спробуйте в Інтернеті: Демонстрація або Тестовий набір

Але звичайно, є також вбудована функція, яка справляється із завданням всього в 2 байти: .n( Тестовий набір )


Всього 3 від поточного переможця! +1
Арджун

@Sting: Полюбив ще один байт. Забув, що Pyth додає останнього символу Gнеявно, якщо я не напишу його.
Якубе

Вітаємо!
Арджун

6

JavaScript (Firefox 30-57), 43 байти

f=a=>a.map?[for(b of a)for(c of f(b))c]:[a]

Просто тому, що я навіть міг уникати використання concat.


Чи це не ECMAScript 6, не Firefox 30+ ?
Соломон Учко

1
@SolomonUcko Ні, [for(of)]доступний лише у Firefox 30+. Він був запропонований для ES7, але згодом відмовився.
Ніл

1
дякую за пояснення! Здебільшого, я просто думав, що цеfor(__ in __)
Соломон Учко

@SolomonUcko [for (in)] був альтернативним експериментальним синтаксисом, який дав вам ключі від об'єкта.
Ніл

5

Perl, 34 29 байт

Функції.

Якщо вам потрібно вирівняти список, наприклад my @a = f(@a), 29 байт:

sub f{map{ref()?f(@$_):$_}@_}

Перевірте це на Ideone

Якщо вам потрібно вирівняти масив ref like my $a = f($a), 34 байти:

sub f{[map{ref()?@{f(@$_)}:$_}@_]}

Перевірте це на Ideone .

Perl 5.22.0+, 27 байт

Завдяки плити .

Якщо вам потрібно зрівняти список, наприклад my @a = f(@a), 27 байт:

sub f{map{ref?f(@$_):$_}@_}

Перевірте його на JDoodle

Якщо вам потрібно вирівняти масив ref like my $a = f($a), 32 байти:

sub f{[map{ref?@{f(@$_)}:$_}@_]}

Перевірте його на JDoodle .


Я не перевіряв цього, але думаю, що він ?@{f@$_}:повинен працювати замість цього ?@{f(@$_)}:, зберігаючи два байти.
msh210

1
@ msh210 Ні, це не працює. Компілятор не показує, що fце функція, оскільки fще не оголошено. sub f{}sub f{... f@$_ ...}робочий.
Денис Ібаєв

1. refне потрібно паронів для роботи, економлячи 2 байти. 2. Наскільки я бачу, sub f{map{ref?f(@$_):$_}@_}це в межах правил і зберігає ще 5. fбере масив (nonref) як список, щоб він міг повернути той самий.
варення

@hobbs 1. Якщо немає дужок, refтоді компілятор припускає, що ?, наприклад, починається ?PATTERN?операція ref(?PATTERN?). Тож компілятор шукає друге ?і видає помилку.
Денис Ібаєв

@DenisIbaev ах. ?PATTERN?було видалено в 5.22.0 ( m?PATTERN?досі працює), і я тестую останню версію. Таким чином, ви можете отримати ці два байти, вказавши 5.22+.
варення

4

Джулія, 29 байт

f(x,y=vcat(x...))=x==y?x:f(y)

Це рекурсивне вливання в сполучену функцію до досягнення фіксованої точки. Приклад

julia> f([1,[2,[3,[4,[5,[6]]]]]])
6-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6

3

Сітківка , 30 байт

1>`("(\\.|[^"])+")|[][]
$1
$
]

Спробуйте в Інтернеті!(Перший рядок використовується лише для запуску декількох тестових випадків одночасно.)

У Retina немає поняття масивів, рядкових літералів чи чисел, тому я вирішив перейти з "загальним" вхідним форматом [...,...]масивів стилів і "-розділеними рядками, де \можна використовувати всередині рядків, щоб уникнути будь-якого символу (зокрема "і\ сам по собі).

Сама програма просто відповідає або повному рядку, або квадратній дужці, і замінює їх, $1якими зберігає рядки та видаляє квадратні дужки. Ліміт 1>пропускає перший матч, щоб ми не зняли ведучого [. Однак це все-таки видаляє трейлінг ], тому ми додаємо його на окремому етапі.


3

Пайк, 11 байт

.F~]+=])K~]

Спробуйте тут!

Пояснення:

.F~]+=])    - Deep for loop
  ~]        -    contents of `]` ([] by default)
    +       -  ^+i
     =]     - `]` = ^
        K~] - Output value
        K   - Remove the output from the for loop
         ~] - Return the contents of `]`

Або 7 байт після виправлення

M?+]K~]

Спробуйте тут!

Пояснення:

M?+]    - Deep map
 ?+]    -  `]` = `]`+i
    K~] - Output value
    K   - Remove the output from the for loop
     ~] - Return the contents of `]`

Or even 2 bytes if printing to stdout is allowed (This might come under built-ins)

M
<newline required>

Try it here!

This deeply applies the print_newline function to every non-sequence item in the input and recurses for sequence items.


Just 4 away from K! +1
Arjun

3

Java (v8) 390 276 bytes

public static Object[] f(final Object[]a) {
    List<Object>r=new ArrayList<>();boolean t=false;int n=0;
    for(final Object p:a)
        if(t=p instanceof Object[]){for(final Object q:(Object[])p) r.add(q);}
        else r.add(p);
    return(t)?f(r.toArray()):r.toArray();
}  

Just for completeness and all that. :) Can't say Java's code-efficient.


3
Hello, and welcome to PPCG! This question is code-golf, so please try to minimize your code. Thanks!
NoOneIsHere

3
Remove all the unnecessary spaces, tabs, and newlines. Change oaf to o, and change flatten to f.
NoOneIsHere

2
You don't need the finals, the whole thing can be a lambda, you don't need public static...
David Conrad

1
you could save couple characters if you use generics instead object
user902383

1
you could also save 2 bytes if you replace false with 1>2, and additional 2 bytes you could get if you declare n but not define (compiler automatically define it as 0)
user902383

2

Python, 57 bytes

f=lambda a:sum([list==type(x)and f(x)or[x]for x in a],[])

Try it online: Python 2, Python 3

Thanks to Kevin Lau for the list==type(x) trick.


2
type(x)==list is shorter than isinstance(x,list).
Value Ink

1
“It will contain only Integers (both negative and positive), Strings and Arrays.” How about [`x`>'['and...? (That works in Python 2 only.)
Lynn

2

Ruby

there is builtin flatten method.

You can run here: http://www.tutorialspoint.com/execute_ruby_online.php

One 43 bytes, but thought to share:

f=->a{a.inject([]){|r,e|r+(f[e]rescue[e])}}

One 45 bytes that is more efficient than the previous and the other ruby answer:

f=->a{a.map{|e|Array===e ?f[e]:[e]}.inject:+}

here's benchmark:

require 'benchmark'
n=10^9
arr=[[[20],[[[[[[[[123]]]]]]]],"ads",[[[[[[[4]]]]]]],5,[[[[[[[[[[6]]]]]]]]]],7,8,[[[[[[[[[[9]]]]]]]]]],[[[[[[[[[[0]]]]]]]]]],[[[[[[[[[[[["Hi"]]]]]]]]]]]],[[[[[["Hi"]]]]]],[[[[[20]]]]]]]
Benchmark.bm do |x|
  x.report { f=->a{a.map(&f).inject:+rescue[a]}; f[arr] }
  x.report { f=->a{a.map{|e|e!=[*e]?[e]:f[e]}.inject:+}; f[arr] }
  x.report { f=->a{a.inject([]){|r,e|r+(f[e]rescue[e])}}; f[arr] }
  x.report { f=->a{a.map{|e|Array===e ?f[e]:[e]}.inject:+}; f[arr] }
end

result:

       user     system      total        real
   0.010000   0.000000   0.010000 (  0.000432)
   0.000000   0.000000   0.000000 (  0.000303)
   0.000000   0.000000   0.000000 (  0.000486)
   0.000000   0.000000   0.000000 (  0.000228)

1
Hello, and welcome to PPCG! Unfortunately, your answer is not valid, because of this rule: Note: If your language contains a built-in for this, then you must NOT use it.
NoOneIsHere

@NoOneIsHere, thanks, didn't know that
akostadinov

1
How does my new update stack against time-wise against yours? Also, just like my new answer, you can remove the spaces around rescue
Value Ink

@KevinLau-notKenny updated, thanks! rescue looks to be rather slow btw, like try/catch in java
akostadinov

1
Update your bytecount, too
Value Ink


2

Clojure, 68 bytes

(def f #(if(some vector? %)(f(mapcat(fn[z](if(vector? z)z[z]))%))%))

mapcat first applies function to each element and then concats results. So every time it concats one 'nesting level' is lost. Concat does not work on not sequences so elements have to be wrapped into vector if they're not vector.

You can try it here: http://www.tryclj.com

(f [[[20],["Hi"],"Hi",20]])
(f [[["[]"],"[]"]])

Nice first code-golf. +1 :)
Arjun

2

ANSI C, 193 bytes

#define b break;
#define c case
#define p putch(_);
char f;main(_){switch(_){c 1:putch(91);b c 34:f^=1;p b c 91:f&&p b c 93:f&&p b c 10:c 13:putch(93);return;default:p}_=getch();main(_);}

:-/, any suggestions? Btw, I did try to find an online source to compile this but the WL is strict for this code to compile. It will work for VS and gcc otherwise.


2
Welcome to PPCG!
Martin Ender

1
Welcome to PPCG! Nice first golf. Good luck ahead!
Arjun

Thanks! It was an attempt to up my points so that I can get commenting privileges elsewhere. It appears things don't work like that the accounts are for different portals. :D I will see if some nifty features from c++ can be used.
amritanshu

2

JavaScript 20 bytes

a=>(a+[]).split(',')

The array + array is equal to array.toString


@WheatWizard thanks for the welcome and I am new to the site. actually a is an argument of the function. I will try to edit out the function now.
i--

I think now it's ok @WheatWizard. Please let me know if there is a problem with this
i--

1
Actually looking at the javaScript docs an anonymous function would definitely be shorter, you would only have to add a=> to the beginning of your code.
Wheat Wizard

@WheatWizard I updated with the arrow function as you mentioned. But I have to remove the snippet because arrow function doesn't support direct invoke. It is only for callbacks
i--

1
This doesn't handle strings with commas in them correctly
Jo King

2

C#, 48 bytes

()=>{$"[{i.Replace("[","").Replace("]","")}]";};

Thought I'd post it also since nobody has given a C# solution yet. Suggestions welcome!


Welcome to the site. I haven't programmed in C# in a while but it looks to me that you might have a couple of issues. For one how is i initialized? and are you sure it works on the [["[]"],"[]"] example?
Wheat Wizard

Sorry, i is the input passed in as a string. An empty array would just translate to an empty string.
PmanAce

How about the last testcase? Also, I presume you meant to do i=>$"{i.Replace("[","").Replace("]","")}"?
Embodiment of Ignorance

Sadly doesn't work in the last case, it will get rid of empty array. :(
PmanAce

This answer doesn't pass the final test case. Since it has not been fixed for a few months, I'm voting to delete it.
mbomb007

1

Racket, 63 bytes

(define(f l)(apply append(map(λ(x)(if(list? x)(f x)`(,x)))l)))

1

Java 8 165 chars

import java.util.*;<T>T[]f(T[]a){List<T>l=new ArrayList<>();for(T e:a)if(e instanceof Object[])Collections.addAll(l,f((T[])e));else l.add(e);return(T[])l.toArray();}

Ungolfed into a class:

public class Q80096 {

    public static <T> T[] flatten(T[] array) {
        List<T> flattenedList = new ArrayList<>();
        for (T element : array)
            if (element instanceof Object[])
                 Collections.addAll(flattenedList, flatten((T[]) element));
            else
                flattenedList.add(element);
        return (T[]) flattenedList.toArray();
    }
}

This answer is based on Jeremy Harton's approach. I used it changed it in some places and created a more golf-like version.


would it be not better when using Arrays.asList() on "array" and then go the foreach with lambda and end this with a Collector?
Serverfrog

1

JavaScript, 17 Bytes

a=>eval(`[${a}]`)

Finally, JavaScript's type conversions can be put to some good use! Please note that this will actually output an array, but string conversion (putting it into HTML) causes it to become a comma separated list.

If comma separated lists are acceptable output, then the following is valid:

7 Bytes

a=>""+a

NOTE: Snippet is broken for some reason

var subject = 
  a=>eval(`[${a}]`)
<input oninput="try {output.innerHTML = subject(this.value)} catch(e) {output.innerHTML='Invaild Input'}" />
<div id="output"></div>


3
This doesn't seem to work when run in the console for input ["["]... I tried running (a=>eval([${a}]))(["["]) and got a SyntaxError
jrich

@jrich. You just get this error when you type character by character. If you copy and paste any valid array, it will work as expected. By the way, nice answer SpeedNinja, I would only change oninput event with a button click.
Washington Guedes

This doesn't work for strings with commas in them
Jo King


1

Attache, 14 bytes

{Reap[Sow@>_]}

Try it online!

Fortunately, Attache has a "vectorization" operator, which applies a function at the atoms of a list. In this case, all we need to do is to set up a reaper with Reap and Sow all atoms of the input _ with @>. I think it's quite elegant.

Alternatives

15 bytes: Fixpoint{`'^^_}

16 bytes: Fixpoint!&Concat

17 bytes: {q:=[]q&Push@>_q}

17 bytes: Fixpoint[&Concat]


1

Elixir, 74 bytes

def d(l)do l|>Stream.flat_map(fn x->if is_list(x)do d(x)else[x]end end)end

First Elixir answer, so can probably be golfed a bit.

Try it online.

Explanation:

def d(l)do l|>            # Recursive method taking a list as input:
  Stream.flat_map(fn x->  #  Map over each item `x` of the input-list:
    if is_list(x)do       #   If `x` is a list itself:
      d(x)                #    Do a recursive call with `x`
    else                  #   Else:
      [x]                 #    Simply leave `x` unchanged
    end                   #   End of the if-else statements
  end)                    #  End of the map
end                       # End of the recursive method

Of course, if builtins were allowed, this could have been 25 bytes instead:

fn(l)->List.flatten(l)end

Try it online.



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