P Pr Pre Pref Prefisso Prefisso Prefisso Prefissi


34

Dato un elenco finito, restituisce un elenco di tutti i suoi prefissi, incluso un elenco vuoto, in ordine crescente della loro lunghezza.

(Fondamentalmente implementando la funzione Haskell inits.)

Dettagli

  • L'elenco di input contiene numeri (o un altro tipo, se più conveniente).
  • L'output deve essere un elenco di elenchi .
  • L'invio può, ma non deve essere una funzione, è possibile utilizzare qualsiasi I / O predefinito .
  • C'è una risposta in CW per tutte le soluzioni banali .

Esempio

[] -> [[]]
[42] -> [[],[42]]
[1,2,3,4] -> [[], [1], [1,2], [1,2,3], [1,2,3,4]]
[4,3,2,1] -> [[], [4], [4,3], [4,3,2], [4,3,2,1]]

Se una lingua non definisce alcun tipo tranne i caratteri, posso prendere l'input come stringa e separare l'input da newline, nel caso di un programma completo?
NieDzejkob,

@NieDzejkob Non sono sicuro di quale consenso ci sia per questo caso, ma la risposta Brainfuck sembra fare qualcosa del genere.
Flawr,

Possiamo aspettarci che la lista sia terminata con null?

È particolarmente comune in C / C ++, l'uso principale è stringhe.

@Rogem Se è così comune penso che permetterlo sia ragionevole.
flawr,

Risposte:


15

Haskell , 20 byte

Modifica: tuttavia un byte più breve con una scansione completamente diversa.

Una funzione anonima che batte leggermente la banale importazione.

scanr(\_->init)=<<id

Provalo online!

  • Utilizza =<<per l'abbreviazione (scanr(\_->init)=<<id) l = scanr(\_->init) l l.
  • Scansiona un elenco lda destra a sinistra, raccogliendo risultati intermedi con la funzione \_->init.
  • Quella funzione ignora gli elementi scansionati (vengono utilizzati solo per ottenere la giusta lunghezza totale per i risultati raccolti), quindi itera davvero applicando inital valore iniziale della scansione, che è anche l.

13

brainfuck , 21 12 byte

-9 byte grazie ad Arnauld che suggerisce il separatore ÿanziché le nuove righe

-[[<]>[.>],]

Provalo online!

Acquisisce byte tramite STDIN senza byte null e stampa una serie di prefissi separati dal ÿcarattere con un ÿcarattere iniziale. Ad esempio, per l'input Prefixes, l'output è ÿÿPÿPrÿPreÿPrefÿPrefiÿPrefixÿPrefixeÿPrefixes.

Per leggibilità, ecco invece una versione con nuove righe .

Spiegazione:

-              Create a ÿ character in cell 0
 [        ,]   While input, starting with the ÿ
  [<]>           Go to the start of the string
      [.>]       Print the string
          ,      Append the input to the end of the string

1
Funziona solo su implementazioni BF con celle a wrapping a 8 bit, senza segno.
Dev

11

JavaScript (ES6), 33 byte

a=>[b=[],...a.map(n=>b=[...b,n])]

Provalo online!

Come?

+--- a = input array
|
|       +--- initialize b to an empty array and include it as the first entry
|       |    of the output (whatever the input is)
|       |
|       |          +--- for each value n in a[]:
|       |          |
|       |          |        +--- append n to b[] and include this new array in
|       |          |        |    the final output
|       |          |        |
a => [b = [], ...a.map(n => b = [...b, n])]
               |                  |
               +---------+--------+
                         |
      spread syntax: expands all elements of
      the child array within the parent array

wow, questo è un livello completamente nuovo di spiegazione del codice, ottimo lavoro: O
Brian H.

@BrianH. Grazie! Compiti semplici sono buone opportunità per scrivere spiegazioni dettagliate che non possono essere riportate in un codice più denso.
Arnauld,

L'hai fatto a mano? o hai ricevuto aiuto da uno strano software di cui non ho mai sentito parlare?
Brian H.

