P Pr Pre Pref Prefi Prefix Tiền tố


34

Đưa ra một số danh sách hữu hạn, trả về một danh sách tất cả các tiền tố của nó, bao gồm cả một danh sách trống, theo thứ tự tăng dần theo chiều dài của chúng.

(Về cơ bản thực hiện chức năng Haskell inits.)

Chi tiết

  • Danh sách đầu vào chứa số (hoặc loại khác nếu thuận tiện hơn).
  • Đầu ra phải là một danh sách các danh sách .
  • Việc gửi có thể, nhưng không phải là một chức năng, bất kỳ I / O mặc định nào cũng có thể được sử dụng.
  • Có một câu trả lời CW cho tất cả các giải pháp tầm thường .

Thí dụ

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

Nếu một ngôn ngữ không xác định bất kỳ loại nào ngoại trừ các ký tự, tôi có thể lấy đầu vào dưới dạng chuỗi và tách đầu vào theo dòng mới, trong trường hợp của một chương trình đầy đủ không?
NieDzejkob

@NieDzejkob Tôi không chắc có sự đồng thuận nào cho trường hợp này, nhưng câu trả lời của Brainfuck dường như làm điều gì đó tương tự.
flawr

Chúng tôi có thể mong đợi danh sách được kết thúc không?

Nó đặc biệt phổ biến trong C / C ++, sử dụng chính là các chuỗi.

@Rogem Nếu nó là phổ biến tôi nghĩ cho phép nó là hợp lý.
flawr

Câu trả lời:


15

Haskell , 20 byte

Chỉnh sửa: Tuy nhiên, một byte ngắn hơn với một lần quét hoàn toàn khác.

Một chức năng ẩn danh hơi đánh bại việc nhập khẩu tầm thường.

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

Hãy thử trực tuyến!

  • Sử dụng =<<cho viết tắt (scanr(\_->init)=<<id) l = scanr(\_->init) l l.
  • Quét một danh sách ltừ phải sang trái, thu thập kết quả trung gian với chức năng \_->init.
  • Hàm đó bỏ qua các phần tử được quét qua (chúng chỉ được sử dụng để có tổng độ dài phù hợp cho các kết quả được thu thập), do đó, thực sự lặp lại áp dụng initcho giá trị ban đầu của quá trình quét l.

13

Brainfuck , 21 12 byte

-9 byte nhờ Arnauld đề xuất dấu phân cách ÿthay vì dòng mới

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

Hãy thử trực tuyến!

Đưa byte qua STDIN không có byte rỗng và in một loạt các tiền tố được phân tách bằng ÿký tự có ÿký tự đầu . Ví dụ, đối với đầu vào Prefixes, đầu ra là ÿÿPÿPrÿPreÿPrefÿPrefiÿPrefixÿPrefixeÿPrefixes.

Để dễ đọc, đây là một phiên bản có dòng mới thay thế .

Giải trình:

-              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
Điều này chỉ hoạt động trên các triển khai BF với các ô 8 bit, không dấu, gói.
Dev

11

JavaScript (ES6), 33 byte

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

Hãy thử trực tuyến!

Làm sao?

+--- 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, đó là một cấp độ giải thích mã hoàn toàn mới, công việc tuyệt vời: O
Brian H.

@BrianH. Cảm ơn bạn! Nhiệm vụ đơn giản là cơ hội tốt để viết các giải thích chi tiết không thể đưa ra trong mã dày đặc hơn.
Arnauld

Bạn đã làm nó bằng tay? hoặc bạn đã nhận được sự giúp đỡ từ bất kỳ phần mềm kỳ lạ nào tôi chưa từng nghe nói đến?
Brian H.

2
Chỉ cần Notepad ++ với một số chỉnh sửa chế độ cột .
Arnauld

8

CW cho tất cả các mục tầm thường

Sạch , 19 byte

Phiên bản Haskell cũng hoạt động trong Clean.

import StdLib
inits

Hãy thử trực tuyến!

Haskell , 22 byte

import Data.List
inits

Hãy thử trực tuyến!

Prolog (SWI) , 6 byte

prefix

Hãy thử trực tuyến!


Vì vậy, rách - để upvote hay không. Một mặt, tôi đánh giá cao tất cả các giải pháp tích hợp ở một nơi. Mặt khác, tôi thực sự không thích các nội dung vì chúng rất cơ bản ...

6

Thạch , 3 byte

ṭṖƤ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ṭṖƤ  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

Perl 6 , 13 byte

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

Hãy thử trực tuyến!

Giải thích:

Trong Perl 6, bạn có thể bọc một toán tử trong ngoặc vuông như một cách thay thế để viết giảm danh sách. [+] @arraytrả về tổng của các phần tử trong @array, [*] @arraytrả về sản phẩm, v.v. Bạn cũng có thể đặt trước toán tử bằng dấu gạch chéo ngược để thực hiện giảm "tam giác", mà một số ngôn ngữ gọi là "quét". Vì vậy, [\+] @arraytrả về một danh sách bao gồm các yếu tố đầu tiên của@array , sau đó là tổng của hai phần tử đầu tiên, sau đó là tổng của ba phần tử đầu tiên, v.v.

