将字符串嵌套在数组中n次


16

你必须出示其嵌套字符串函数s的数组中,n

>>> N("stackoverflow",2)
[['stackoverflow']]

参数:

  1. s -ASCII字符串
  2. n -一个整数 >= 0

规则

  • 最短的代码获胜。
  • 输出将是一个嵌套arraylisttuple(基于关阵列或类似类型)

测试用例

>>> N("stackoverflow",0)
'stackoverflow'
>>> N("stackoverflow",1)
['stackoverflow']
>>> N("stackoverflow",5)
[[[[['stackoverflow']]]]]

启发:将字符串嵌套在列表中n次,即列表的列表中的列表


6
输出必须是列表,还是可以是表示该列表的字符串?
clismique

2
我们可以按任何顺序获取参数吗?
苏格拉底凤凰城

@SocraticPhoenix我认为,除非明确禁止,否则-您可以采用任何合理的格式输入(我认为这也包括将两者作为列表)。也许更有经验的人可以指向相关的元信息。
乔纳森·艾伦

字符串是否会包含转义符"?例如N("stack\"overflow",5)
Riley

@Riley它可以包含任何ascii字符
jamylak

Answers:


11

果冻,2 个字节

由于:(1)果冻没有字符串,只有字符列表;因此略有混乱。及(2); 输出不会显示嵌套。要查看这实际上在做什么,请查看结果的Python字符串表示形式:

W¡ŒṘ

[]由于字符串本身将是一个字符列表,因此将额外出现一对。例如

怎么样?

W¡ - Main link: s, n
W  - wrap left, initially s, in a list
 ¡ - repeat previous link n times

概念验证代码增加了:

W¡ŒṘ - Main link: s, n
  ŒṘ - Python string representation


“更好”是因为看起来好像正在使用字符串...但是,它并不表示实际上正在使用字符列表。
乔纳森·艾伦,

15

Java和C#,62个字节

Object f(String s,int n){return n<1?s:new Object[]{f(s,n-1)};}

应该在Java和C#中都无需修改即可工作。


聪明!+1我试图通过嵌套一个String数组使它在Java中工作,但实际上并没有奏效。使用Object作为返回类型并将其嵌套在Object []中只是解决此挑战所需的解决方案,因为Object [](或任何数组)本身也是Object。好一个。
凯文·克鲁伊森

12

05AB1E,3个字节

`F)

说明

`   # Flatten the input array on the stack.
 F  # Element_2 times do:
  ) # Wrap the total stack into a single array.

这意味着这也适用于0 -testcase,因为字符串已经在堆栈中。

在线尝试!


8

JavaScript(ES6),20个字节

d=>g=n=>n--?[g(n)]:d

尽管人们通常会me缩我的功能以节省1个字节,但这种情况实际上有助于解决方案。


大量使用curry。我认为您可以使其更具可读性:d=>g=n=>n?[g(n-1)]:d
ETHproductions's October


5

CJam7 6字节

{{a}*}

在线口译

这是一个未命名的函数,该函数从堆栈中获取其参数为S NS是字符串和N是自动换行。您可以使用~运算符执行它,即eval。

说明:

{{a}*}
{      Open block    [A B]
 {     Open block    [A]
  a    Wrap in array [[A]]
   }   Close block   [A B λwrap]
    *  Repeat        [A:wrap(*B)]
     } Close block   ["S" N λ(λwrap)repeat]

只需使用未命名的块来避免笨拙的输入格式{{a}*}{'a*~}
Martin Ender

@MartinEnder恐怕它会占用字节,而且我认为输入格式是100%可以接受的。这只是一个列表,我认为这两个参数的输入方式没有限制。另外,我从未命名该块。
暴民埃里克(Erik the Outgolfer)

我不知道您对字节的意思是什么?这些解决方案都只有6个字节。
Martin Ender

@MartinEnder哦,这些都是完整的解决方案吗?我以为您在谈论扩展程序,但是您只是将其转换为函数?好吧,这改变了整个观点。我是CJam / GolfScript / Pyth的新手。我喜欢第一个,因为它{a}比第二个(产生一串n as并执行它)更容易理解(重复n次)。
暴民埃里克(Erik the Outgolfer)

4

Javascript ES6,23个字节

递归函数

f=(a,i)=>i?f([a],--i):a

console.log(f("stackoverflow",0))
console.log(f("stackoverflow",1))
console.log(f("stackoverflow",2))
console.log(f("stackoverflow",5))

固化结果的长度相同

f=a=>i=>i?f([a])(--i):a

4

Brachylog,10个字节

tT,?h:T:gi

在线尝试!

说明

tT,            T is the integer (second element of the Input)
   ?h:T:g      The list [String, T, built-in_group]
         i     Iterate: Apply built-in_group T times to String

如果没有错误,这将是3个字节。[String, T, built-in_group]尽管[String, T]已经是我们的输入,但在这里我们需要所有这些来获取列表。

不幸的是,:g直接导致[[String, T], built-in_group]i由于整数T在第一个列表内,因此无法正确识别。


4

MATL,6个字节

ji:"Xh

这将产生一个嵌套的单元格数组作为输出。但是,使用MATL的默认显示,您不必看到它的样子,因为它不会显示所有花括号。下面的演示是一个稍作修改的版本,显示了输出的字符串表示形式。

ji:"Xh]&D

在线尝试

说明

j       % Explicitly grab the first input as a string
i       % Explicitly grab the second input as an integer (n)
:"      % Create an array [1...n] and loop through it
    Xh  % Each time through the loop place the entire stack into a cell array
        % Implicit end of for loop and display


3

Pyth,3个字节

]Fw

