Appiattisci l'array!


34

In questa sfida, il tuo compito è quello di creare un programma che accetta un array nidificato e restituisce un array appiattito monodimensionale. Ad esempio [10,20,[30,[40]],50]dovrebbe essere prodotto [10,20,30,40,50].


Ingresso

L'input sarà un array nidificato (ad es. [10,20,[[[10]]]]). Conterrà solo numeri interi (sia negativi che positivi), stringhe e array. Puoi prendere l'input come argomento di funzione, STDIN o qualunque cosa sia adatta alla tua lingua. Si può presumere che l'array di input non abbia un array vuoto.


Produzione

L'output sarà un array monodimensionale piatto con gli stessi elementi dello stesso tipo dell'array nidificato e nell'ordine SAME.


Casi test

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


Sentiti libero di chiedere qualsiasi chiarimento usando i commenti. Questo è , quindi vince il codice più corto in byte!

Nota: se la tua lingua contiene un built-in per questo, NON devi usarlo.


modificare

Includere anche un collegamento a un sito Web in cui è possibile eseguire il codice.


7
Alcune lingue trattano le stringhe come matrici, è [["Hi"], [[10]]] -> ["H", "i", 10] ok?
Adám,

4
@Mego Sono stato sorpreso anche di scoprire che c'era una unflattendomanda, ma nessuna flattendomanda su PPCG.
Arjun,

3
Cosa succede se la tua lingua supporta solo subarray della stessa dimensione? (Ad esempio Java?) Cosa succede se il tipo di ciascun elemento deve essere lo stesso? (Ad esempio Java, C ++ ecc.?) Inoltre, si prega di aggiungere ad esempio ["[",[["[",],'[',"['['"]]come caso di test.
flawr

4
@flawr Quel test case ha senso solo per le lingue che supportano i bot 'e "come delimitatori. (Ma sono d'accordo che un banco di prova coinvolgente [, ], "e \all'interno di una stringa sarebbe utile.)
Martin Ender

4
I casi di test escludono anche le lingue che non supportano questo tipo di array con più tipi o con un'altra notazione per i letterali array.
flawr

Risposte:


40

K, 3 byte

,//

Questo è un linguaggio abbastanza comune. "Join over converge".

provalo qui con oK .

Come funziona:

Join ( ,) fonde insieme atomi o liste per produrre un elenco. Over ( /) prende un verbo (in questo caso join) e lo applica tra ogni elemento di un elenco, da sinistra a destra. Pertanto, il composto ,/appiattirà tutti gli elementi di livello superiore dell'elenco. Il simbolo in /realtà ha significati diversi a seconda della valenza (numero di argomenti) del verbo con cui è composto. Quando forniamo ,/come verbo, il finale /funge da "convergenza" - si applica ripetutamente ,/all'input fino a quando non smette di cambiare. Alcune altre lingue chiamano una caratteristica come questa un "combinatore a punto fisso". Unendo ripetutamente gli elenchi di livello inferiore, alla fine arriverete a un unico elenco piatto e nessuna delle operazioni perturberà l'ordine degli elementi. Questo sembra risolvere il problema.


1
Va bene, grazie per la spiegazione! Ottieni il tuo meritato +1.
Value Ink,


1
Ho escogitato lo stesso algoritmo (ma non in questa lingua). +1 per aver scelto la lingua giusta per implementarla!
Cyoce,

@Cyoce Se la tua lingua ha equivalenti ai tre operatori usati qui, è una soluzione estremamente naturale. Pubblica in ogni caso la tua variante.
Giovanni,

1
@JohnE Per farla breve, sto derivando un linguaggio dagli algoritmi che trovo, quindi il linguaggio non è ancora finito (e quindi implementato).
Cyoce,

38

JavaScript (ES6), 35 byte

Ispirato dalla risposta di @ user81655 :

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

3
Molto intelligente! +1 per [ab] usando lo strano modo di JS di gestire le chiavi mancanti!
Cyoce,

Posso batterlo.
Bald Bantha,

@BaldBantha: non vediamo l'ora di avere la tua risposta :-)
Bergi,

2
Crap NVM La mia soluzione a 33 byte non riesce in uno dei casi di test. NOOOO
Bald Bantha,

2
@BaldBantha, join-split fallirà nelle virgole all'interno delle stringhe.
Qwertiy,