Dưới đây [\,] @_là một giảm tam giác trên mảng đầu vào @_bằng cách sử dụng toán tử xây dựng danh sách ,. Vì vậy, nó đánh giá một danh sách các danh sách: yếu tố đầu tiên @_, hai yếu tố đầu tiên @_, v.v ... Đó gần như là những gì cần thiết, nhưng vấn đề trước tiên cần có một danh sách trống. Vì vậy, phần tử đầu tiên của danh sách trả về là một danh sách trống theo nghĩa đen (),, sau đó việc giảm danh sách đầu vào được làm phẳng vào phần còn lại của danh sách trả về với |.


2
O_o những gì thậm chí đang xảy ra ở đây
ASCII - chỉ



5

R , 40 39 byte

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

Hãy thử trực tuyến!

-1 byte nhờ digEmAll

Đầu ra của R's list hơi lạ một chút; nó sử dụng lập chỉ mục tuần tự, ví dụ, đầu ra cho

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

Lấy đầu vào làm vector thay vào đó sẽ cho định dạng đầu ra gọn gàng hơn, mặc dù sau đó các đầu vào không phải là kỹ thuật lists.



@digEmAll cảm ơn!
Giuseppe


4

Toán học, 22 21 byte

-1 byte nhờ Misha Lavrov !

{}~FoldList@Append~#&

Chức năng thuần túy. Lấy danh sách làm đầu vào và trả về danh sách danh sách làm đầu ra. Tôi tin rằng đây là giải pháp ngắn nhất có thể.


Chúng ta có thể viết cùng một giải pháp gọn hơn như {}~FoldList@Append~#&.
Misha Lavrov

@MishaLavrov Cảm ơn! Tôi đã không nghĩ sẽ sử dụng hình thức đối số 1 + 2 bị quấy rối như thế.
LegionMammal978



3

PowerShell , 65 byte

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

Hãy thử trực tuyến!

PowerShell giúp kiểm soát danh sách danh sách một cách hữu ích khi mặc định Write-Outputxảy ra khi hoàn thành chương trình, do đó bạn nhận được một mục trên mỗi dòng. Tack trên một-join',' để xem danh sách danh sách tốt hơn, bằng cách chuyển đổi danh sách bên trong thành chuỗi.

(Ab) sử dụng thực tế là việc cố gắng tạo ra một mảng trống (ví dụ @():) không dẫn đến kết quả đầu ra, do đó, một đầu vào mảng trống chỉ có ''đầu ra, vì $a[0..$_]sẽ không có kết quả gì. Nó cũng sẽ ném ra một số thông báo lỗi ngoạn mục.


Gói nó trong parens thay vì gán nó tiết kiệm 20 byte . Trừ khi bạn không nghĩ rằng nó được tính là trả về một danh sách các danh sách. Tôi đã luôn mờ nhạt về sự khác biệt đó.
Veskah

@veskah Vâng, đó gần như là những gì tôi có trước khi chỉnh sửa phiên bản này. Vấn đề với giải pháp của bạn hoặc giải pháp trước đó của tôi - nó không trả về danh sách danh sách. TIO1 vs TIO2
admBorkBork

3

1
Đây là một số loại voodoo. ,\(,()),trong K4. Tham gia nhập ngũ null cùng nhập liệu nhập ngũ? howsitwork?
streetster

1
@streetster ()là một danh sách trống.(,()),xchuẩn bị cho nó x. cuối cùng ,\ thực hiện quét concat. các xbị bỏ qua để tạo thành một thành phần. lưu ý rằng dấu vết ,là dyadic, vì vậy nó là "concat", không phải "enlist".
ngn

1
@streetster trong k4 nó có thể ngắn hơn một byte: 1_',\0,nhưng trình phân tích cú pháp của tôi không đủ thông minh để xử lý việc này ...
ngn

3

Lisp thông thường , 39 byte

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

Hãy thử trực tuyến!

Giải trình

