P Pr Pre Pref Prefi Prefix 접두사


34

유한 목록이 주어지면 빈 목록을 포함하여 모든 접두사 목록을 길이의 오름차순으로 반환하십시오.

(기본적으로 Haskell 기능 구현 inits)

세부

  • 입력 목록에는 숫자 (또는 더 편리한 경우 다른 유형)가 포함됩니다.
  • 출력은 목록의 목록 이어야 합니다 .
  • 제출은 기능 일 필요는 없지만 기본 I / O를 사용할 수 있습니다.
  • 있습니다 CW 응답 모든 사소한 솔루션 .

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

언어가 문자를 제외한 다른 유형을 정의하지 않으면 전체 프로그램의 경우 입력을 문자열로 사용하여 줄 바꿈으로 입력을 분리 할 수 ​​있습니까?
NieDzejkob

@NieDzejkob 나는이 사건에 대한 합의가 무엇인지 확실하지 않지만 Brainfuck 답변은 그런 식으로하는 것 같습니다.
flawr

목록이 null로 끝나기를 기대할 수 있습니까?

C / C ++에서 특히 일반적이며 문자열은 주로 사용됩니다.

@Rogem 그것이 일반적인 경우 허용하는 것이 합리적이라고 생각합니다.
flawr

답변:


15

하스켈 , 20 바이트

편집 : 그러나 완전히 다른 스캔으로 바이트가 짧습니다.

간단한 가져 오기를 약간 치는 익명 함수입니다.

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

온라인으로 사용해보십시오!

  • =<<약어로 사용 합니다 (scanr(\_->init)=<<id) l = scanr(\_->init) l l.
  • l함수를 사용하여 중간 결과를 수집 하여 목록 을 오른쪽에서 왼쪽으로 스캔 합니다 \_->init.
  • 이 함수는 스캔 된 요소를 무시하므로 (수집 된 결과의 올바른 총 길이를 가져 오는 데만 사용됨) 실제로 init스캔의 초기 값에도 적용 을 반복 l합니다.

13

brainfuck , 21 12 바이트

Arnauld 덕분 ÿ에 줄 바꿈 대신 구분 기호 를 제안하는 -9 바이트

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

온라인으로 사용해보십시오!

널 바이트없이 STDIN을 통해 바이트를 가져오고 ÿ선행 ÿ문자 가있는 문자로 구분 된 일련의 접 두부를 인쇄합니다 . 예를 들어 input Prefixes의 경우 출력은 ÿÿPÿPrÿPreÿPrefÿPrefiÿPrefixÿPrefixeÿPrefixes입니다.

가독성을 위해 줄 바꿈이있는 버전이 있습니다.

설명:

-              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
이것은 서명되지 않은 8 비트 랩핑 셀이있는 BF 구현에서만 작동합니다.
Dev

11

자바 스크립트 (ES6), 33 바이트

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

온라인으로 사용해보십시오!

어떻게?

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

와우, 그것은 완전히 새로운 차원의 코드 설명입니다. 멋진 직업 : O
Brian H.

@BrianH. 고맙습니다! 간단한 작업은 더 조밀 한 코드에서는 얻을 수없는 자세한 설명을 작성할 수있는 좋은 기회입니다.
Arnauld

손으로 만들었습니까? 또는 내가 들어 본 적이없는 이상한 소프트웨어로부터 도움을 받았습니까?
Brian H.

2
열 모드 편집 기능이있는 메모장 ++ 만 있습니다.
Arnauld

8

모든 사소한 항목에 대한 CW

클린 , 19 바이트

Haskell 버전은 Clean에서도 작동합니다.

import StdLib
inits

온라인으로 사용해보십시오!

하스켈 , 22 바이트

import Data.List
inits

온라인으로 사용해보십시오!

프롤로그 (SWI) , 6 바이트

prefix

온라인으로 사용해보십시오!


그래서 찢어-공감 여부. 한편으로는 모든 내장 솔루션을 한곳에서 고맙게 생각합니다. 다른 한편으로, 나는 매우 기본이기 때문에 내장을 싫어합니다 ...



6

펄 6 , 13 바이트

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

온라인으로 사용해보십시오!

설명하기:

Perl 6에서는 목록 축소를 작성하는 대체 방법으로 연산자를 대괄호로 묶을 수 있습니다. [+] @array에 요소의 합을 반환합니다 @array.[*] @array 제품 등 또한 일부 언어가 부르는 "삼각형"감소, 만들 수있는 백 슬래시 연산자를 앞에 수 반환 "스캔을." 따라서 [\+] @array의 첫 번째 요소 @array, 첫 번째 두 요소의 합, 첫 번째 세 요소의 합 등 으로 구성된 목록을 반환합니다 .

