离开巢穴


23

给定一个非整数的整数列表,请输出一个列表,其中包含每个嵌套级别中的整数(从最小嵌套级别开始),并按从左到右的顺序以原始顺序显示值。如果两个或更多个列表在输入列表中处于同一嵌套级别,则应将它们合并到输出中的单个列表中。输出不应包含任何空列表-仅包含列表的嵌套级别应完全跳过。

您可以假定整数都在(包括)范围内[-100, 100]。列表没有最大长度或嵌套深度。输入中将没有空列表-每个嵌套级别将至少包含一个整数或列表。

输入和输出必须在您语言的本机列表/数组/可枚举/可迭代/等中。格式,或者如果您的语言缺少序列类型,则采用任何合理,明确的格式。

例子

[1, 2, [3, [4, 5], 6, [7, [8], 9]]] => [[1, 2], [3, 6], [4, 5, 7, 9], [8]]

[3, 1, [12, [14, [18], 2], 1], [[4]], 5] => [[3, 1, 5], [12, 1], [14, 2, 4], [18]]

[2, 1, [[5]], 6] => [[2, 1, 6], [5]]

[[54, [43, 76, [[[-19]]]], 20], 12] => [[12], [54, 20], [43, 76], [-19]]

[[[50]], [[50]]] => [[50, 50]]

Answers:


5

珀斯,17岁

 us-GeaYsI#GQ)S#Y

领先的空间很重要。这将过滤列表,确定s函数上的值是否不变,然后从列表中删除这些值并将其展平。这些值也存储在其中,Y并且在我们打印时,如果列表的排序值是真实的,则通过过滤来删除空值。

测试套件

或者,以可疑的输出格式提供15字节的答案:

 us-GpWJsI#GJQ)

测试套件

扩张:

 us-GeaYsI#GQ)S#Y     ##   Q = eval(input)
 u          Q)        ##   reduce to fixed point, starting with G = Q
        sI#G          ##   get the values that are not lists from G
                      ##   this works because s<int> = <int> but s<list> = flatter list
      aY              ##   append the list of these values to Y
     e                ##   flatten the list
   -G                 ##   remove the values in the list from G
              S#Y     ##   remove empty lists from Y




1

Mathematica 55 64 62字节

#~Select~AtomQ/.{}->Nothing&/@Table[Level[#,{k}],{k,Depth@#}]&

%&[{1, 2, {3, {4, 5}, 6, {7, {8}, 9}}}]

{{1,2},{3,6},{4,5,7,9},{8}}


1

JavaScript,112 80字节

F=(a,b=[],c=0)=>a.map(d=>d!==+d?F(d,b,c+1):b[c]=[...b[c]||[],d])&&b.filter(d=>d)

感谢Neil帮助削减了32个字节。


1
这里打高尔夫球的机会很多。一些简单的是,除去!=null因为null是falsy反正。这b=也是不必要的。已经移除,然后可以移动.filter(a=>x)&&b,然后降低外功能,您可以再内嵌到内部函数的调用。我剩下的是:f=(a,b=[],c=0)=>a.map(d=>d[0]?f(d,b,c+1):b[c]=[...b[c]||[],d])&&b.filter(d=>d)
尼尔

@Neil d[0]?将评估false它是否等于0,在范围之内[-100,100]。所以会d=>d
帕特里克·罗伯茨

@Neil匆匆把它扔了,所以我知道还有其他机会可以缩小它,但这比我那时做的要好得多。谢谢!哦,由于这个原因,Patrick对空检查是正确的。我去了d===+d,因为它在null检查中节省了2个字节。
Mwr247 '16

1
@Dendrobium无法正确处理最后一种情况(或任何带有的情况[...,[[...]]]
Mwr247 '16

1
@PatrickRoberts d=>d可以,因为那时候d总是数组或null,但是关于d[0]d.map这是一个公平的观点,尽管总有一个数组是正确的,但对于数字却是虚假的。
尼尔,


0

Python,108 99字节

这对我来说似乎有点长,但我无法缩短单线,如果我尝试使用or而不是,则会if在结果中得到空列表。

def f(L):
    o=[];i=[];j=[]
    for x in L:[i,j][[]<x]+=[x]
    if i:o+=[i]
    if j:o+=f(sum(j,[]))
    return o

在线尝试

编辑:由于堆栈溢出,节省了9个字节


您应该将缩进更改为单个空格,以便它们在代码块中正确呈现。您还可以使用filter(None,o)来删除的最外层嵌套级别的空列表o
Mego 2016年

我更喜欢使用标签查看我的代码。空间是邪恶的。
mbomb007 '16

SE Markdown将制表符转换为4个空格,因此无论如何都不会转义它们:)在Markdown中使用单个空格会使代码块的字节数实际上与代码的字节数匹配。
Mego 2016年

