给定一些有限列表,以其长度的升序返回所有前缀的列表,包括一个空列表。
(基本实现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]]
给定一些有限列表,以其长度的升序返回所有前缀的列表,包括一个空列表。
(基本实现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]]
Answers:
编辑:通过完全不同的扫描,又缩短了一个字节。
匿名函数略微影响了琐碎的导入。
scanr(\_->init)=<<id
=<<
的缩写(scanr(\_->init)=<<id) l = scanr(\_->init) l l
。l
从右到左扫描列表,使用函数收集中间结果\_->init
。init
到扫描的初始值(也就是)l
。-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
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
²£¯Y
说明:
² :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
{(),|[\,] @_}
解释:
在Perl 6中,您可以将运算符括在方括号中,作为编写列表精简的另一种方法。 [+] @array
返回中的元素之和@array
,[*] @array
返回乘积,等等。您还可以在运算符前面加上反斜杠以进行“三角形”归约,有些语言将其称为“扫描”。因此,[\+] @array
返回一个列表,其中包含的第一个元素@array
,然后是前两个元素的总和,然后是前三个元素的总和,依此类推。
这[\,] @_
是@_
使用列表构造运算符对输入数组进行的三角缩减,
。因此,它求值为一个列表列表:的第一个元素@_
,的前两个元素@_
,等等。这几乎是必需的,但是问题首先需要一个空列表。所以返回列表的第一个元素是一个文字空列表(),
,然后输入列表的约数用展平到返回列表的其余部分|
。
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
{}~FoldList@Append~#&
。
param($a)'';$x=,0*($y=$a.count);0..--$y|%{$x[$_]=@($a[0..$_])};$x
PowerShell的有益解开名单-的-列表时默认Write-Output
发生在程序完成后,让你获得每个项目一行。钉上-join','
看到列表中,列出了更好的,通过转换内部列表为字符串。
(ab)使用以下事实:尝试输出一个空数组(例如@()
)将导致没有输出,因此一个空数组输入只是''
作为输出,因为$a[0..$_]
不会产生任何结果。它还会抛出一些异常的错误消息。
,\(,()),
在K4中 在征募输入中加入征募null?怎么做?
()
是一个空列表。(,()),x
准备到x
。最后,\
进行连续扫描。将x
被省略以形成组合物。请注意,结尾,
是二进位的,因此它是“ concat”,而不是“ enlist”。
1_',\0,
但是我的解析器不够聪明,无法处理此问题……
(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
实际上,我有两个非常相似的答案,它们的长度相同。它们都采用通用序列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个字节
@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@:)]Xh
12个字节。
i(X,Y):-append(X,_,Y).
System.Linq;
在字节数中包含using。看来您的某些输出逻辑在数组的输出中。因为空数组只返回空数组。
System.Linq
,因此我不必在字节数中包括它。我的意见书被认为是与说不同的语言.NET Core
。github.com/dotnet/roslyn/wiki/C%23-Interactive-Walkthrough-您提到打印是一个单独的问题,我想首先澄清一下。
Array
VS IList
VS IEnumerable
。
-9个字节感谢Kevin Cruijssen(摆脱了导入)!
x->java.util.stream.IntStream.range(0,x.size()+1).mapToObj(t->x.subList(0,t))
下面将把结果打印到stdout(由于OlivierGrégoire):
x->{for(int i=0;i<=x.size();)System.out.print(x.subList(0,i++));}
java.util.stream.IntStream
并删除导入。
System.out.print
由于输出仍然是明确的,您可能可以避免使用。
->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
}
}