다음 [\,] @_@_list 생성 연산자를 사용하여 입력 배열에 대한 삼각형 축소 ,입니다. 따라서 목록의 목록으로 평가합니다 :의 첫 번째 요소 @_,의 첫 두 요소 @_등. 거의 필요하지만 문제는 먼저 빈 목록 하나를 요구합니다. 따라서 반환 목록의 첫 번째 요소는 리터럴 빈 목록 (),이고 입력 목록에 대한 축소는을 사용하여 나머지 반환 목록으로 병합됩니다 |.


2
O_o 여기서 일어나는 일
ASCII 전용

1
@ASCII


5

R , 40 39 바이트

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

온라인으로 사용해보십시오!

digEmAll 덕분에 -1 바이트

R의 출력 list 타입 약간 이상합니다. 순차적 인덱싱을 사용하므로 예를 들어

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

대신 입력을 벡터로 취 하면 입력이 기술적으로 lists 가 아니지만 더 깔끔한 출력 형식이됩니다 .



@digEmAll 감사합니다!
주세페


4

수학, 22 21 바이트

Misha Lavrov 덕분에 -1 바이트 !

{}~FoldList@Append~#&

순수한 기능. 목록을 입력으로 취하고 목록 목록을 출력으로 리턴합니다. 나는 이것이 가장 짧은 해결책이라고 믿는다.


같은 솔루션을보다 간결하게 작성할 수 있습니다 {}~FoldList@Append~#&.
Misha Lavrov

트윗 담아 가기 나는 커리 된 1 + 2 인수 양식을 그런 식으로 사용하려고 생각하지 않았습니다.
LegionMammal978



3

PowerShell , 65 바이트

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

온라인으로 사용해보십시오!

프로그램 완료시 기본값이 발생 하면 PowerShell이 목록 목록을 유용하게 해제Write-Output 하므로 한 줄에 하나의 항목 만 표시됩니다. -join','내부 목록을 문자열로 변환하여 목록을 더 잘 보려면 a 를 선택하십시오.

(Ab)는 빈 배열 (예 :)을 출력하려고 시도하면 출력이 @()없으므로 빈 배열 입력 ''은 출력으로 만 사용 $a[0..$_]됩니다. 또한 화려한 오류 메시지가 표시됩니다.


그것을 할당하는 대신에 parens로 감싸면 20 바이트가 절약됩니다 . 당신이 생각하지 않는 한 목록의 목록을 반환하는 것으로 계산됩니다. 나는 항상 그 차이에 대해 애매했습니다.
Veskah

@veskah 그래, 거의이 버전을 편집하기 전에 내가 가진 것입니다. 솔루션 또는 이전 솔루션의 문제-목록 목록을 반환하지 않습니다. TIO1 vs TIO2
AdmBorkBork

3

1
이것은 일종의 부두입니다. ,\(,()),K4에서. 참여한 입력과 함께 참여한 null을 가입 하시겠습니까? Howsitwork?
streetster

1
@streetster ()는 빈 목록입니다. (,()),x앞에 추가합니다 x. 마지막 ,\ 으로 concat-scan을 수행합니다. 는 x조성물을 형성하기 위해 생략된다. 후행 ,은 부끄럽기 때문에 "가입"이 아니라 "연결"입니다.
ngn

1
k4의 @streetster는 바이트가 짧을 수 있습니다 : 1_',\0,그러나 내 파서는 이것을 처리하기에 충분히 똑똑하지 않습니다 ...
ngn

3

공통 리스프 , 39 바이트

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

온라인으로 사용해보십시오!

설명