2
Solo Notepad ++ con alcune modifiche alla modalità colonna .
Arnauld,


6

Gelatina , 3 byte

ṭṖƤ

Provalo online!

Come funziona

ṭṖƤ  Main link. Argument: A

  Ƥ  Map the link to the left over all non-empty(!) prefixes of A.
 Ṗ       Pop; remove the last element.
ṭ    Tack; append A to the resulting list.

6

Japt , 4 byte

²£¯Y

Provalo online!

Spiegazione:

²       :Add an arbitrary extra item to the end of the array
 £      :For each item in the new array:
  ¯Y    : Get an array of the items that are before it

6

Perl 6 , 13 byte

{(),|[\,] @_}

Provalo online!

Spiegare:

In Perl 6 puoi racchiudere un operatore tra parentesi quadre come modo alternativo per scrivere una riduzione di elenco. [+] @arrayrestituisce la somma degli elementi @array, [*] @arrayrestituisce il prodotto, ecc. È inoltre possibile precedere l'operatore con una barra rovesciata per effettuare una riduzione "triangolare", che alcune lingue chiamano "scan". Quindi [\+] @arrayrestituisce un elenco composto dal primo elemento di @array, quindi dalla somma dei primi due elementi, quindi dalla somma dei primi tre elementi, ecc.

Ecco [\,] @_una riduzione triangolare sull'array di input @_utilizzando l'operatore di costruzione elenco ,. Quindi valuta un elenco di elenchi: il primo elemento di @_, i primi due elementi di @_, ecc. Questo è quasi ciò che è necessario, ma il problema richiede prima un singolo elenco vuoto. Quindi il primo elemento dell'elenco di ritorno è un elenco letterale vuoto (),, quindi la riduzione sull'elenco di input viene appiattita nel resto dell'elenco di ritorno con |.


2
O_o cosa sta succedendo qui
solo ASCII l'



5

R , 40 39 byte

function(L)lapply(0:length(L),head,x=L)

Provalo online!

-1 byte grazie a digEmAll

L'output del listtipo di R è un po 'strano; utilizza l'indicizzazione sequenziale, quindi ad esempio l'output per

list(1,2) è

[[1]]                     # first list element
list()

[[2]]                     # second list element
[[2]][[1]]                # first element of second list element
[1] 1


[[3]]                     # third list element
[[3]][[1]]                # first element of third list element
[1] 1

[[3]][[2]]                # etc.
[1] 2

Prendendo input come vettore si ottiene invece un formato di output più ordinato, anche se quindi gli input non sono tecnicamente lists.



@digEmAll grazie!
Giuseppe,


4

Mathematica, 22 21 byte

-1 byte grazie a Misha Lavrov !

{}~FoldList@Append~#&

Funzione pura. Prende un elenco come input e restituisce un elenco di elenchi come output. Credo che questa sia la soluzione più breve possibile.


Possiamo scrivere la stessa soluzione in modo più compatto di {}~FoldList@Append~#&.
Misha Lavrov,

@MishaLavrov Grazie! Non pensavo di usare la forma di argomento 1 + 2 al curry del genere.
LegionMammal978,



3

PowerShell , 65 byte

param($a)'';$x=,0*($y=$a.count);0..--$y|%{$x[$_]=@($a[0..$_])};$x

Provalo online!

PowerShell srotola in modo utile elenchi di elenchi quando l'impostazione predefinita si Write-Outputverifica al completamento del programma, in modo da ottenere un elemento per riga. Prova a -join','per vedere meglio la lista di liste, convertendo le liste interne in stringhe.

(Ab) usa il fatto che il tentativo di emettere un array vuoto (es., @()) Non produce alcun output, quindi un input di array vuoto ha ''come output, poiché non $a[0..$_]produrrà nulla. Emetterà anche alcuni spettacolari messaggi di errore.


Avvolgendolo in parentesi invece di assegnarlo si risparmia 20 byte . A meno che tu non pensi che conti come restituire un elenco di elenchi. Sono sempre stato confuso su questa distinzione.
Veskah,

