Preferensi Pref Pref Prefiks Prefiks Prefiks

34

Diberikan daftar terbatas, kembalikan daftar semua awalannya, termasuk daftar kosong, dalam urutan panjangnya.

(Pada dasarnya menerapkan fungsi Haskell inits.)

Detail

  • Daftar input berisi angka (atau tipe lain jika lebih nyaman).
  • Output harus berupa daftar daftar .
  • Pengajuan dapat, tetapi tidak harus berupa fungsi, I / O standar apa pun dapat digunakan.
  • Ada jawaban CW untuk semua solusi sepele .

Contoh

[] -> [[]]
[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]]
cacat
sumber
Jika suatu bahasa tidak mendefinisikan tipe apa pun kecuali untuk karakter, dapatkah saya mengambil input sebagai string dan memisahkan input dengan baris baru, dalam hal program lengkap?
NieDzejkob
@NieDzejkob Saya tidak yakin konsensus apa yang ada untuk kasus ini, tetapi jawaban Brainfuck tampaknya melakukan sesuatu seperti itu.
flawr
Bisakah kita berharap daftar ini diakhiri dengan nol?
Ini sangat umum di C / C ++, penggunaan utama adalah string.
@Rogem Jika itu yang umum saya pikir memungkinkan itu masuk akal.
flawr

Jawaban:

15

Haskell , 20 byte

Sunting: Namun satu byte lebih pendek dengan pemindaian yang sama sekali berbeda.

Fungsi anonim sedikit mengalahkan impor sepele.

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

Cobalah online!

  • Penggunaan =<<untuk singkatan (scanr(\_->init)=<<id) l = scanr(\_->init) l l.
  • Memindai daftar ldari kanan ke kiri, mengumpulkan hasil antara dengan fungsi \_->init.
  • Fungsi itu mengabaikan elemen yang dipindai melalui (mereka hanya digunakan untuk mendapatkan panjang total yang tepat untuk hasil yang dikumpulkan), jadi benar-benar mengulangi menerapkan initke nilai awal pemindaian, yang juga l.
Ørjan Johansen
sumber
13

brainfuck , 21 12 byte

-9 byte terima kasih kepada Arnauld yang menyarankan pemisah, ÿbukan baris baru

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

Cobalah online!

Membawa byte melalui STDIN tanpa byte nol dan mencetak serangkaian awalan yang dipisahkan oleh ÿkarakter dengan ÿkarakter utama . Misalnya, untuk input Prefixes, outputnya adalah ÿÿPÿPrÿPreÿPrefÿPrefiÿPrefixÿPrefixeÿPrefixes.

Untuk keterbacaan, inilah versi dengan baris baru .

Penjelasan:

-              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
Jo King
sumber
1
Ini hanya bekerja pada implementasi BF dengan sel pembungkus 8-bit, tidak bertanda tangan.
Dev
11

JavaScript (ES6), 33 byte

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

Cobalah online!

Bagaimana?

+--- 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
Arnauld
sumber
wow, itu penjelasan kode yang sama sekali baru, pekerjaan yang luar biasa: O
Brian H.
@BrianH. Terima kasih! Tugas sederhana adalah peluang bagus untuk menulis penjelasan terperinci yang tidak dapat ditampilkan dalam kode yang lebih padat.
Arnauld
Apakah Anda membuatnya dengan tangan? atau apakah Anda mendapatkan bantuan dari perangkat lunak aneh yang belum pernah saya dengar?
Brian H.
2
Hanya Notepad ++ dengan beberapa pengeditan mode kolom .
Arnauld
8

CW untuk semua entri sepele

Bersih , 19 byte

Versi Haskell juga berfungsi di Bersihkan.

import StdLib
inits

Cobalah online!

Haskell , 22 byte

import Data.List
inits

Cobalah online!

Prolog (SWI) , 6 byte

prefix

Cobalah online!