但是,如果您希望对其进行编辑,则我的代码本身包含选项卡。重要的是内部。;)
mbomb007 '16

0

Python 3,109个字节

与以往一样,像ints和lists 这样的愚蠢Python 2功能意味着Python 3排在后面。那好吧...

def d(s):
 o=[]
 while s:
  l,*n=[],
  for i in s:
   try:n+=i
   except:l+=[i]
  if l:o+=[l]
  s=n
 return o

0

Perl,63个字节

{$o[$x++]=[@t]if@t=grep{!ref}@i;(@i=map{@$_}grep{ref}@i)&&redo}

预期输入@i,产生输出@o。(我希望这是可以接受的)。

例:

@i=[[54, [43, 76, [[[-19]]]], 20], 12];                              # input

{$o[$x++]=[@t]if@t=grep{!ref}@i;(@i=map{@$_}grep{ref}@i)&&redo}      # the snippet

use Data::Dumper;                                                    # print output
$Data::Dumper::Indent=0;  # keep everything on one line
$Data::Dumper::Terse=1;   # don't print $VAR =
print Dumper(\@o);

输出:

[[12],[54,20],[43,76],[-19]]

0

Clojure,119个字节

(带有seq?的116,并以列表形式输入,进行了细微的修改)

(defn f([v](vals(apply merge-with concat(sorted-map)(flatten(f 0 v)))))([l v](map #(if(number? %){l[%]}(f(inc l)%))v)))

更好的意图:

(defn f([v]  (vals(apply merge-with concat(sorted-map)(flatten(f 0 v)))))
       ([l v](map #(if(number? %){l[%]}(f(inc l)%))v)))

当使用两个参数(当前级别和一个集合)进行调用时,它要么创建一个像元素的无序映射{level: value},要么f在看到一个非数字(可能是一个集合)时递归调用。

然后将这些迷你地图合并为一个,sorted-map并通过concat函数处理按键冲突。vals从第一层到最后一层返回地图的值。

如果一个数字在其级别上是唯一的,那么它仍为a vec,其他数字将由转换为列表concat

(f [[54, [43, 76, [[[-19]]]], 20], 12])
([12] (54 20) (43 76) [-19])

如果输入的是一个list代替vec,然后number?可以被替代seq?,奇怪的载体不是seq?,但它是sequential?。但是我懒得实现那个版本,重新做例子等等。


0

球拍259字节

(let((ol'())(m 0))(let p((l l)(n 0))(cond[(empty? l)][(list?(car l))(set! m(+ 1 n))
(p(car l)(+ 1 n))(p(cdr l)n)][(set! ol(cons(list n(car l))ol))(p(cdr l)n )]))
(for/list((i(+ 1 m)))(flatten(map(λ(x)(cdr x))(filter(λ(x)(= i(list-ref x 0)))(reverse ol))))))

取消高尔夫:

(define (f l)
  (define ol '())
  (define maxn 0)
  (let loop ((l l)              ; in this loop each item is added with its level
             (n 0))
    (cond
      [(empty? l)]
      [(list? (first l))
       (set! maxn (add1 n))
       (loop (first l) (add1 n))
       (loop (rest l) n)]
      [else
       (set! ol (cons (list n (first l)) ol))
       (loop (rest l) n )]))

  ; now ol is '((0 1) (0 2) (1 3) (2 4) (2 5) (1 6) (2 7) (3 8) (2 9)) 

  (for/list ((i (add1 maxn)))   ; here similar levels are combined
    (flatten
     (map (λ (x) (rest x))      ; level numbers are removed
          (filter (λ (x) (= i(list-ref x 0)))
                  (reverse ol))))))

测试:

(f '[1 2 [3 [4 5] 6 [7 [8] 9]]])

输出:

'((1 2) (3 6) (4 5 7 9) (8))

0

MATL,37字节

j']['!=dYsXKu"GK@=)'[\[\],]'32YXUn?1M

在线尝试!

与该语言/编译器的当前版本(13.0.0)一起使用。

这将输出生成为以空格分隔的值的行,其中每行对应于相同的嵌套级别,而不同的嵌套级别由换行符分隔。

j            % read input as string (row array of chars)
']['!        % 2x1 array containing ']'  and '['
=            % test for equality, all combinations
d            % row array obtained as first row minus second row
Ys           % cumulative sum. Each number is a nesting level
XK           % copy to clibdoard K
u            % unique values: all existing nesting levels
"            % for each nesting level
  G          %   push input
  K          %   push array that indicates nesting level of each input character
  @          %   push level corresponding to this iteration
  =          %   true for characters corresponding to that nesting level
  )          %   pick those characters
  '[\[\],]'  %   characters to be replaced
  32         %   space
  YX         %   regexp replacement
  U          %   only numbers and spaces remain: convert string to array of numbers
  n?         %   if non-empty
    1M       %     push that array of numbers again
             %   end if implicitly
             % end for each implicitly
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.