固定链接

这将输出类似...[[[[['string']]]]]...。不会引用零深度:string

说明:

]Fw
   Q Implicit: Eval first input line
]    Function: Wrap in array
  w  Input line
 F   Apply multiple times

如果要引用零深度,请改用以下4字节解决方案(解释):

`]Fw
    Q Implicit: Eval first input line
 ]    Function: Wrap in array
   w  Input line
  F   Apply multiple times
`     Representation

3

PHP,60字节

for($r=$argv[1];$i++<$argv[2];)$r=[$r];echo json_encode($r);

48字节(如果仅看起来像任务)

for($r=$argv[1];$i++<$argv[2];)$r="[$r]";echo$r;

我认为直接重写问题所有者自己的Python答案仍然是PHP中最短的:function f($s,$n){return$n?[f($s,$n-1)]:$s;}
manatwork

print_r()并且,如果您不喜欢该选项,则在区分输出时,serialize()两者都比将其短json_encode()
user59178 '16

顺便说一句,')代码结尾处的孤独看起来很奇怪。
manatwork

@manatwork复制和粘贴错误谢谢
约尔格Hülsermann

3

Ruby:23个字节

->n,s{n.times{s=[s]};s}

已对其进行更新,使其成为可调用的Proc,而不是原始代码段。我很想知道是否有一种方法可以s隐式地返回而不是显式地返回它。


2
通常,您的“再说几句话”应该解释您的代码如何工作。但这仍然是一个很好的答案。
wizzwizz4 2016年

“您必须产生一个功能”这是一个代码片段。除非另有明确说明,否则输入和输出必须由代码显式处理,或者如果具有此功能,则由解释器隐式处理。您不能期望设置一些全局变量,也不能只将结果保留在某些全局变量中。
manatwork

欢迎来到PPCG!不过,所有答案都应该是可调用的函数或完整的程序。就您而言,最短的解决方法是使用未命名的函数,例如->s,n{...}
马丁·恩德

@ wizzwizz4和Martin,感谢您的鼓励和有用的输入,我已经学到了一些东西,会有所更新。操练,我的皮肤结实,在SO上有很多要点,但是您知道,像这样的直言不讳令新手远离Stack网站并使其受到恐吓。似乎很丢人吗?
彼得·尼克西

3

C,44字节,41字节

int*n(int*s,int a){return a?n(&s,a-1):s;}

您可以通过执行以下操作对其进行测试:

int main(void) {
    char* s = "stackoverflow";

    /* Test Case 0 */
    int* a = n(s,0);
    printf("'%s'\n", a);

    /* Test Case 1 */
    int* b = n(s,1);
    printf("['%s']\n", *b);

    /* Test Case 2 */
    int** c = n(s,2);
    printf("[['%s']]\n", **c);

    /* Test Case 3 */
    int*** d = n(s,3);
    printf("[[['%s']]]\n", ***d);

    /* Test Case 4 */
    int********** e = n(s,10);
    printf("[[[[[[[[[['%s']]]]]]]]]]\n", **********e);

    return 0;
}

输出:

'stackoverflow'
['stackoverflow']
[['stackoverflow']]
[[['stackoverflow']]]
[[[[[[[[[['stackoverflow']]]]]]]]]]

当然,您会收到警告。这可以在gccWindows计算机(gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3))和真正的Linux计算机(gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5))上的bash上使用。


2
不确定其他编译器,但int*n(s,a)int*s;{return!a?s:n(&s,a-1);}可以与gcc一起使用。
丹尼斯

它针对cc -v->进行段错误处理Apple LLVM version 8.0.0 (clang-800.0.38)
nimi

2
您可以!从三元条件中删除并切换sn(&s,a-1)保存字节的顺序吗?
莱利

