P Pr Pref Pref Prefi Prefixe Prefixes


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的答案似乎做到了这一点。
瑕疵的

我们可以期望列表以空值结尾吗?

它在C / C ++中尤其常见,主要用途是字符串。

@Rogem如果很常见,我认为允许这样做是合理的。
瑕疵

Answers:


15

Haskell,20个字节

编辑:通过完全不同的扫描,又缩短了一个字节。

匿名函数略微影响了琐碎的导入。

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

在线尝试!

  • 使用=<<的缩写(scanr(\_->init)=<<id) l = scanr(\_->init) l l
  • l从右到左扫描列表,使用函数收集中间结果\_->init
  • 该函数将忽略扫描通过的元素(它们仅用于获取所收集结果的正确总长度),因此实际上会迭代应用init到扫描的初始值(也就是)l

13

Brainfuck21 12字节

-9个字节,感谢Arnauld建议使用分隔符ÿ而不是换行符

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

在线尝试!

通过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
Brian H.

@BrianH。谢谢!简单的任务是编写详细的解释的好机会,而这些解释不能在更密集的代码中提出。
Arnauld

你是手工做的吗?还是从我从未听说过的任何怪异软件获得帮助?
Brian H.

2
只需Notepad ++即可进行某些列模式编辑
Arnauld


6

果冻,3个字节

ṭṖƤ

在线尝试!

怎么运行的

ṭṖƤ  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个字节

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

在线尝试!

解释:

在Perl 6中,您可以将运算符括在方括号中,作为编写列表精简的另一种方法。 [+] @array返回中的元素之和@array[*] @array返回乘积,等等。您还可以在运算符前面加上反斜杠以进行“三角形”归约,有些语言将其称为“扫描”。因此,[\+] @array返回一个列表,其中包含的第一个元素@array,然后是前两个元素的总和,然后是前三个元素的总和,依此类推。

[\,] @_@_使用列表构造运算符对输入数组进行的三角缩减,。因此,它求值为一个列表列表:的第一个元素@_,的前两个元素@_,等等。这几乎是必需的,但是问题首先需要一个空列表。所以返回列表的第一个元素是一个文字空列表(),,然后输入列表的约数用展平到返回列表的其余部分|


2
O_O什么甚至发生在这里
ASCII-仅



5

R40 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

取而代之的将输入作为向量给出更整洁的输出格式,尽管从技术上讲输入不是lists。



@digEmAll谢谢!
朱塞佩


4

Mathematica, 22 21字节

-1个字节感谢Misha Lavrov

{}~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发生在程序完成后,让你获得每个项目一行。钉上-join','看到列表中,列出了更好的,通过转换内部列表为字符串。

(ab)使用以下事实:尝试输出一个空数组(例如@())将导致没有输出,因此一个空数组输入只是''作为输出,因为$a[0..$_]不会产生任何结果。它还会抛出一些异常的错误消息。


将它包装在parens中而不是分配它可以节省20个字节。除非您认为这不算返回列表列表。对于这种区别,我一直很模糊。
维斯卡

@veskah是的,这几乎是我对该版本进行编辑之前的内容。您的解决方案或我先前的解决方案存在的问题-它不会返回列表列表。TIO1 VS TIO2
AdmBorkBork

3

K(ngn / k),8个字节

,\(,!0),

在线尝试!


1
这是某种伏都教。,\(,()),在K4中 在征募输入中加入征募null?怎么做?
streetster

1
@streetster ()是一个空列表。(,()),x准备到x。最后,\ 进行连续扫描。将x被省略以形成组合物。请注意,结尾,是二进位的,因此它是“ concat”,而不是“ enlist”。
ngn

1
@ k4中的@streetster可以短一个字节:1_',\0,但是我的解析器不够聪明,无法处理此问题……
ngn

3

普通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个字节

实际上,我有两个非常相似的答案,它们的长度相同。它们都采用通用序列s作为参数。

第一个解决方案:

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

在线尝试!

Seq.take接受n序列的第一个元素。Seq.init创建一个新序列,该序列的长度(在这种情况下)为序列的长度s加1,并且序列中的每个元素都采用中的第一个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谢谢!我的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

脑干,43字节

以非空字符列表作为输入,并返回所有以换行符分隔的前缀。需要无限双或包装带。

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

在线尝试!


另一个答案 outgolfed我用了一半多,因为我也没多想打印输出,同时阅读。当然,该方法不适用于打印增加后缀的情况。
user202729

40个字节并进行了一些重新排列
Jo King

2

C#(Visual C#交互式编译器),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-您提到打印是一个单独的问题,我想首先澄清一下。
dana

关于打印,这是一个基本上将结果转储到控制台的版本-tio.run / ## XY29CsIwGEX3PEXGBGKhtVt / ...-肯定不是那么漂亮!我的问题是,当是可以接受的使用ArrayVS IListVS IEnumerable
dana

2

F#(单声道),45字节

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

在线尝试!

我不完全确定这是否有效,但似乎它遵循与我在其他几种语言中使用过的相同的“匿名lambda”语法。


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++));}

在线尝试


您可以通过直接使用它来将其打高尔夫球到77个字节,java.util.stream.IntStream并删除导入。
凯文·克鲁伊森

@KevinCruijssen:谢谢!我什至不知道这是可能的,这肯定是有帮助的(至少对于打高尔夫球而言)。
ბიმო

x->{for(int i=0;i<=x.size();)System.out.println(x.subList(0,i++));}67个字节)。打印而不是使用流。打印通常是输出复杂结构的最短方法。
奥利维尔·格雷戈尔

@OlivierGrégoire:在这种情况下,System.out.print由于输出仍然是明确的,您可能可以避免使用。
ბიმო

@BMO的确可以!
奥利维尔·格雷戈雷

2

Brachylog,9个字节

a₀ᶠ~b.hĖ∧

在线尝试!

说明

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

红宝石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
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.