Nidifica una stringa all'interno di un array n volte


16

È necessario produrre una funzione che nidifica una stringa sall'interno di un array, nvolte

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

parametri:

  1. s - Una stringa ASCII
  2. n - Un numero intero >= 0

Regole

  • Il codice più corto vince.
  • L'uscita sarà nested array, listo tuple(tipo o simile basato via un array)

Casi test

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

Ispirato a: Annidamento di una stringa all'interno di un elenco n volte cioè elenco di un elenco di un elenco


6
L'output deve essere un elenco o può essere una stringa che rappresenta tale elenco?
clismique,

2
Possiamo prendere i parametri in qualsiasi ordine?
Socratic Phoenix,

@SocraticPhoenix Penso che a meno che non sia esplicitamente vietato, sì - puoi prendere l'input in qualsiasi formato ragionevole (che includerebbe prendere anche i due come lista credo). Forse qualcuno più esperto può puntare a un meta post rilevante.
Jonathan Allan,

La stringa includerà mai un escape "? Ad esempioN("stack\"overflow",5)
Riley,

@Riley Potrebbe contenere qualsiasi personaggio ASCII
jamylak,

Risposte:


11

Gelatina , 2 byte

Leggermente confuso, poiché: (1) Jelly non ha stringhe, solo elenchi di caratteri; e (2); l'output non mostrerà l'annidamento. Per vedere che questo sta effettivamente facendo ciò che viene richiesto, guarda una rappresentazione in stringa Python del risultato con:

W¡ŒṘ

Sarà presente una coppia []in più poiché la stringa stessa sarà un elenco di caratteri. Per esempio

Come?

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

Il codice di prova di concetto aggiunge:

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


"Meglio" in quanto sembra che le stringhe vengano utilizzate ... non mostra però che un elenco di caratteri venga effettivamente utilizzato.
Jonathan Allan,

15

Java e C #, 62 byte

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

Dovrebbe funzionare senza modifiche sia in Java che in C #.


Inteligente! +1 Stavo cercando di farlo funzionare in Java annidando un array di stringhe, che non ha funzionato davvero. L'uso di un oggetto come tipo restituito e nidificarlo in un oggetto [] è solo la soluzione richiesta per questa sfida, poiché anche l'oggetto [] (o qualsiasi array) è un oggetto stesso. Ben fatto.
Kevin Cruijssen,

12

05AB1E , 3 byte

Codice

`F)

Spiegazione

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

Ciò significa che funziona anche per 0 -testcase, poiché la stringa è già nello stack.

Provalo online!


8

JavaScript (ES6), 20 byte

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

Sebbene le persone normalmente mi chiedano di eseguire il curriculum delle mie funzioni per il salvataggio di 1 byte, questo è un caso in cui ciò contribuisce effettivamente alla soluzione.


Ottimo uso del curry. Penso che tu possa renderlo leggermente più leggibile:d=>g=n=>n?[g(n-1)]:d
ETHproductions


5

CJam , 7 6 byte

{{a}*}

Interprete online

Questa è una funzione senza nome che prende i suoi argomenti dallo stack come S N, Sessendo la stringa eN essendo gli involucri. Puoi eseguirlo con l' ~operatore, il che significa eval.

Spiegazione:

{{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]

Basta usare un blocco senza nome per evitare il formato di input imbarazzante {{a}*}o {'a*~}.
Martin Ender,

@MartinEnder Temo che ci vorranno byte, tuttavia, e penso che il formato di input sia accettabile al 100%. È solo un elenco e penso che non ci siano restrizioni sul modo in cui questi due parametri vengono inseriti. Inoltre, non ho mai chiamato il blocco.
Erik the Outgolfer,

Non so cosa intendi per byte? Entrambe queste soluzioni sono solo 6 byte.
Martin Ender,

@MartinEnder Oh, erano queste intere soluzioni? Pensavo stessi parlando dell'estensione del mio programma, ma l'hai appena convertito in una funzione? Bene, questo cambia il punto. Sono un principiante in CJam / GolfScript / Pyth. Preferisco il primo perché è più comprensibile (ripeti {a}n volte) invece del secondo (produce una stringa di n se ala esegue).
Erik the Outgolfer,

4

Javascript ES6, 23 byte

Funzione ricorsiva

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

Risultati di curry nella stessa lunghezza

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

4

Brachylog , 10 byte

tT,?h:T:gi

Provalo online!

Spiegazione

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

Questo sarebbe di 3 byte se non fosse stato corretto. Qui abbiamo bisogno di tutto questo per ottenere l'elenco [String, T, built-in_group]anche se [String, T]è già il nostro input.

Sfortunatamente :grisulta direttamente [[String, T], built-in_group], che non è riconosciuto correttamente iperché il numero intero Tè all'interno del primo elenco.


4

MATL, 6 byte

ji:"Xh

Questo produce un array di celle nidificate come output. Con la visualizzazione predefinita di MATL, tuttavia, non è necessario vedere che cos'è, poiché non mostrerà tutte le parentesi graffe. La demo di seguito è una versione leggermente modificata che mostra la rappresentazione in formato stringa dell'output.

ji:"Xh]&D

Provalo online

Spiegazione

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 byte

]Fw

Permalink

Questo produrrà qualcosa di simile ...[[[[['string']]]]].... Non citeremo per zero profondità: string.

Spiegazione:

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

Se vuoi quotare a profondità zero, usa invece questa soluzione a 4 byte (spiegazione):

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

3

PHP, 60 byte

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

48 byte se sembra solo l'attività

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

Credo che una riscrittura diretta della propria risposta Python del proprietario questione è ancora più breve in PHP troppo: function f($s,$n){return$n?[f($s,$n-1)]:$s;}.
arte

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.


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


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

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"]]]]]

2

C# 6, 50 bytes

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

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.



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
}

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


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"

1

PHP, 44 bytes

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

nothing sophisticated, just a recursive function


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.


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.

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"

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']]]"

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!


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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.