19

Mathematica, 16 14 byte

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

Una funzione senza nome che accetta e restituisce un elenco, ad esempio:

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

Spiegazione

Zucchero sintattico!

Per capire come funziona, nota che ogni espressione in Mathematica è o un atomo (ad esempio numeri, stringhe, simboli) o un'espressione composto di forma f[a, b, c, ...], in cui f, a, b, csono essi stessi espressioni arbitrarie. Qui, fsi chiama il capo dell'espressione. Tutto il resto è solo zucchero sintattico. Ad esempio {a, b, c}è giusto List[a, b, c].

Iniziamo con //@quale mappa funziona a tutti i livelli di un elenco. Per esempio:

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

Si noti che questo mappa fsu atomi e espressioni composte. Ciò che stiamo cercando ora è un modo per sbarazzarci delle intestazioni dell'elenco e mantenere tutto il resto.

La Applyfunzione viene normalmente utilizzata per alimentare gli elementi di un elenco come argomenti separati di una funzione, ma la sua definizione effettiva è più generale e sostituisce semplicemente la testa di un'espressione. Ad esempio, Apply[g, f[a, b]]g[a, b].

Ora c'è una speciale "testa" chiamata Sequenceche svanisce semplicemente. Ad esempio, {a, Sequence[b, c], d}valuta solo {a, b, c, d}. L'idea di appiattire l'elenco è quella di sostituire le teste di tutti gli elenchi interni in Sequencemodo che vengano divisi nella loro lista circostante. Quindi quello che vogliamo è andare in Applytesta Sequencealle liste. Convenientemente, se noi facciamo Applyqualcosa per un atomo, questo lascia solo invariato l'atomo, quindi non dobbiamo affatto distinguere tra tipi di espressioni.

Infine, c'è un piccolo problema: fviene applicato anche al livello più esterno, in modo da rimuovere anche quello più esterno List, che non vogliamo. Il modo più breve per contrastare è semplicemente quello di racchiudere il risultato in un elenco, in modo che l'ambiente circostante Sequencepossa svanire in modo sicuro.

Nota che non c'è né ApplySequencenel codice. @@è una forma di operatore Applyed ##&è un trucco da golf standard per abbreviare il nome incorporato lungo Sequence. Quindi ungolf tutto un po ', otteniamo qualcosa di simile:

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

Per maggiori dettagli su come e perché ##&funziona, vedere la sezione "Sequenze di argomenti" nella mia risposta per i suggerimenti di Mathematica .


La prima volta che ho visto //@. Molto utile sapere!
DavidC,

//@cattura un modello pulito. Mi ricorda un po 'alcuni dei combinatori ricorsivi in ​​Joy. Hai un link a un buon riferimento ad eventuali funzioni correlate in Mathematica? Sono molto interessato ai modi di includere esplicitamente la ricorsione dai programmi.
Giovanni,

1
@JohnE Bene, ecco i documenti . Si potrebbe anche guardare le cose come Map, MapAt, Apply, così come Replacee funzioni correlate. In generale, tuttavia, ci sono molte funzioni che accettano un parametro levelpec opzionale (vedere la mia soluzione originale a 16 byte), che consente di applicare la funzione su più / tutti i livelli contemporaneamente.
Martin Ender,

12

Python 2, 43 byte

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

In un elenco, ricorre agli elementi e concatena i risultati. Su una stringa o un numero, racchiude in un elenco singleton.

Sfortunatamente, l'ordinamento di Python 2 per tipi di int < list < stringpanini listtra gli altri, che richiede due disuguaglianze da verificare. Quindi, invece, l*0viene confrontato con l'elenco vuoto [], altrimenti dando 0o "".


10

Rubino, 43 42 34 byte

Soluzione ricorsiva. Ora con gestione delle eccezioni! (potrebbe anche dare credito a @akostadinov per aver ispirato il cambiamento)

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

IDEOne link


complimenti per brevità, fantastico
Akostadinov

Non sapevo che potessi usare rescuecosì
Cyoce,

1
@Cyoce Penso che sia perché Ruby tecnicamente non ha un tryblocco, quindi usi begininvece per differenziare le parti che vuoi catturare e le parti che non hai. Quindi, poiché stai recuperando l'intero resto del blocco prima di esso, tecnicamente non ne hai bisogno? Il resto è solo uno spazio bianco, poiché Ruby interpreta la riga come...inject(:+) rescue [a]
Value Ink,