ASCII saja
sumber
Jadi sobek - untuk menang atau tidak. Di satu sisi, saya menghargai semua solusi bawaan di satu tempat. Di sisi lain, saya benar-benar tidak suka builtin karena mereka sangat mendasar ...
6

Jelly , 3 byte

ṭṖƤ

Cobalah online!

Bagaimana itu bekerja

ṭṖƤ  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.
Dennis
sumber
6

Japt , 4 byte

²£¯Y

Cobalah online!

Penjelasan:

²       :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
Kamil Drakari
sumber
6

Perl 6 , 13 byte

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

Cobalah online!

Untuk menjelaskan:

Dalam Perl 6 Anda dapat membungkus operator dalam tanda kurung siku sebagai cara alternatif untuk menulis pengurangan daftar. [+] @arraymengembalikan jumlah elemen dalam @array, [*] @arraymengembalikan produk, dll. Anda juga dapat mendahului operator dengan garis miring terbalik untuk membuat pengurangan "segitiga", yang oleh beberapa bahasa disebut "pemindaian." Jadi [\+] @arraymengembalikan daftar yang terdiri dari elemen pertama@array , lalu jumlah dari dua elemen pertama, lalu jumlah dari tiga elemen pertama, dll.

Berikut [\,] @_ini adalah pengurangan segitiga atas array input @_menggunakan operator daftar konstruksi ,. Jadi itu mengevaluasi ke daftar daftar: elemen pertama @_, dua elemen pertama @_, dll. Itu hampir apa yang dibutuhkan, tetapi masalahnya memerlukan satu daftar kosong terlebih dahulu. Jadi elemen pertama dari daftar kembali adalah daftar kosong literal (),, kemudian pengurangan atas daftar input diratakan ke dalam sisa daftar kembali dengan |.

Sean
sumber
2
O_o, apa yang terjadi di sini
ASCII
1
@ Pengurangan segitiga
user202729
5

Python 2 , 32 byte

f=lambda l:(l and f(l[:-1]))+[l]

Cobalah online!

ovs
sumber
1
Juga bekerja di Python 3
ASCII-only
5

R , 40 39 byte

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

Cobalah online!

-1 byte terima kasih untuk digEmAll

Output dari listtipe R agak aneh; ia menggunakan pengindeksan berurutan, jadi misalnya, output untuk

list(1,2) aku s