(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 바이트

나는 실제로 이것에 대해 동일한 길이의 두 가지 비슷한 대답을 얻었습니다. 둘 다 일반적인 순서 s를 매개 변수로 사용합니다.

첫 번째 해결책 :

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

온라인으로 사용해보십시오!

Seq.taken시퀀스 의 첫 번째 요소를 가져옵니다 . Seq.init시퀀스 길이에 s1을 더한 수 (이 경우)로 새로운 시퀀스를 생성하고 시퀀스의 각 요소에 대해의 첫 번째 n요소를 사용 s합니다.

두 번째 해결책 :

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

0에서 길이까지의 시퀀스를 생성한다는 점을 제외하고는 이전과 유사합니다 s. 그런 다음 그 수의 요소를 가져옵니다.s .

온라인으로 시도하십시오!


fun s->Seq.map(fun n->Seq.take n s){0..Seq.length s} 1 바이트 절약
무지의 구현

3

MATL, 15 12 바이트

@Giuseppe 덕분에 3 바이트 절약

vin:"G@:)]Xh

MATL Online 에서 사용해보십시오 .

MATL이 출력을 표시하는 방식으로 인해 셀형 배열에서 빈 배열을 명시 적으로 볼 수 없습니다. 다음 은 출력을 조금 더 명확하게 보여주는 버전입니다.

설명

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

v대신에 사용하십시오 []. 그리고 첫 번째 기본 인수로 :사용 하지 1않습니까? 따라서 이것은 vin:"G@:)]Xh12 바이트 일 수 있습니다 .
Giuseppe

@Giuseppe 감사합니다! 내 MATL은 약간 녹슨 것 같습니다 :(
Suever


2

, 6 바이트

Eθ…θκθ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

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

1 바이트의 비용으로 Charcoal에 n+1입력을 마지막 요소로 포함 하는 -element 배열 을 인쇄하도록 요청할 수 있지만 출력은 동일하지만 다른 위치로 인쇄하려고하면 커서 위치가 달라집니다.



2

RAD , 7 바이트

(⊂⍬),,\

온라인으로 사용해보십시오!

이것은 Dyalog APL에서도 함수로 작동합니다.

어떻게?

APL과 RAD 모두 밀접한 관계에서 동일하게 작동합니다.

  • (⊂⍬) 빈 배열
  • , 접두사
  • ,\ 접두사 (빈 배열은 제외)



2

brainfuck , 43 바이트

널이 아닌 문자 목록을 입력으로 취하고 모든 접 두부를 줄 바꾸기로 구분하여 리턴합니다. 이중 무한대 또는 랩핑 테이프가 필요합니다.

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

온라인으로 사용해보십시오!


또 다른 대답 은 절반 이상이 나를 능가 했습니다. 읽는 동안 출력 인쇄에 대해서는 생각하지 않았기 때문 입니다. 물론이 방법은 접미사가 증가하는 인쇄에서는 작동하지 않습니다.
user202729

약간 정리 된 40 바이트
Jo King

2

C # (Visual C # 대화식 컴파일러) , 39 바이트

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

온라인으로 사용해보십시오!


System.Linq; 바이트 수에 사용을 포함해야합니다 . 그리고 출력 논리 중 일부가 배열 출력에있는 것 같습니다. 빈 배열은 빈 배열을 반환하기 때문입니다.
LiefdeWen

@ LiefdeWen-내 해석은이 인터프리터에 대한 참조가 포함되어 있기 때문에 System.Linq바이트 수에 이것을 포함 할 필요가 없다는 것입니다. 내 제출은 말과 다른 언어로 간주됩니다 .NET Core. github.com/dotnet/roslyn/wiki/C%23-Interactive-Walkthrough- 당신은 별도의 문제인 인쇄에 대해 언급하고 있습니다.
dana December

인쇄와 관련하여 기본적으로 결과를 콘솔에 덤프하는 버전이 있습니다 -tio.run/##XY29CsIwGEX3PEXGBGKhtVt/…- 확실하지는 않습니다! 내가 가진 질문은 언제 Arrayvs IListvs 을 사용할 수 있는지 IEnumerable입니다.
dana


2

자바 8+ , 86 77 바이트

Kevin Cruijssen 덕분에 -9 바이트 (수입 제거)!

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

온라인으로 사용해보십시오!

대안, 65 바이트

다음은 결과를 stdout ( Olivier Grégoire 로 인해)으로 인쇄합니다 .

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

온라인으로 사용해보십시오


java.util.stream.IntStream직접 사용 하여 가져 오기를 삭제 하여 77 바이트로 골프화 할 수 있습니다 .
Kevin Cruijssen

@ KevinCruijssen : 오 감사합니다! 나는 이것이 가능하다는 것을 몰랐다. 확실히 도움이되었다 (적어도 골프 목적으로).
ბიმო

x->{for(int i=0;i<=x.size();)System.out.println(x.subList(0,i++));}( 67 바이트 ). 스트림을 사용하는 대신 인쇄합니다. 복잡한 구조를 출력하는 가장 짧은 방법은 인쇄입니다.
Olivier Grégoire

@ OlivierGrégoire :이 경우 System.out.print출력이 여전히 명확하기 때문에 벗어날 수 있습니다 .
ბიმო

@BMO 실제로, 가능할 것입니다!
Olivier Grégoire


2

루비 , 31 29 바이트

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

온라인으로 사용해보십시오!

설명:

->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
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.