1
@ KevinLau-notKenny, no, il salvataggio sulla stessa linea è diverso, solo il salvataggio di quella linea. ad es. a = raise("haha") rescue 1assegnerei 1a a. E '
Akostadinov

@ KevinLau-notKenny C'è un inline rescue, come se ci fosse un inline ife while.
Finanzi la causa di Monica

8

JavaScript (ES6), 41 byte

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 byte

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

Spiegazione:

{ # 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 $_
      }
    )
  }
}

Test:

#! /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 byte

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

Haskell non ha elenchi nidificati con profondità diverse delle liste secondarie né tipi misti per gli elementi della lista. Per l'annidamento, definisco un tipo di dati personalizzato Dche è una foglia Lche contiene un elemento o un nodo Nche è un elenco di Ds. Per gli elementi misti uso il tipo di dati predefinito Eitherche combina due tipi in uno, qui Either String Integer. Il nuovo tipo De la funzione appiattisci fsono completamente polimorfici nel tipo di elementi fogliari, quindi non devo preoccuparmi di nulla Either.

Esempio di utilizzo: 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 byte

us+]Y

Provalo online: Dimostrazione o Test Suite

Ma ovviamente c'è anche una funzione integrata che gestisce l'attività in soli 2 byte: .n( Test Suite )


A soli 3 di distanza dall'attuale vincitore! +1
Arjun,

@Sting: golfato via un altro byte. Ho dimenticato che Pyth aggiunge Gimplicitamente l'ultimo carattere , se non lo scrivo.
Jakube,

Congratulazioni!
Arjun,

6

JavaScript (Firefox 30-57), 43 byte

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

Solo perché ho persino potuto evitare di usarlo concat.


No ECMAScript 6 Non Firefox 30+ ?
Solomon Ucko,

1
@SolomonUcko No, [for(of)] è disponibile solo in Firefox 30+. È stato proposto per ES7 ma in seguito è stato abbandonato.
Neil,

1
grazie per aver spiegato! Principalmente, pensavo solo che fossefor(__ in __)
Solomon Ucko

@SolomonUcko [for (in)] era una sintassi sperimentale alternativa che ti dava le chiavi dell'oggetto.
Neil,

5

Perl, 34 29 byte

Funzioni.

Se è necessario appiattire per elencare come my @a = f(@a), 29 byte:

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

Provalo su Ideone

Se è necessario appiattire come l'array ref my $a = f($a), come 34 byte:

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

Provalo su Ideone .

Perl 5.22.0+, 27 byte

Grazie a Hobbs .

Se è necessario appiattire per elencare come my @a = f(@a) , 27 byte:

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

Provalo su JDoodle

Se è necessario appiattire come l'array ref my $a = f($a), 32 byte:

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

Provalo su JDoodle .


Non l'ho provato, ma penso che ?@{f@$_}:dovrebbe funzionare invece di ?@{f(@$_)}:salvare due byte.
msh210,

1
@ msh210 No, non funziona. Il compilatore non khow fè una funzione perché fnon ancora dichiarato. sub f{}sub f{... f@$_ ...}lavoro.
Denis Ibaev,

1. refnon ha bisogno dei genitori per funzionare, risparmiando 2 byte. 2. Per quanto posso vedere, sub f{map{ref?f(@$_):$_}@_}rientra nelle regole e ne salva un altro 5. faccetta un array (non riferimento) come elenco, in modo che possa restituire lo stesso.
Hobbs,

@hobbs 1. Se non è presente alcuna parentesi, refil compilatore presuppone che l' operazione ?inizi ?PATTERN?come ref(?PATTERN?). Quindi il compilatore cerca il secondo ?e genera un errore.
Denis Ibaev,

@DenisIbaev ah. ?PATTERN?è stato rimosso in 5.22.0 ( m?PATTERN?funziona ancora) e sto testando una versione recente. Quindi puoi ottenere quei due byte specificando 5.22+.
Hobbs,

4

Julia, 29 byte

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

Questo è lo splatting ricorsivo in una funzione concatenata fino al raggiungimento di un punto fisso. Esempio

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

3

Retina , 30 byte

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

Provalo online!(La prima riga viene utilizzata solo per eseguire più casi di test contemporaneamente.)

