Zagnieżdż ciąg w tablicy n razy

16

Należy utworzyć funkcję, która zagnieżdża ciąg znaków sw tablicy nrazy

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

Parametry:

  1. s - Ciąg ascii
  2. n - Liczba całkowita >= 0

Zasady

  • Najkrótszy kod wygrywa.
  • Wyjście być zagnieżdżona array, listi tuple(lub podobnego typu opiera się na tablicy)

Przypadki testowe

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

Inspirowane przez: Zagnieżdżenie ciągu na liście n razy, tj. Lista listy listy

jamylak
źródło
6
Czy wyjściem musi być lista, czy może to ciąg znaków reprezentujący tę listę?
clismique
2
Czy możemy przyjmować parametry w dowolnej kolejności?
Socratic Phoenix,
@SocraticPhoenix Myślę, że chyba, że ​​jest to wyraźnie zabronione, tak - możesz wziąć dane wejściowe w dowolnym rozsądnym formacie (uważam, że obejmowałbym również ich listę jako listę). Może ktoś bardziej doświadczony może wskazać odpowiedni meta post.
Jonathan Allan
Czy łańcuch będzie kiedykolwiek zawierał znak ucieczki "? Np.N("stack\"overflow",5)
Riley
@ Riley Może zawierać dowolny znak ascii
jamylak

Odpowiedzi:

11

Galaretka , 2 bajty

Nieco mylące, ponieważ: (1) Galaretka nie ma łańcuchów, tylko listy znaków; i (2); wyjście nie pokaże zagnieżdżenia. Aby zobaczyć, że faktycznie robi to, o co pytamy, spójrz na reprezentację wyniku w Pythonie za pomocą:

W¡ŒṘ

Dodatkowa para []będzie obecna, ponieważ sam ciąg będzie listą znaków. Na przykład

W jaki sposób?

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

Kod weryfikacji koncepcji dodaje:

W¡ŒṘ - Main link: s, n
  ŒṘ - Python string representation
Jonathan Allan
źródło
Lepsza reprezentacja wyników
Cairair coinheringaahing
„Lepsze”, ponieważ wygląda na to, że używane są ciągi ... nie pokazuje jednak, że faktycznie używana jest lista znaków.
Jonathan Allan
15

Java i C #, 62 bajty

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

Powinien działać bez modyfikacji zarówno w Javie, jak i C #.

Robert Fraser
źródło
Mądry! +1 Próbowałem zmusić go do działania w Javie poprzez zagnieżdżenie tablicy String, co tak naprawdę nie zadziałało. Użycie obiektu jako typu zwracanego i zagnieżdżenie go w obiekcie [] jest tylko rozwiązaniem wymaganym dla tego wyzwania, ponieważ obiekt [] (lub dowolna tablica) jest również sam obiekt. Niezłe.
Kevin Cruijssen
12

05AB1E , 3 bajty

Kod