2
@VolAnd调用时n(s,6),必须在变量声明中更改*********并使用。正是由于该函数完成了预期的功能,才需要这样做:将字符串嵌套到数组中几次(此处为6次)。当然,您仍然会获得三个级别的信息,[]因为它们是硬编码的。我认为程序根本不应该输出它们。这个挑战不是关于括号,而是关于嵌套。某些语言使用方括号打印数组,C根本没有内置函数来打印它们。所以呢?这里不需要。
Christian Sievers,2016年

1
您可以*在函数签名中的空格后添加空格吗?
基金莫妮卡的诉讼


2

Ruby,25个字符

重写jamylakPython解决方案

f=->s,n{n>0?[f[s,n-1]]:s}

样品运行:

irb(main):001:0> f=->s,n{n>0?[f[s,n-1]]:s}
=> #<Proc:0x00000002006e80@(irb):1 (lambda)>

irb(main):002:0> f["stackoverflow",0]
=> "stackoverflow"

irb(main):003:0> f["stackoverflow",1]
=> ["stackoverflow"]

irb(main):004:0> f["stackoverflow",5]
=> [[[[["stackoverflow"]]]]]

2

C#6,50字节

dynamic a(dynamic s,int n)=>n<2?s:a(new[]{s},n-1);

1
不是n<1吗?如果使用object而不是,则也为-2字节dynamic
牛奶

2

Ruby,24个字节

f=->*s,n{s[n]||f[s,n-1]}

称为与manatwork的答案相同,但实施起来很奇怪。*s将输入(可能是嵌套的字符串)包装在数组中。然后,如果n为零,则s[n]返回的第一个元素s,从而将该函数转换为无操作。否则,它将返回,nil因为s将永远只有一个元素,因此我们进行递归调用。



2

Perl 6、23个字节

{($^a,{[$_]}...*)[$^b]}

展开:

{ # bare block lambda with two placeholder parameters 「$a」 and 「$b」
  (

    # generate Sequence

    $^a,       # declare first input
    { [ $_ ] } # lambda that adds one array layer
    ...        # do that until
    *          # Whatever

  )[ $^b ]     # index into the sequence
}

Perl中从来没有停止给我带来惊喜与它的语法
基金莫妮卡的官司

2

Agda,173个字节

由于函数的返回类型取决于作为参数给出的数字,因此很明显应该使用依赖类型的语言。不幸的是,打高尔夫球并不是要使用自然语言和清单来使用它们的语言。从好的方面来说,他们使用的suc是我期望的冗长位置succ。所以这是我的代码:

module l where
open import Data.List
open import Data.Nat
L : ℕ -> Set -> Set
L 0 a = a
L(suc n)a = List(L n a)
f : ∀ n{a}-> a -> L n a
f 0 x = x
f(suc n)x = [ f n x ]

(我希望我发现所有可以省略空格的地方。)L是一个给定自然值的类型函数,n并且类型a返回的n嵌套列表的时间类型a,所以(如果有的话)L 3 Bool将是嵌套列表的列表类型。Bool进口Bool)。这使我们可以将函数的类型表示为(n : ℕ) -> {a : Set} -> a -> L n a,其中花括号使该参数成为隐式。该代码使用一种较短的方法来编写此类型。现在可以通过在第一个参数上进行模式匹配以明显的方式定义该函数。

将带有.agda扩展名的文件加载到emacs中可以使用C-c C-n(将术语评估为普通格式),例如输入f 2 3并以尴尬的形式获取正确的答案:(3 ∷ []) ∷ []。现在当然,如果您要使用字符串来执行此操作,则必须导入它们...


只是记得我可以写而不是->,但是当然会增加UTF-8编码文件的大小。
Christian Sievers,2016年

我将其丑陋地翻译成Haskell的时间要短一些。我必须坚持手册一元制以使其简短。
dfeuer

2

k,3个字节

,:/

作为二元函数,/它将对第二个参数重复应用左手函数,:enlist)n次。

例:

k),:/[3;"hello"]
,,,"hello"

1

PHP,44字节

function n($s,$n){return$n?n([$s],--$n):$s;}

没有什么复杂的,只是一个递归函数


1

Python 2,32字节

lambda s,n:eval('['*n+`s`+']'*n)

n开括号放在字符串之前,将方括号放在字符串n之前,然后评估结果。如果允许输出字符串,则eval可以将其删除。


1

实际上,4个字节

string然后输入n。欢迎打高尔夫球。在线尝试!

`k`n

开球

          Implicit input string, then n.
`...`n    Run the function n times.
  k         Wrap the stack in a list.
          Implicit return.

1

R,39 40字节