Retina non ha alcun concetto di array, letterali o numeri di stringhe, quindi ho deciso di scegliere un formato di input "comune" di [...,...]array di stili e "stringhe delimitate, dove \può essere utilizzato all'interno delle stringhe per sfuggire a qualsiasi carattere (in particolare "e\ se stesso).

Il programma stesso abbina semplicemente una stringa intera o una parentesi quadra e le sostituisce con le $1quali mantiene le stringhe e rimuove le parentesi quadre. Il limite 1>salta la prima partita in modo da non rimuovere il primo [. Tuttavia, questo rimuove il finale ], quindi lo aggiungiamo di nuovo in una fase separata.


3

Pyke, 11 byte

.F~]+=])K~]

Provalo qui!

Spiegazione:

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

O 7 byte dopo un bugfix

M?+]K~]

Provalo qui!

Spiegazione:

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

O anche 2 byte se è consentita la stampa su stdout (questo potrebbe essere incorporato)

M
<newline required>

Provalo qui!

Questo applica profondamente la print_newlinefunzione a ogni elemento non in sequenza nell'input e ricorre per gli elementi in sequenza.


A soli 4 di distanza da K! +1
Arjun,

3

Java (v8) 390 276 byte

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();
}  

Solo per completezza e tutto il resto. :) Non posso dire che il codice Java sia efficiente.


3
Ciao e benvenuto in PPCG! Questa domanda è code-golf , quindi per favore prova a minimizzare il tuo codice. Grazie!
NoOneIsHere

3
Rimuovere tutti gli spazi, le schede e le nuove righe non necessari. Cambia oafin oe cambia flattenin f.
NoOneIsHere

2
Non hai bisogno della finals, l'intera cosa può essere una lambda, non ti serve public static...
David Conrad,

1
potresti salvare un paio di caratteri se usi generics invece object
user902383

1
si potrebbe anche salvare 2 byte se si sostituisce falsecon 1>2, e ulteriori 2 byte si potrebbe ottenere se si dichiara n ma non definisce (compilatore definire automaticamente come 0)
user902383

2

Python, 57 byte

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

Provalo online: Python 2 , Python 3

Grazie a Kevin Lau per il list==type(x)trucco.


2
type(x)==listè più corto di isinstance(x,list).
Value Ink,

1
"Conterrà solo numeri interi (sia negativi che positivi), stringhe e array." Che ne dici [`x`>'['and...? (Funziona solo in Python 2).
Lynn,

2

Rubino

c'è un flattenmetodo incorporato .

Puoi eseguire qui: http://www.tutorialspoint.com/execute_ruby_online.php

43 byte, ma ho pensato di condividere:

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

Uno 45 byte che è più efficiente del precedente e l'altro rubino risponde:

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

ecco il 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

risultato:

       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
Ciao e benvenuto in PPCG! Purtroppo, la risposta non è valida, a causa di questa regola: Note: If your language contains a built-in for this, then you must NOT use it.
NoOneIsHere

@NoOneIsHere, grazie, non lo sapevo
Akostadinov

1
In che modo il mio nuovo aggiornamento si sovrappone in termini di tempo al tuo? Inoltre, proprio come la mia nuova risposta, puoi rimuovere gli spazi intornorescue
Value Ink,

@ KevinLau-notKenny aggiornato, grazie! rescuesembra piuttosto lento, come try/catchin java
akostadinov

1
Aggiorna anche il tuo bytecount
Value Ink,


2

Clojure, 68 byte

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

mapcatapplica prima la funzione a ciascun elemento e quindi concede i risultati. Quindi ogni volta che si perde un "livello di nidificazione" si perde. Concat non funziona su sequenze non così gli elementi devono essere avvolti nel vettore se non sono vettoriali.

Puoi provarlo qui: http://www.tryclj.com

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

Bel primo golf-code. +1 :)
Arjun,

2

ANSI C, 193 byte

#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(_);}

:-/, eventuali suggerimenti? A proposito, ho provato a trovare una fonte online per compilare questo, ma il WL è rigoroso per la compilazione di questo codice. In caso contrario funzionerà per VS e gcc.


2
Benvenuti in PPCG!
Martin Ender,

1
Benvenuti in PPCG! Bel primo golf. Buona fortuna!
Arjun,