@veskah Sì, è quasi quello che avevo prima della mia modifica a questa versione. Il problema con la tua soluzione o la mia soluzione precedente: non restituisce un elenco di elenchi. TIO1 vs TIO2
AdmBorkBork il

3

K (ngn / k) , 8 byte

,\(,!0),

Provalo online!


1
Questo è un tipo di voodoo. ,\(,()),in K4. Partecipare null arruolato con input arruolato? howsitwork?
streetster

1
@streetster ()è un elenco vuoto. (,()),xlo antepone a x. infine ,\ esegue una scansione concat. la xè omesso per formare una composizione. nota che il finale ,è diadico, quindi è "concat", non "enlist".
ngn,

1
@streetster in k4 può essere un byte più breve: 1_',\0,ma il mio parser non è abbastanza intelligente da gestire questo ...
ngn

3

Lisp comune , 39 byte

(defun f(l)`(,@(if l(f(butlast l))),l))

Provalo online!

Spiegazione

(defun f(l)                           )  ; Define a function f
           `(                        )   ; With the list (essentially capable of interpolation), containing:
             ,@                          ;     The value of, flattened to one level
               (if l              )      ;         If l is not the empty list (which is the representation of nil, i.e. the only falsy value)
                    (f(butlast l))       ;         Recurse with all of l but the tail
                                   ,l    ;     The value of l

3

F #, 53 byte

In realtà ho due risposte abbastanza simili per questo, entrambe della stessa lunghezza. Entrambi prendono una sequenza generica scome parametro.

Prima soluzione:

let i s=Seq.init(Seq.length s+1)(fun n->Seq.take n s)

Provalo online!

Seq.takeprende i primi nelementi della sequenza. Seq.initcrea una nuova sequenza con un conteggio (in questo caso) della lunghezza della sequenza spiù 1, e per ogni elemento della sequenza accetta i primi nelementi s.

Seconda soluzione:

let i s=Seq.map(fun n->Seq.take n s){0..Seq.length s}

Simile a prima, tranne per il fatto che crea una sequenza da 0 alla lunghezza di s. Quindi prende quel numero di elementi da s.

Prova anche questo online!


fun s->Seq.map(fun n->Seq.take n s){0..Seq.length s} salva 1 byte
Incarnazione dell'ignoranza il

3

MATL, 15 12 byte

3 byte salvati grazie a @Giuseppe

vin:"G@:)]Xh

Provalo su MATL Online .

A causa del modo in cui MATL visualizza l'output, non è possibile visualizzare esplicitamente l'array vuoto nell'array di celle. Ecco una versione che mostra l'output un po 'più esplicitamente.

Spiegazione

v       # Vertically concatenate the (empty) stack to create the array []
i       # Explicitly grab the input
n       # Compute the number of elements in the input (N)
:       # Create an array from [1, ..., N]
"       # Loop through this array
  G     # For each of these numbers, M
  @:    # Create an array from [1, ..., M]
  )     # Use this to index into the initial array
]       # End of the for loop
Xh      # Concatenate the entire stack into a cell array

utilizzare vinvece di []. E non :usa 1come primo argomento predefinito? Quindi questo potrebbe essere vin:"G@:)]Xhper 12 byte.
Giuseppe,

@Giuseppe Grazie! Il mio MATL sembra un po 'arrugginito :(
Suever,


2

Carbone , 6 byte

Eθ…θκθ

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

 θ      Input array
E       Map over elements
   θ    Input array
  …     Moulded to length
    κ   Current loop index
        Implicitly print each array double-spaced
     θ  Input array
        Implicitly print

È possibile al costo di 1 byte chiedere a Charcoal di stampare un n+1array di elementi che include l'input come ultimo elemento, ma l'output è lo stesso, anche se la posizione del cursore sarebbe diversa se si continuasse a stampare qualcos'altro.



2

RAD , 7 byte

(⊂⍬),,\

Provalo online!

Questo funziona anche in Dyalog APL come funzione.

Come?

