Imbriquer une chaîne dans un tableau n fois

16

Vous devez produire une fonction qui imbrique une chaîne sdans un tableau, nfois

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

Paramètres:

  1. s - Une chaîne ascii
  2. n - Un nombre entier >= 0

Règles

  • Le code le plus court gagne.
  • La sortie sera un imbriqué array, listou tuple(ou un type similaire basé sur un tableau)

Cas de test

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

Inspiré par: imbriquer une chaîne dans une liste n fois, c'est-à-dire la liste d'une liste d'une liste

jamylak
la source
6
La sortie doit-elle être une liste ou peut-elle être une chaîne représentant cette liste?
clismique
2
Pouvons-nous prendre les paramètres dans n'importe quel ordre?
Socratic Phoenix
@SocraticPhoenix Je pense que sauf interdiction explicite, oui - vous pouvez prendre l'entrée dans n'importe quel format raisonnable (ce qui inclurait prendre les deux comme liste aussi je crois). Peut-être que quelqu'un de plus expérimenté peut pointer vers un meta post pertinent.
Jonathan Allan
La chaîne inclura-t-elle un échappé "? Par exempleN("stack\"overflow",5)
Riley
@Riley Il pourrait contenir n'importe quel caractère ascii
jamylak

Réponses:

11

Gelée , 2 octets

Légèrement déroutant, car: (1) Jelly n'a pas de chaînes, seulement des listes de personnages; et (2); la sortie ne montrera pas l'imbrication. Pour voir que cela fait réellement ce qui est demandé, regardez une représentation en chaîne Python du résultat avec:

W¡ŒṘ

Une paire supplémentaire de []sera présente car la chaîne elle-même sera une liste de caractères.Par exemple

Comment?

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

Le code de preuve de concept ajoute:

W¡ŒṘ - Main link: s, n
  ŒṘ - Python string representation
Jonathan Allan
la source
Meilleure représentation de sortie
caird coinheringaahing
"Mieux" dans la mesure où il semble que des chaînes soient utilisées ... cela ne montre pas qu'une liste de caractères est effectivement utilisée.
Jonathan Allan
15

Java et C #, 62 octets

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

Devrait fonctionner sans modification à la fois en Java et en C #.

