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

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.

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

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

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


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.

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

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


2
O_o, apa yang terjadi di sini
ASCII



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.



@digEmSemua terima kasih!
Giuseppe


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.


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



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.


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!


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

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!


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

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.



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.)



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!


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!


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.


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


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)

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
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.