[[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

Mengambil input sebagai vektor sebagai gantinya memberikan format output yang lebih rapi, meskipun kemudian inputnya tidak secara teknis list.

Giuseppe
sumber
@digEmSemua terima kasih!
Giuseppe
4

JavaScript, 36 byte

a=>[...a,0].map((x,y)=>a.slice(0,y))

Cobalah online!

Oliver
sumber
4

Mathematica, 22 21 byte

-1 byte terima kasih kepada Misha Lavrov !

{}~FoldList@Append~#&

Fungsi murni. Mengambil daftar sebagai input dan mengembalikan daftar daftar sebagai output. Saya percaya ini adalah solusi sesingkat mungkin.

LegionMammal978
sumber
Kita dapat menulis solusi yang sama dengan lebih kompak {}~FoldList@Append~#&.
Misha Lavrov
@MishaLavrov Terima kasih! Saya tidak berpikir untuk menggunakan bentuk argumen 1 + 2 kari seperti itu.
LegionMammal978
4

Sekam , 2 byte

Θḣ

Dapatkan semua eads dan kemudian tambahkan Θ(dalam hal ini []):

Cobalah online!

(perlu mengetik anotasi untuk daftar kosong: Coba online! )

ბიმო
sumber
3

PowerShell , 65 byte

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

Cobalah online!

PowerShell sangat membantu membuka daftar-daftar ketika standar Write-Outputterjadi pada penyelesaian program, sehingga Anda mendapatkan satu item per baris. Taktik a-join',' untuk melihat daftar daftar yang lebih baik, dengan mengubah daftar dalam menjadi string.

(Ab) menggunakan fakta bahwa mencoba untuk mengeluarkan array kosong (misalnya, @()) menghasilkan tidak ada output, sehingga input array kosong hanya memiliki ''sebagai output, karena $a[0..$_]akan menghasilkan apa-apa. Ini juga akan membuang beberapa pesan kesalahan yang spektakuler.

AdmBorkBork
sumber
Membungkusnya di parens alih-alih menugaskannya menghemat 20 byte . Kecuali Anda tidak berpikir itu dianggap sebagai mengembalikan daftar daftar. Saya selalu bingung tentang perbedaan itu.
Veskah
@veskah Ya, itulah yang hampir saya miliki sebelum saya edit ke versi ini. Masalah dengan solusi Anda atau solusi saya sebelumnya - itu tidak mengembalikan daftar-daftar. TIO1 vs TIO2
AdmBorkBork
3

K (ngn / k) , 8 byte

,\(,!0),

Cobalah online!

ngn
sumber
1
Ini semacam voodoo. ,\(,()),di K4. Bergabung dengan daftar nol di sepanjang masukan dari daftar? bagaimana bekerja?
streetster
1
@streetster ()adalah daftar kosong. (,()),xmenambahkannya ke x. akhirnya ,\ melakukan pemindaian bersama. yang xdihilangkan untuk membentuk komposisi. perhatikan bahwa trailing ,adalah diad, jadi "concat", bukan "enlist".
ngn
1
@streetster di k4 bisa byte lebih pendek: 1_',\0,tapi parser saya tidak cukup pintar untuk menangani ini ...
ngn
3

Gangguan Umum , 39 byte

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

Cobalah online!

Penjelasan

(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
Khusus ASCII
sumber
3

F #, 53 byte

Saya sebenarnya punya dua jawaban yang hampir mirip untuk ini, keduanya sama panjangnya. Keduanya mengambil urutan generiks sebagai parameter.

Solusi pertama:

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

Cobalah online!

Seq.takemengambil nelemen pertama dari urutan. Seq.initmembuat urutan baru dengan hitungan (dalam hal ini) dari panjang urutan sditambah 1, dan untuk setiap elemen dalam urutan mengambil nelemen pertama s.

Solusi kedua:

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

Mirip dengan sebelumnya, kecuali ia menciptakan urutan dari 0 hingga panjang s. Kemudian ambil sejumlah elemen dari s.

Coba ini juga online!

Ciaran_McCarthy
sumber
fun s->Seq.map(fun n->Seq.take n s){0..Seq.length s} menghemat 1 byte
Perwujudan Ketidaktahuan
3

MATL, 15 12 byte

3 byte disimpan berkat @Giuseppe

vin:"G@:)]Xh

Cobalah di MATL Online .

Karena cara MATL menampilkan output, Anda tidak bisa secara eksplisit melihat array kosong dalam array sel. Berikut adalah versi yang menunjukkan output sedikit lebih eksplisit.

Penjelasan

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
Suever
sumber
gunakan vsebagai ganti []. Dan tidak :digunakan 1sebagai argumen pertama default? Jadi ini bisa vin:"G@:)]Xhuntuk 12 byte.
Giuseppe
@Giuseppe Terima kasih! MATL saya agak berkarat kelihatannya :(
Suever
2

Arang , 6 byte

Eθ…θκθ

Cobalah online!Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Mungkin dengan biaya 1 byte untuk meminta Charcoal untuk mencetak n+1array-elemen yang memasukkan input sebagai elemen terakhir, tetapi outputnya sama, walaupun posisi kursor akan berbeda jika Anda kemudian mencetak sesuatu yang lain.

Neil
sumber
2

RAD , 7 byte

(⊂⍬),,\

Cobalah online!

Ini juga berfungsi di Dyalog APL sebagai fungsi.

Bagaimana?

Ini berfungsi sama untuk APL dan RAD, mengingat hubungan dekatnya.

  • (⊂⍬) array kosong
  • , ditambahkan ke
  • ,\ awalan (yang mengecualikan array kosong.)
Zacharý
sumber
2

Groovy , 37 byte

{x->(0..x.size()).collect{x[0..<it]}}

Cobalah online!

GolfIsAGoodWalkSpoilt
sumber
{it.inits().reverse()}akan bekerja setelah kami mendapatkan groovy 2.5 di TIO
ASCII-only
2

brainfuck , 43 byte

Ambil daftar karakter yang bukan nol sebagai input dan kembalikan semua awalan yang dipisahkan oleh baris baru. Membutuhkan pita tak terbatas atau pembungkus ganda.

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

Cobalah online!

pengguna202729
sumber
Jawaban lain mengungguli saya lebih dari setengah, karena saya tidak berpikir tentang mencetak hasil saat membaca. Tentu saja metode itu tidak akan bekerja dengan mencetak sufiks yang meningkat.
user202729
40 byte dengan pengaturan ulang
Jo King
2

C # (Visual C # Interactive Compiler) , 39 byte

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

Cobalah online!

dana
sumber
Anda harus memasukkan penggunaan System.Linq; dalam bytecount Anda. Dan tampaknya beberapa logika output Anda dalam keluaran array Anda. Karena array kosong hanya mengembalikan array kosong.
LiefdeWen
@ LiefdeWen - pemahaman saya adalah karena penerjemah ini menyertakan referensi System.Linq, saya tidak harus memasukkan ini dalam jumlah byte. Kiriman saya akan dianggap bahasa yang berbeda dari ucapan .NET Core. github.com/dotnet/roslyn/wiki/C%23-Interactive-Walkthrough - Anda menyebutkan pencetakan yang merupakan masalah terpisah, saya ingin mendapatkan kejelasan tentang ini terlebih dahulu.
dana
Berkenaan dengan pencetakan, berikut adalah versi yang pada dasarnya membuang hasilnya ke konsol - tio.run/##XY29CsIwGEX3PEXGBGKhtVt/… - tidak secantik pasti! Pertanyaan saya adalah ketika itu diterima untuk menggunakan Arrayvs IListvs IEnumerable.
dana
2

F # (Mono) , 45 byte

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

Cobalah online!

Saya tidak sepenuhnya yakin apakah ini valid, tetapi sepertinya ini mengikuti sintaksis "lambda anonim" yang sama yang sepertinya saya gunakan dalam beberapa bahasa lain.

dana
sumber
2

Java 8+ , 86 77 byte

-9 byte terima kasih kepada Kevin Cruijssen (singkirkan impor)!

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

Cobalah online!

Alternatif, 65 byte

Berikut ini akan mencetak hasilnya ke stdout (karena Olivier Grégoire ):

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

Cobalah online

ბიმო
sumber
Anda dapat mengubahnya menjadi 77 byte hanya dengan menggunakan java.util.stream.IntStreamlangsung dan menjatuhkan impor.
Kevin Cruijssen
@KevinCruijssen: Oh, terima kasih! Saya bahkan tidak tahu bahwa ini mungkin, itu tentu membantu (setidaknya untuk tujuan bermain golf).
ბიმო
x->{for(int i=0;i<=x.size();)System.out.println(x.subList(0,i++));}( 67 byte ) Ini mencetak daripada menggunakan stream. Pencetakan biasanya merupakan cara terpendek untuk menghasilkan struktur yang kompleks.
Olivier Grégoire
@ OlivierGrégoire: Dalam hal ini Anda mungkin bisa lolos System.out.printkarena output masih tidak ambigu.
ბიმო
@BMO Memang, itu mungkin!
Olivier Grégoire
2

Brachylog , 9 byte

a₀ᶠ~b.hĖ∧

Cobalah online!

Penjelasan

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)
Fatalisasi
sumber
2

Ruby , 31 29 byte

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

Cobalah online!

Penjelasan:

->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
  }
}
Asone Tuhid
sumber