Grazie! È stato un tentativo di aumentare i miei punti in modo da poter ottenere i privilegi di commento altrove. Sembra che le cose non funzionino come se gli account fossero per portali diversi. : DI vedrà se è possibile utilizzare alcune funzionalità di c ++.
amritanshu,

2

JavaScript 20 byte

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

L'array + array è uguale a array.toString


@WheatWizard grazie per l'accoglienza e sono nuovo sul sito. in realtà aè un argomento della funzione. Proverò a modificare la funzione ora.
io--

Penso che ora vada bene @WheatWizard. Per favore fatemi sapere se c'è un problema con questo
io--

1
In realtà guardando i documenti javaScript una funzione anonima sarebbe sicuramente più breve, dovresti solo aggiungere a=>all'inizio del tuo codice.
Wheat Wizard,

@WheatWizard Ho aggiornato con la funzione freccia come hai detto. Ma devo rimuovere lo snippet perché la funzione freccia non supporta il richiamo diretto. È solo per i callback
i--

1
Questo non gestisce correttamente le stringhe con virgole
Jo King,

2

C #, 48 byte

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

Ho pensato di pubblicarlo anche dal momento che nessuno ha ancora dato una soluzione C #. Suggerimenti benvenuti!


Benvenuti nel sito. Non ho programmato in C # per un po ', ma mi sembra che potresti avere un paio di problemi. Per uno come viene iinizializzato? e sei sicuro che funzioni [["[]"],"[]"]sull'esempio?
Wheat Wizard

Siamo spiacenti, è l'input passato come una stringa. Un array vuoto verrebbe semplicemente tradotto in una stringa vuota.
PmanAce,

Che ne dici dell'ultima testcase? Inoltre, presumo che volevi fare i=>$"{i.Replace("[","").Replace("]","")}"?
Incarnazione dell'ignoranza il

Purtroppo nell'ultimo caso non funziona, si sbarazzerà dell'array vuoto. :(
PmanAce,

Questa risposta non supera il caso di test finale. Dal momento che non è stato riparato per alcuni mesi, sto votando per eliminarlo.
mbomb007,

1

Racchetta, 63 byte

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

1

Java 8 165 caratteri

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();}

Ungolf in una classe:

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();
    }
}

Questa risposta si basa sull'approccio di Jeremy Harton . L'ho usato e l'ho cambiato in alcuni punti e ho creato una versione più simile al golf.


non sarebbe meglio quando si utilizza Arrays.asList () su "array" e quindi andare a foreach con lambda e terminarlo con un Collector?
Serverfrog,

1

JavaScript, 17 byte

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

Infine, le conversioni di tipo JavaScript possono essere utili! Si noti che ciò genererà effettivamente un array, ma la conversione di stringhe (inserendola in HTML) fa sì che diventi un elenco separato da virgole.

Se gli elenchi separati da virgola sono accettabili, allora è valido quanto segue:

7 byte

a=>""+a

NOTA: lo snippet è rotto per qualche motivo

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


3
Questo non sembra funzionare quando eseguito nella console per l'input ["["]... Ho provato a eseguire (a=>eval([$ {a}] ))(["["])e ho ottenuto unSyntaxError
jrich

@jrich. Ottieni questo errore quando digiti carattere per carattere. Se copi e incolli qualsiasi array valido , funzionerà come previsto. A proposito, bella risposta SpeedNinja, cambierei l' oninputevento solo con un buttonclic.
Washington Guedes,

Questo non funziona per le stringhe con virgole
Jo King,


1

Attache , 14 byte

{Reap[Sow@>_]}

Provalo online!

Fortunatamente, Attache ha un operatore di "vettorializzazione", che applica una funzione agli atomi di un elenco. In questo caso, tutto ciò che dobbiamo fare è impostare un mietitore con Reape Sowtutti gli atomi dell'input _con @>. Penso che sia abbastanza elegante.

alternative

15 byte: Fixpoint{`'^^_}

16 byte: Fixpoint!&Concat

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

17 byte: Fixpoint[&Concat]


1

Elisir , 74 byte

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

Prima risposta all'elisir, quindi probabilmente si può giocare un po 'a golf.

Provalo online.

Spiegazione:

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

Naturalmente, se i builtin fossero consentiti, avrebbero potuto essere invece 25 byte :

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

Provalo online.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.