编辑:修复了n=0问题,感谢@rturnbull。

该函数需要两个输入s(字符串)和n(嵌套)并输出嵌套列表。请注意,R类在list本机上的打印输出与大多数其他语言不同,但是在功能上类似于键/值映射(可能带有未命名的键)或python中的列表。

f=function(s,n)if(n)list(f(s,n-1))else s

> f=function(s,n)if(n)list(f(s,n-1))else s
> f("hello",3)
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1] "hello"


> # to access the string nested 5 times in the "list-object" named "list" we can do the following
> list = f("nested string",5)
> list[[1]][[1]][[1]][[1]][[1]]
[1] "nested string"

1
非常好!但是,它没有提供所需的输出n=0。在我看到您的答案之前,我想出了一个可以解决的递归解决方案n=0,但它比您的解决方案(40个字节)长1个字节:f=function(s,n)if(n)list(f(s,n-1))else s
rturnbull

@rturnbull你当然是对的。我认为您的解决方案更为优雅,而我完全忘记了n=0此案。但是,您的解决方案实际上是38不包含函数命名的字节,因此更短。大有赶超
Billywob

1
由于它是递归函数,因此必须将其命名!(否则,它无法解释其中的f(s,n-1)调用。)据我所知,R中没有递归匿名函数。
rturnbull

@rturnbull你又是对的。更新答案。
Billywob

一年后,我又打了一个字节:f=function(s,n)'if'(n,list(f(s,n-1)),s)
rturnbull

1

拍子83字节

(for((c n))(set! s(apply string-append(if(= c 0)(list"[\'"s"\']")(list"["s"]")))))s

取消高尔夫:

(define (f s n)
  (for ((c n))
    (set! s (apply string-append
                   (if (= c 0)
                       (list "[\'" s "\']")
                       (list "[" s "]"))
                   )))
  s)

测试:

(f "test" 3)

输出:

"[[['test']]]"

1

Haskell,40 38字节

data L=N[Char]|C L 
f 0=N
f n=C. f(n-1)

Haskell的严格类型系统可防止返回不同的类型(字符串vs.字符串列表vs.字符串列表,...),因此我必须定义自己的类型以适应所有情况。main函数f递归调用嵌套和基本情况n的构造C方法N

用法示例(已deriving (Show)添加到新data类型中以便能够打印):f 4 "codegolf"-> C (C (C (C (N "codegolf"))))

编辑:@Christian Sievers通过以无点样式为字符串参数重写函数来节省2个字节。谢谢!


当然,Haskell的列表可以嵌套,但是函数不能为一个值返回字符串,而对于相同类型的另一个值不能返回字符串列表。打高尔夫球的附加deriving条款:不需要括号。-不确定只嵌套C不是列表形式的构造函数是否可以。我非常相似的尝试是基于定义为的数据类型data D x=J x|L[D x]
Christian Sievers,2016年

如果您颠倒了参数的顺序并且不使用中缀运算符,则无需提及第二个参数:f 0=N;f n=C. f(n-1)
Christian Sievers,2016年

@ChristianSievers:是的,您是对的,我对嵌套列表的解释不准确-我已对其进行了更改。关于列表式:我认为我的数据结构是列表式的。将本地Haskell列表1:(2:(3:([])))与C(C(C(C(N“ codegolf”)))进行比较。C是cons(:),N是nil([])。
nimi

C没有缺点,只有嵌入,您的数据类型无法表达[["a","b"],["c"]]。但这可能很好,因为此问题仅需要单例。- f n=...不是没有意义的。点减少?
Christian Sievers

您花费19个字符定义数据类型。使用现有类型(例如Either)是否更明智,即使这意味着构造函数会更加冗长?
Periata Breatta '16

1

tinylisp(repl),34个字节

(d F(q((S N)(i N(F(c S())(s N 1))S

定义一个函数F。从技术上讲,tinylisp没有字符串,但是此代码可用于给定的任何数据类型。

Ungolfed(内置关键字:d=定义,q=引用,i=如果,c=缺点,s=减去):

(d nest
 (q
  ((item number)
   (i number
    (nest (c item ()) (s number 1))
    item))))

用法示例:

tl> (d F(q((S N)(i N(F(c S())(s N 1))S
F
tl> (F 2 3)
(((2)))
tl> (F () 1)
(())
tl> (F (q Hello!) 7)
(((((((Hello!)))))))
tl> (F c 3)
(((<builtin function tl_cons>)))

1

Clojure,24个字节

#(nth(iterate list %)%2)

Clojure在这里有些竞争力。iterate创建一个序列x, (f x), (f (f x)) ...nth返回所需的元素。

在线查看:https//ideone.com/2rQ166

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.