Robert Fraser
la source
Intelligent! +1 J'essayais de le faire fonctionner en Java en imbriquant un tableau de chaînes, ce qui n'a pas vraiment fonctionné. Utiliser un objet comme type de retour et l'imbriquer dans un objet [] est juste la solution requise pour ce défi, car l'objet [] (ou n'importe quel tableau) est également un objet lui-même. Joli.
Kevin Cruijssen
12

05AB1E , 3 octets

Code

`F)

Explication

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

Cela signifie que cela fonctionne également pour le test 0 , car la chaîne est déjà sur la pile.

Essayez-le en ligne!

Adnan
la source
8

JavaScript (ES6), 20 octets

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

Bien que les gens me harcèlent normalement pour utiliser mes fonctions pour la sauvegarde d'un octet, c'est un cas où cela contribue réellement à la solution.

Neil
la source
Grande utilisation du curry. Je pense que vous pouvez le rendre un peu plus lisible:d=>g=n=>n?[g(n-1)]:d
ETHproductions
7

Mathematica, 13 octets

List~Nest~##&
Martin Ender
la source
5

CJam , 7 6 octets

{{a}*}

Interprète en ligne

Ceci est une fonction anonyme qui prend ses arguments à partir de la pile comme S N, Sétant la chaîne et Nétant les enveloppes. Vous pouvez l'exécuter avec l' ~opérateur, ce qui signifie eval.

Explication:

{{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]
Erik le Outgolfer
la source
Utilisez simplement un bloc sans nom pour éviter le format d'entrée maladroit {{a}*}ou {'a*~}.
Martin Ender
@MartinEnder J'ai bien peur que cela prenne des octets, et je pense que le format d'entrée est 100% acceptable. C'est juste une liste, et je pense qu'il n'y a aucune restriction quant à la façon dont ces deux paramètres sont entrés. De plus, je n'ai jamais nommé le bloc.
Erik the Outgolfer
Je ne sais pas ce que tu veux dire sur les octets? Ces deux solutions ne font que 6 octets.
Martin Ender
@MartinEnder Oh, étaient-ce toutes ces solutions? Je pensais que vous parliez d'étendre mon programme, mais vous venez de le convertir en fonction? Eh bien, cela change tout. Je suis un débutant à CJam / GolfScript / Pyth. Je préfère le premier car il est plus compréhensible (répéter {a}n fois) au lieu du second (produire une chaîne de n as et l'exécuter).
Erik the Outgolfer
4

Javascript ES6, 23 octets

Fonction récursive

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))

Les résultats de curry dans la même longueur

f=a=>i=>i?f([a])(--i):a
Bassdrop Cumberwubwubwub
la source
4

Brachylog , 10 octets

tT,?h:T:gi

Essayez-le en ligne!

Explication

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

Ce serait 3 octets s'il n'était pas buggé. Ici, nous avons besoin de tout cela pour obtenir la liste[String, T, built-in_group] même si [String, T]c'est déjà notre entrée.

Malheureusement, il :gen résulte directement [[String, T], built-in_group], qui n'est pas reconnu correctement par icar l'entier Test dans la première liste.

Fatalize
la source
4

MATL, 6 octets

ji:"Xh

Cela produit un tableau de cellules imbriqué en sortie. Avec l'affichage par défaut de MATL, cependant, vous ne pouvez pas nécessairement voir ce que c'est car il n'affichera pas tous les accolades. La démo ci-dessous est une version légèrement modifiée qui montre la représentation sous forme de chaîne de la sortie.

ji:"Xh]&D

Essayez-le en ligne

Explication

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
Suever
la source
3

Pyth, 3 bytes

]Fw

Permalink

This will output something like ...[[[[['string']]]]].... It will not quote for zero depth: string.

Explanation:

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

If you want quoting on zero depth, use this 4-byte solution instead (explanation):

`]Fw
    Q Implicit: Eval first input line
 ]    Function: Wrap in array
   w  Input line
  F   Apply multiple times
