P Pr Pre Pref Prefi Prefix Prefixe Prefixes


34

いくつかの有限リストが与えられた場合、空のリストを含むすべてのプレフィックスのリストを長さの昇順で返します。

(基本的にHaskell関数を実装しますinits。)

詳細

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

リストがヌルで終了することを期待できますか?

これは特にC / C ++で一般的で、主な用途は文字列です。

@Rogemそれが一般的であれば、許可するのが合理的だと思います。
flawr

回答:


15

Haskell、20バイト

編集:しかし、完全に異なるスキャンで1バイト短くなります。

些細なインポートをわずかに上回る匿名関数。

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

オンラインでお試しください!

  • =<<略語に使用し(scanr(\_->init)=<<id) l = scanr(\_->init) l lます。
  • リストlを右から左にスキャンし、関数で中間結果を収集します\_->init
  • その関数は、スキャンされた要素を無視します(収集された結果の正しい全長を取得するためにのみ使用されます)ので、実際initにはスキャンの初期値(これも)に適用を繰り返しlます。

13

brainfuck21 12バイト

Arnauld ÿが改行ではなく区切り文字を提案してくれたおかげで-9バイト

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

オンラインでお試しください!

ヌルバイトなしでSTDINを介してバイトを取得ÿし、先頭のÿ文字を含む文字で区切られた一連のプレフィックスを出力します。たとえば、入力の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実装でのみ機能します。
開発

11