Funziona allo stesso modo sia per APL che per RAD, data la loro stretta relazione.

  • (⊂⍬) l'array vuoto
  • , anteposto a
  • ,\ i prefissi (che escludono l'array vuoto.)



2

Brainfuck , 43 byte

Prendi un elenco di caratteri non nulli come input e restituisce tutti i prefissi separati da newline. Richiede nastro doppio infinito o avvolgente.

,>-[+>,]<[-<]<<++++++++++[[<]>[.>]>[-<+>]<]

Provalo online!


Un'altra risposta mi ha superato di oltre la metà, perché non ho pensato di stampare l'output durante la lettura. Ovviamente quel metodo non funzionerà con la stampa di suffissi crescenti.
user202729

40 byte con alcuni riordini
Jo King l'

2

C # (compilatore interattivo Visual C #) , 39 byte

x=>x.Select((_,i)=>x.Take(i)).Append(x)

Provalo online!


Devi includere l'utilizzo System.Linq; nel tuo bytecount. E sembra che parte della logica di output sia nell'output degli array. Perché array vuoto restituisce solo array vuoto.
Liefde:

@LiefdeWen - la mia comprensione è che poiché questo interprete include un riferimento a System.Linq, non devo includerlo nel conteggio dei byte. La mia presentazione sarebbe considerata una lingua diversa rispetto a dire .NET Core. github.com/dotnet/roslyn/wiki/C%23-Interactive-Walkthrough - Lei menziona la stampa che è un problema separato, vorrei prima chiarirmi.
dana,

Per quanto riguarda la stampa, ecco una versione che praticamente scarica il risultato sulla console - tio.run/##XY29CsIwGEX3PEXGBGKhtVt/… - non è certo carino! La domanda che ho è quando è accettabile usare Arrayvs IListvs IEnumerable.
dana,

2

F # (Mono) , 45 byte

fun x->List.mapi(fun i y->List.take i x)x@[x]

Provalo online!

Non sono del tutto sicuro se questo sia valido, ma sembra che segua la stessa sintassi "anonima lambda" che ho usato in diverse altre lingue.


2

Java 8+ , 86 77 byte

-9 byte grazie a Kevin Cruijssen (liberarsi dell'importazione)!

x->java.util.stream.IntStream.range(0,x.size()+1).mapToObj(t->x.subList(0,t))

Provalo online!

Alternativa, 65 byte

Di seguito verranno stampati i risultati su stdout (a causa di Olivier Grégoire ):

x->{for(int i=0;i<=x.size();)System.out.print(x.subList(0,i++));}

Provalo online


Puoi giocare a golf a 77 byte semplicemente usando java.util.stream.IntStreamdirettamente e rilasciare l'importazione.
Kevin Cruijssen il

@KevinCruijssen: Oh grazie! Non sapevo nemmeno che ciò fosse possibile, sicuramente utile (almeno per scopi di golf).
ბიმო

x->{for(int i=0;i<=x.size();)System.out.println(x.subList(0,i++));}( 67 byte ). Questo stampa invece di utilizzare i flussi. La stampa è di solito il modo più breve per produrre strutture complesse.
Olivier Grégoire il

@ OlivierGrégoire: in tal caso probabilmente puoi cavartela System.out.printpoiché l'output è ancora inequivocabile.
ბიმო

@BMO In effetti, sarebbe possibile!
Olivier Grégoire il

2

Brachylog , 9 byte

a₀ᶠ~b.hĖ∧

Provalo online!

Spiegazione

a₀ᶠ           Find all prefixes of the input
   ~b         Add an element at the beginning of that list of prefixes
      hĖ      This element is the empty list
     .  ∧     (the list with the additional empty list is the output)

2

Rubino , 31 29 byte

->a{[a*i=0]+a.map{a[0,i+=1]}}

Provalo online!

Spiegazione:

->a{             # take array input a
  [a*i=0]+       # set i to 0 and add whatever comes next to [[]] (a*0 == [])
  a.map{         # for every element in a (basically do a.length times)
    a[0,i+=1]  # increment i and return the first i-1 elements of a to map
  }
}
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.