`     Representation
Erik the Outgolfer
la source
3

PHP, 60 Bytes

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

48 Bytes if it looks only like the task

for($r=$argv[1];$i++<$argv[2];)$r="[$r]";echo$r;
Jörg Hülsermann
la source
I think a direct rewrite of the question owner's own Python answer is still the shortest in PHP too: function f($s,$n){return$n?[f($s,$n-1)]:$s;}.
manatwork
print_r() and, if you don't like that option, serialize() are both shorter than json_encode()ing it while differentiating the output.
user59178
BTW, that lonely ') at the end of code looks strange.
manatwork
@manatwork Copy and Paste error Thank You
Jörg Hülsermann
3

Ruby: 23 bytes

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

This is updated to make it a callable Proc rather than the original snippet. I'd be interested to know whether there's a way to have s implicitly returned rather than having to explicitly return it.

Peter Nixey
la source
2
Generally your "a few more words" should be an explanation of how your code works. But it's a good answer nonetheless.
wizzwizz4
“You must produce a function” This is a code snippet. Unless explicitly specified otherwise, input and output has to be handled explicitly by the code or implicitly by the interpreter if it has such feature. You can not expect some global variables to be set and you can not just leave the result in some global variables.
manatwork
Welcome to PPCG! All answers should be callable functions or full programs, though. In your case, the shortest fix would be to use an unnamed function like ->s,n{...}.
Martin Ender
@wizzwizz4, and Martin, thank you for your encouragement and helpful input, I have learned something and will update. manatwork, I've got thick skin and have plenty of points on SO but you know that blunt statements like that scare newbies away from Stack sites and intimidate them. Seems a shame no?
Peter Nixey
3

C, 44 bytes, 41 bytes

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

You can test it by doing the following:

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

The output:

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

Of course, you'll get warnings. This works on gcc on bash on my Windows machine (gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3), as well as on a true Linux machine (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)).

homersimpson
la source
2
Not sure about other compilers, but int*n(s,a)int*s;{return!a?s:n(&s,a-1);} works with gcc.
Dennis
It segfaults for cc -v -> Apple LLVM version 8.0.0 (clang-800.0.38).
nimi
2
Can you drop the ! from the ternary condition and switch the order of s and n(&s,a-1) to save a byte?
Riley
2
@VolAnd When you call n(s,6), you have to change *** to ****** in the variable declaration and use. This is needed exactly because the function does what it is expected to do: nest the string into an array several (here: 6) times. Of course you would still get three levels of [] because they are hardcoded. I think the program shouldn't output them at all. This challenge is not about brackets, it is about nesting. Some languages print arrays with brackets, C hasn't any builtin function to print them at all. So what? It is not needed here.
Christian Sievers
1
Can you drop the spaces after the * in the function signature?
Fund Monica's Lawsuit
2

Python, 32 bytes

N=lambda s,n:n and[N(s,n-1)]or s
jamylak
la source
2

Ruby, 25 characters

Rewrite of jamylak's Python solution.

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

Sample run:

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"]]]]]
manatwork
la source
2

C# 6, 50 bytes

dynamic a(dynamic s,int n)=>n<2?s:a(new[]{s},n-1);
downrep_nation
la source
1
Shouldn't it be n<1? Also -2 bytes if you use object instead of dynamic.
milk
2

Ruby, 24 bytes

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

Called the same as in manatwork's answer, but a weirder implementation. *s wraps the input (a possibly-nested string) in an array. Then if n is zero, s[n] returns the first element of s, turning the function into a no-op. Otherwise, it returns nil since s will only ever have one element, so we pass through to the recursive call.

histocrat
la source
2

V, 6 bytes

Àñys$]

Try it online!

Explanation:

À      "Arg1 times
 ñ     "repeat:
  ys$  "surround this line
     ] "with square brackets
DJMcMayhem
la source
2

Perl 6, 23 bytes

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

Expanded:

{ # 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
}
Brad Gilbert b2gills
la source
Perl never ceases to amaze me with its syntax
Fund Monica's Lawsuit
2

Agda, 173 bytes

Since the return type of the function depends on the number given as argument, this is clearly a case where a dependently typed language should be used. Unfortunately, golfing isn't easy in a language where you have to import naturals and lists to use them. On the plus side, they use suc where I would have expected the verbose succ. So here is my code:

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 ]

(I hope I found all places where spaces can be omitted.) L is a type function that given a natural n and a type a returns the type of n times nested lists of a, so L 3 Bool would be the type of lists of lists of lists of Bool (if we had imported Bool). This allows us to express the type of our function as (n : ℕ) -> {a : Set} -> a -> L n a, where the curly braces make that argument implicit. The code uses a shorter way to write this type. The function can now be defined in an obvious way by pattern matching on the first argument.

Loading this file with an .agda extension into emacs allows to use C-c C-n (evaluate term to normal form), input for example f 2 3 and get the correct answer in an awkward form: (3 ∷ []) ∷ []. Now of course if you want to do that with strings you have to import them...

Christian Sievers
la source
Just remembered that I could write instead of ->, but of course that increases the size of an UTF-8 encoded file.
Christian Sievers
My ugly translation of this into Haskell is somewhat shorter. I have to stick to manual unary to keep it short.
dfeuer
2

k, 3 bytes

,:/

Taken as a dyadic function, / will iteratively apply the left-hand function ,: (enlist) n times to the second argument.

Example:

k),:/[3;"hello"]
,,,"hello"
skeevey
la source
1

PHP, 44 bytes

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

nothing sophisticated, just a recursive function

Titus
la source
1

Python 2, 32 bytes

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

Puts n open brackets before the string and n close brackets before it, then evals the result. If a string output is allowed, the eval can be removed.

xnor
la source
1

Actually, 4 bytes

Input is string then n. Golfing suggestions welcome. Try it online!

`k`n

Ungolfing

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

R, 39 40 bytes

EDIT: Fixed the n=0 issue thanks to @rturnbull.

Function that takes two inputs s (string) and n (nestedness) and outputs the nested list. Note that R-class list natively prints output differently than most other languages, however, is functionally similar to a key/value map (with possibly unnamed keys) or a list in python.

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

Example

> 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"
Billywob
la source
1
Very nice! It doesn't give the desired output for n=0, though. Before I saw your answer, I came up with a recursive solution which can deal with n=0, but it's 1 byte longer than your solution (40 bytes): f=function(s,n)if(n)list(f(s,n-1))else s
rturnbull
@rturnbull You're of course right. Your solution is much more elegant in my opinion and I totally forgot about the n=0 case. However, your solution is actually 38 bytes excluding the naming of the function and hence shorter. Great catch
Billywob
1
Since it's a recursive function it must be named, unfortunately! (Otherwise it can't interpret the f(s,n-1) call inside of it.) Recursive anonymous functions are not possible in R, as far as I know.
rturnbull
@rturnbull You're again right. Updating the answer.
Billywob
A year later, I've golfed off another byte: f=function(s,n)'if'(n,list(f(s,n-1)),s).
rturnbull
1

Racket 83 bytes

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

Ungolfed:

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

Testing:

(f "test" 3)

Output:

"[[['test']]]"
rnso
la source
1

Haskell, 40 38 bytes

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

Haskell's strict type system prevents returning different types (Strings vs. List of Strings vs. List of List of Strings,...), so I have to define my own type that accommodates all those cases. The main function f recursively calls n times the constructor C for nesting and N for the base case.

Usage example (with deriving (Show) added to the new data type to be able to print it): f 4 "codegolf" -> C (C (C (C (N "codegolf")))).

Edit: @Christian Sievers saved 2 bytes by rewriting the function in a point-free style for the string argument. Thanks!

nimi
la source
Of course Haskell's lists can be nested, but a function cannot return a string for one value and a list of lists of strings for another value of the same type. Golfing the additional deriving clause: the parens aren't needed. - Not sure if it's okay to only nest the C constructor which isn't list-like. My very similar attempt was based on a data type defined as data D x=J x|L[D x].
Christian Sievers
If you reverse the order of the arguments and don't use an infix operator, you don't need to mention the second argument: f 0=N;f n=C. f(n-1)
Christian Sievers
@ChristianSievers: yes, you're right, my explanation about nested lists was not accurate - I've changed it. Regarding list-likeness: I think my data structure is list-like. Compare a native Haskell list 1:(2:(3:([]))) with C (C (C (N "codegolf"))). C is cons (:), N is nil ([]).
nimi
C doesn't cons, it only embeds, your data type can't express [["a","b"],["c"]]. But maybe that is fine as this problem only needs singletons. - f n=... isn't point-free. Point-reduced?
Christian Sievers
You spend 19 characters defining your data type. Wouldn't it be more sensible to use an existing type (e.g. Either) even if it meant the constructors were a little more verbose?
Periata Breatta
1

tinylisp (repl), 34 bytes

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

Defines a function F. Technically, tinylisp doesn't have strings, but this code will work for any data type it's given.

Ungolfed (key to builtins: d = define, q = quote, i = if, c = cons, s = subtract):

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

Example usage:

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>)))
DLosc
la source
1

Clojure, 24 bytes

#(nth(iterate list %)%2)

Clojure is somewhat competitive here. iterate creates a sequence of x, (f x), (f (f x)) ..., nth returns needed element.

See it online: https://ideone.com/2rQ166

cliffroot
la source