(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

Tôi thực sự đã có hai câu trả lời khá giống nhau cho điều này, cả hai cùng độ dài. Cả hai đều lấy một chuỗi chung slàm tham số.

Giải pháp đầu tiên:

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

Hãy thử trực tuyến!

Seq.takelấy các nyếu tố đầu tiên của chuỗi.Seq.inittạo ra một chuỗi mới với số đếm (trong trường hợp này) về độ dài của chuỗi scộng với 1 và với mỗi phần tử trong chuỗi sẽ lấy các nphần tử đầu tiên s.

Giải pháp thứ hai:

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

Tương tự như trước, ngoại trừ nó tạo ra một chuỗi từ 0 đến chiều dài của s . Sau đó lấy số lượng các yếu tố từ s.

Hãy thử trực tuyến này quá!


fun s->Seq.map(fun n->Seq.take n s){0..Seq.length s} tiết kiệm 1 byte
Hiện thân của sự thiếu hiểu biết

3

TOÁN, 15 12 byte

3 byte được lưu nhờ @Giuseppe

vin:"G@:)]Xh

Hãy thử nó tại MATL Online .

Do cách MATL hiển thị đầu ra, bạn không thể thấy rõ mảng trống trong mảng ô. Đây là một phiên bản cho thấy đầu ra rõ ràng hơn một chút.

Giải trình

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

sử dụng vthay vì []. Và không :sử dụng 1làm đối số đầu tiên mặc định? Vì vậy, điều này có thể là vin:"G@:)]Xhcho 12 byte.
Giuseppe

@Giuseppe Cảm ơn! Có vẻ như MATL của tôi hơi rỉ sét :(
Suever


2

Than , 6 byte

Eθ…θκθ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

Với chi phí 1 byte có thể yêu cầu Char than in một n+1mảng phân tầng bao gồm đầu vào là phần tử cuối cùng của nó, nhưng đầu ra là như nhau, mặc dù vị trí con trỏ sẽ khác nếu bạn tiếp tục in một thứ khác.



2

RAD , 7 byte

(⊂⍬),,\

Hãy thử trực tuyến!

Điều này cũng hoạt động trong Dyalog APL như là một chức năng.

Làm sao?

Điều này hoạt động giống nhau cho cả APL và RAD, do mối quan hệ chặt chẽ của chúng.

  • (⊂⍬) mảng trống
  • , dự kiến
  • ,\ các tiền tố (loại trừ mảng trống.)



2

Brainfuck , 43 byte

Lấy danh sách các ký tự không null làm đầu vào và trả về tất cả các tiền tố được phân tách bằng dòng mới. Yêu cầu gấp đôi vô hạn hoặc băng quấn.

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

Hãy thử trực tuyến!


Một câu trả lời khác đã vượt xa tôi hơn một nửa, vì tôi không nghĩ về việc in ra trong khi đọc. Tất nhiên phương pháp đó sẽ không hoạt động với việc in hậu tố tăng.
dùng202729

40 byte với một số sắp xếp lại
Jo King

2

C # (Trình biên dịch tương tác Visual C #) , 39 byte

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

Hãy thử trực tuyến!


Bạn cần bao gồm việc sử dụng System.Linq; trong bytecount của bạn. Và có vẻ như một số logic đầu ra của bạn nằm trong đầu ra của các mảng. Bởi vì mảng trống chỉ trả về mảng trống.
LiefdeWen

@LiefdeWen - sự hiểu biết của tôi là vì trình thông dịch này bao gồm một tham chiếu đến System.Linq, tôi không phải đưa điều này vào số byte. Trình của tôi sẽ được coi là một ngôn ngữ khác hơn nói .NET Core. github.com/dotnet/roslyn/wiki/C%23-Interactive-WalkENC - Bạn đề cập đến việc in ấn là một vấn đề riêng biệt, trước tiên tôi muốn làm rõ vấn đề này.
dana

Liên quan đến in ấn, đây là một phiên bản về cơ bản đưa kết quả vào bảng điều khiển - tio.run/##XY29CsIwGEX3PEXGBGKhtVt/, - không chắc chắn lắm! Câu hỏi tôi có là khi nào là nó chấp nhận được để sử dụng Arrayvs IListvs IEnumerable.
dana

2

F # (Mono) , 45 byte

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

Hãy thử trực tuyến!

Tôi không hoàn toàn chắc chắn nếu điều này là hợp lệ, nhưng có vẻ như nó tuân theo cú pháp "ẩn danh lambda" giống như tôi đã sử dụng trong một số ngôn ngữ khác.


2

Java 8+ , 86 77 byte

-9 byte nhờ Kevin Cruijssen (thoát khỏi quá trình nhập)!

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

Hãy thử trực tuyến!

Thay thế, 65 byte

Sau đây sẽ in kết quả ra thiết bị xuất chuẩn (do Olivier Grégoire ):

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

Dùng thử trực tuyến


Bạn có thể đánh gôn tới 77 byte chỉ bằng cách sử dụng java.util.stream.IntStreamtrực tiếp và thả quá trình nhập.
Kevin Cruijssen

@KevinCruijssen: Ồ cảm ơn! Tôi thậm chí còn không biết rằng điều này là có thể, điều đó chắc chắn hữu ích (ít nhất là cho mục đích chơi gôn).
ბიმო

x->{for(int i=0;i<=x.size();)System.out.println(x.subList(0,i++));}( 67 byte ). Bản in này thay vì sử dụng luồng. In ấn thường là cách ngắn nhất để xuất các cấu trúc phức tạp.
Olivier Grégoire

@ OlivierGrégoire: Trong trường hợp đó, bạn có thể thoát khỏi System.out.printvì đầu ra vẫn không rõ ràng.
ბიმო

@BMO Thật vậy, điều đó là có thể!
Olivier Grégoire

2

Brachylog , 9 byte

a₀ᶠ~b.hĖ∧

Hãy thử trực tuyến!

Giải trình

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

Hãy thử trực tuyến!

Giải trình:

->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
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.