JavaScript(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:うわー、それは、コードの説明、素晴らしい仕事の全く新しいレベルだ
ブライアン・H.

@BrianH。ありがとうございました!単純なタスクは、より高密度のコードでは実現できない詳細な説明を書く良い機会です。
アーナルド

手で作ったの?または、聞いたこともない奇妙なソフトウェアの助けを借りましたか?
ブライアンH.

2
いくつかの列モード編集を備えたNotepad ++のみ。
アーナルド

8

すべての些細なエントリの CW

クリーン、19バイト

HaskellバージョンはCleanでも動作します。

import StdLib
inits

オンラインでお試しください!

Haskell、22バイト

import Data.List
inits

オンラインでお試しください!

プロローグ(SWI)、6バイト

prefix

オンラインでお試しください!


引き裂かれた-賛成か否か。一方では、すべての組み込みソリューションを1か所で評価しています。一方、



6

Perl 6、13バイト

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

オンラインでお試しください!

説明する:

Perl 6では、リスト削減を記述する別の方法として、演算子を角括弧で囲むことができます。 [+] @arrayリターンの要素の和@array[*] @array積、などあなたはまた、いくつかの言語が呼ぶ「三角形」の減少、作るためにバックスラッシュをオペレータに先行することができる返す「スキャンを。」したがって[\+] @array、の最初の要素@array、最初の2つの要素の合計、最初の3つの要素の合計などで構成されるリストを返します。

これ[\,] @_@_、リスト構築演算子を使用した入力配列の三角縮約,です。したがって、リストのリストに評価されます:の最初の要素@_、の最初の2つの要素@_など。それはほとんど必要なものですが、問題は最初に単一の空のリストを必要とします。したがって、戻りリストの最初の要素はリテラルの空のリスト(),であり、入力リストに対する縮小は、を使用して戻りリストの残りに平坦化され|ます。


2
O_oここで何が起きているのか
ASCIIのみ

1
@ASCIIのみの三角縮約
user202729


5

R 40 39バイト

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

オンラインでお試しください!

-1バイトのおかげで digEmAllの

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

代わりに入力をベクトルとして取得すると、入力は技術的には適切ではありませんが、よりきれいな出力形式になりますlist



@digEmAllありがとう!
ジュゼッペ


4

Mathematica、22 21バイト

ミーシャ・ラブロフのおかげで-1バイト!

{}~FoldList@Append~#&

純粋な機能。リストを入力として受け取り、リストのリストを出力として返します。これが最短の解決策だと思います。


同じソリューションをよりコンパクトに記述できます{}~FoldList@Append~#&
ミシャラヴロフ

@MishaLavrovありがとう!そのようなカリー化された1 + 2引数形式を使用することは考えていませんでした。
LegionMammal978



3

PowerShell、65バイト

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

オンラインでお試しください!

PowerShellの親切アンロールリスト・オブ・リストのデフォルトは、Write-Outputあなたが1行に1つのアイテムを取得するので、プログラムの完了時に起こります。にタック-join','内部のリストを文字列に変換することにより、リストのリストをよりよく見るためにします。

(ab)空の配列(例:)を出力しようとすると出力@()がなくなるという事実を使用します。したがって、空の配列入力''は出力と同じになります$a[0..$_]。また、いくつかの壮大なエラーメッセージがスローされます。


割り当てる代わりに括弧で囲むと、20バイト節約されます。それがリストのリストを返すとは思わない限り。私はいつもその区別についてあいまいでした。
ヴェスカ

@veskahええ、それは私がこのバージョンを編集する前にほとんど持っていたものです。あなたのソリューションまたは私の以前のソリューションの問題-リストのリストを返しません。TIO1TIO2
AdmBorkBork

3

1
これはある種のブードゥー教です。,\(,()),K4で。登録された入力に沿って登録されたnullに参加しますか?howsitwork?
ストリートスター

1
@streetster ()は空のリストです。(,()),xを先頭に追加しxます。最後に,\ concat-scanを実行します。x組成物を形成するために省略されています。末尾,は二項であるため、「参加」ではなく「連結」であることに注意してください。
NGN

1
:@streetster K4にそれがバイトより短くすることができ1_',\0,ます...しかし、私のパーサはこれを処理するスマート十分ではありません
NGN

3

Common Lisp、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バイト

私は実際に、これについて2つの非常によく似た答えを持っています。どちらも同じ長さです。両方とも一般的なシーケンスを取りますsパラメーターとしてをます。

最初の解決策:

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

オンラインでお試しください!

Seq.takenシーケンスの最初の要素を取ります。Seq.initシーケンスの長さのカウント(この場合)にs1を加えた新しいシーケンスを作成し、シーケンスの各要素に対して、最初のn要素を取得しますsます。

2番目の解決策:

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バイトになります。
ジュゼッペ

@ジュゼッペありがとう!私の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バイトのコストでn+1、最後の要素として入力を含む-element配列を印刷するようにCharcoalに依頼することは可能ですが、出力は同じですが、次に何かを印刷し続けるとカーソル位置が異なります。



2

RAD、7バイト

(⊂⍬),,\

オンラインでお試しください!

これはDyalog APLでも機能として機能します。

どうやって?

これは、APLとRADの密接な関係を考えると、同じように機能します。

  • (⊂⍬) 空の配列
  • , の前に
  • ,\ プレフィックス(空の配列を除く)



2

brainfuck、43バイト

非ヌル文字のリストを入力として受け取り、改行で区切られたすべてのプレフィックスを返します。二重無限またはラッピングテープが必要です。

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

オンラインでお試しください!


読んでいる間に出力印刷することを考えなかったので、別の答えは半分以上も私を凌outしました。もちろん、この方法は、接尾辞を増やして印刷すると機能しません。
user202729

いくつかの再編成を伴う40バイト
ジョーキング

2

C#(Visual C#Interactive Compiler)、39バイト

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

オンラインでお試しください!


System.Linq; バイトカウントにusing を含める必要があります。そして、出力ロジックの一部が配列の出力にあるようです。空の配列は単に空の配列を返すからです。
LiefdeWen

@LiefdeWen-私の理解では、このインタープリターにはへの参照が含まれてSystem.Linqいるため、これをバイトカウントに含める必要はありません。私の提出は言うとは異なる言語と考えられます.NET Coregithub.com/dotnet/roslyn/wiki/C%23-Interactive-Walkthrough-別の問題である印刷について言及していますが、最初にこれについて明確にしたいと思います。
ダナ

印刷に関しては、基本的に結果をコンソールにダンプするバージョンがあります-tio.run/##XY29CsIwGEX3PEXGBGKhtVt/…-確かではありません!私が持っている質問は、いつArrayvs IListvs を使用することが許容されるかIEnumerableです。
ダナ


2

Java 8以降、86 77バイト

-9バイトのおかげで Kevin Cruijssenの(インポートを削除)!

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

オンラインでお試しください!

代替、65バイト

以下は、結果をstdoutに出力しますOlivierGrégoireによる)):

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

オンラインで試す


java.util.stream.IntStream直接使用してインポートをドロップするだけで、77バイトまでゴルフできます。
ケビンクルーイッセン

@KevinCruijssen:ああ、ありがとう!これが可能であることすら知りませんでしたが、それは確かに役立ちます(少なくともゴルフの目的には)。
ბიმო

x->{for(int i=0;i<=x.size();)System.out.println(x.subList(0,i++));}67バイト)。これは、ストリームを使用する代わりに印刷します。通常、印刷は複雑な構造を出力する最短の方法です。
オリビエグレゴワール

@OlivierGrégoire:その場合System.out.print、出力はまだ曖昧ではないので、おそらく逃げることができます。
ბიმო

@BMO確かに、それは可能でしょう!
オリビエグレゴワール


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.