`F)

Wyjaśnienie

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

Oznacza to, że działa to również w przypadku 0 , ponieważ ciąg znaków znajduje się już na stosie.

Wypróbuj online!

Adnan
źródło
8

JavaScript (ES6), 20 bajtów

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

Chociaż ludzie zwykle nudzą mnie, żebym sprawdził moje funkcje w celu zaoszczędzenia 1 bajtu, jest to przypadek, w którym faktycznie przyczynia się do rozwiązania.

Neil
źródło
Świetne wykorzystanie curry. Myślę, że możesz to uczynić nieco bardziej czytelnym:d=>g=n=>n?[g(n-1)]:d
ETHprodukcje
7

Mathematica, 13 bajtów

List~Nest~##&
Martin Ender
źródło
5

CJam , 7 6 bajtów

{{a}*}

Tłumacz online

Jest to nienazwana funkcja, która bierze swoje argumenty ze stosu jako S N, Sbędąc ciągiem iN zawijaniem. Możesz to wykonać za pomocą~ operatora, co znaczy eval.

Wyjaśnienie:

{{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 the Outgolfer
źródło
Wystarczy użyć nienazwanego bloku, aby uniknąć niewygodnego formatu wejściowego {{a}*}lub {'a*~}.
Martin Ender
@MartinEnder Obawiam się, że zajęłoby to bajty i myślę, że format wejściowy jest w 100% akceptowalny. To tylko lista i myślę, że nie ma ograniczeń co do sposobu wprowadzania tych dwóch parametrów. Poza tym nigdy nie nazwałem bloku.
Erik the Outgolfer
Nie wiem, co masz na myśli przez bajty? Oba rozwiązania mają tylko 6 bajtów.
Martin Ender
@MartinEnder Och, czy były to całe rozwiązania? Myślałem, że mówisz o rozszerzeniu mojego programu, ale właśnie przekształciłeś go w funkcję? To zmienia cały punkt. Jestem nowicjuszem w CJam / GolfScript / Pyth. Wolę pierwszy, ponieważ jest bardziej zrozumiały (powtórz {a}n razy) zamiast drugiego (stwórz ciąg ns ai wykonaj go).
Erik the Outgolfer
4

JavaScript ES6, 23 bajty

Funkcja rekurencyjna

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

Efekt curry ma taką samą długość

f=a=>i=>i?f([a])(--i):a
Bassdrop Cumberwubwubwub
źródło
4

Brachylog , 10 bajtów

tT,?h:T:gi

Wypróbuj online!

Wyjaśnienie

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

Byłyby to 3 bajty, gdyby nie było błędu. Tutaj potrzebujemy tego wszystkiego, aby uzyskać listę, [String, T, built-in_group]mimo że [String, T]jest to już nasz wkład.

Niestety :gwyniki bezpośrednio [[String, T], built-in_group], co nie jest poprawnie rozpoznawane przez, iponieważ liczba całkowita Tznajduje się na pierwszej liście.

Fatalizować
źródło
4

MATL, 6 bajtów

ji:"Xh

To tworzy zagnieżdżoną tablicę komórek jako wynik. Jednak domyślny wyświetlacz MATL-a nie pozwala zobaczyć , co to jest, ponieważ nie wyświetla wszystkich nawiasów klamrowych. Poniższa wersja demonstracyjna jest nieco zmodyfikowaną wersją, która pokazuje ciąg reprezentujący dane wyjściowe.

ji:"Xh]&D

Wypróbuj online

Wyjaśnienie

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
źródło
3

Pyth , 3 bajty

]Fw

Permalink

Spowoduje to wyświetlenie czegoś podobnego ...[[[[['string']]]]].... To nie będzie zacytować na głębokości zera: string.

Wyjaśnienie:

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

Jeśli chcesz cytować na głębokości zerowej, użyj zamiast tego 4-bajtowego rozwiązania (objaśnienie):

`]Fw
    Q Implicit: Eval first input line
 ]    Function: Wrap in array
   w  Input line
  F   Apply multiple times
`     Representation
Erik the Outgolfer
źródło
3

PHP, 60 bajtów

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

48 bajtów, jeśli wygląda tylko na zadanie

for($r=$argv[1];$i++<$argv[2];)$r="[$r]";echo$r;
Jörg Hülsermann
źródło
Myślę bezpośrednim przepisać właściciela wątpliwość własnej Python odpowiedź nadal jest najkrótsza w PHP za: function f($s,$n){return$n?[f($s,$n-1)]:$s;}.
manatwork
print_r()a jeśli nie podoba ci się ta opcja, serialize()oba są krótsze niż json_encode()ing, jednocześnie różnicując wynik.
user59178,
BTW, ten samotny ')na końcu kodu wygląda dziwnie.
manatwork
@manatwork Błąd kopiowania i wklejania Dziękujemy
Jörg Hülsermann
3

Rubin: 23 bajty

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

Zostało to zaktualizowane, aby uczynić z niego proces, który można wywołać, a nie oryginalny fragment kodu. Byłbym zainteresowany, aby wiedzieć, czy istnieje sposób na sdomniemane zwrócenie, zamiast jawnego zwrotu.

Peter Nixey
źródło
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
źródło
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
źródło
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
źródło
2

C# 6, 50 bytes

dynamic a(dynamic s,int n)=>n<2?s:a(new[]{s},n-1);
downrep_nation
źródło
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
źródło
2

V, 6 bytes

Àñys$]

Try it online!

Explanation:

À      "Arg1 times
 ñ     "repeat:
  ys$  "surround this line
     ] "with square brackets
DJMcMayhem
źródło
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
źródło
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
źródło
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
źródło
1

PHP, 44 bytes

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

nothing sophisticated, just a recursive function

Titus
źródło
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
źródło
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
źródło
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
źródło
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
źródło
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
źródło
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
źródło
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
źródło