Aninhar uma string dentro de uma matriz n vezes

16

Você deve produzir uma função que aninhe uma string sdentro de uma matriz, nvezes

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

Parâmetros:

  1. s - Uma string ascii
  2. n - um inteiro >= 0

Regras

  • O menor código vence.
  • A saída será um aninhada array, listou tuple(tipo ou semelhante baseado fora uma matriz)

Casos de teste

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

Inspirado por: Aninhando uma string dentro de uma lista n vezes, ou seja, lista de uma lista de uma lista

jamylak
fonte
6
A saída precisa ser uma lista ou pode ser uma string que representa essa lista?
Clismique 17/10/16
2
Podemos pegar os parâmetros em qualquer ordem?
socrático Phoenix
@SocraticPhoenix Acho que, a menos que seja expressamente proibido, sim - você pode aceitar a entrada em qualquer formato razoável (o que incluiria considerar as duas como uma lista também). Talvez alguém mais experiente possa apontar para uma meta post relevante.
Jonathan Allan
A string incluirá um escape "? Por exemploN("stack\"overflow",5)
Riley
@Riley Ele poderia conter qualquer caractere ascii
jamylak

Respostas:

11

Geléia , 2 bytes

Um pouco confuso, já que: (1) Jelly não tem cordas, apenas listas de caracteres; e (2); a saída não mostrará o aninhamento. Para ver que isso realmente está fazendo o que é solicitado, observe uma representação de sequência Python do resultado com:

W¡ŒṘ

Um par extra de []estará presente, pois a própria string será uma lista de caracteres. Por exemplo

Quão?

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

O código de prova de conceito acrescenta:

W¡ŒṘ - Main link: s, n
  ŒṘ - Python string representation
Jonathan Allan
fonte
Melhor representação de saída
caird coinheringaahing
"Melhor", pois parece que as strings estão sendo usadas ... mas não mostra que uma lista de caracteres esteja realmente sendo usada.
Jonathan Allan
15

Java e C #, 62 bytes

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

Deve funcionar sem modificação em Java e C #.

Robert Fraser
fonte
Inteligente! +1 Eu estava tentando fazê-lo funcionar em Java, aninhando um array de String, o que realmente não funcionou. Usar um Objeto como tipo de retorno e aninhá-lo em um Objeto [] é apenas a solução necessária para esse desafio, já que Objeto [] (ou qualquer matriz) também é um Objeto. Agradável.
Kevin Cruijssen 17/10
12

05AB1E , 3 bytes

Código

`F)

Explicação

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

Isso significa que isso também funciona para o 0- case, já que a string já está na pilha.

Experimente online!

Adnan
fonte
8

JavaScript (ES6), 20 bytes

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

Embora as pessoas normalmente me importunem em organizar minhas funções para economizar 1 byte, este é um caso em que realmente contribui para a solução.

Neil
fonte
Grande uso de currying. Eu acho que você pode torná-lo um pouco mais legível:d=>g=n=>n?[g(n-1)]:d
ETHproductions
7

Mathematica, 13 bytes

List~Nest~##&
Martin Ender
fonte
5

CJam , 7 6 bytes

{{a}*}

Intérprete online

Esta é uma função sem nome que leva os seus argumentos a partir da pilha como S N, Ssendo a corda e Nsendo os envoltórios. Você pode executá-lo com o ~operador, ou seja, avaliar.

Explicação:

{{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, o Outgolfer
fonte
Basta usar um bloco sem nome para evitar o formato de entrada estranho {{a}*}ou {'a*~}.
Martin Ender
@MartinEnder Receio que sejam necessários bytes, e acho que o formato de entrada é 100% aceitável. É apenas uma lista, e acho que não há restrições sobre como esses dois parâmetros são inseridos. Além disso, nunca nomeei o bloco.
Erik the Outgolfer
Não sei o que você quer dizer com bytes? Ambas as soluções são apenas 6 bytes.
Martin Ender
@MartinEnder Oh, essas soluções foram inteiras? Eu pensei que você estava falando em estender meu programa, mas você acabou de convertê-lo para uma função? Bem, isso muda tudo. Sou novato no CJam / GolfScript / Pyth. Prefiro o primeiro porque é mais compreensível (repita {a}n vezes) em vez do segundo (produz uma sequência de n se aexecuta-a).
Erik the Outgolfer
4

Javascript ES6, 23 bytes

Função recursiva

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

Currying resulta no mesmo comprimento

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

Braquilog , 10 bytes

tT,?h:T:gi

Experimente online!

Explicação

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

Isso seria de 3 bytes se não fosse corrigido. Aqui precisamos de tudo isso para obter a lista, [String, T, built-in_group]mesmo que [String, T]já seja nossa contribuição.

Infelizmente, :gresulta diretamente [[String, T], built-in_group], o que não é reconhecido corretamente iporque o número inteiro Testá dentro da primeira lista.

Fatalizar
fonte
4

MATL, 6 bytes

ji:"Xh

Isso produz uma matriz de células aninhadas como saída. Com a exibição padrão do MATL, no entanto, você não pode ver que é isso que é, pois não mostrará todas as chaves. A demonstração abaixo é uma versão ligeiramente modificada que mostra a representação em cadeia da saída.

ji:"Xh]&D

Experimente Online

Explicação

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
fonte
3

Pitão , 3 bytes

]Fw

Permalink

Isso produzirá algo como ...[[[[['string']]]]].... Não vou citar para a profundidade zero: string.

Explicação:

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

Se você deseja citar com profundidade zero, use esta solução de 4 bytes (explicação):

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

PHP, 60 bytes

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

48 bytes se parecer apenas com a tarefa

for($r=$argv[1];$i++<$argv[2];)$r="[$r]";echo$r;
Jörg Hülsermann
fonte
Eu acho que uma reescrita direta da própria resposta Python do proprietário a questão ainda é o mais curto em PHP também: function f($s,$n){return$n?[f($s,$n-1)]:$s;}.
manatwork
print_r()e, se você não gostar dessa opção, serialize()será mais curta do que json_encode()a outra e diferenciará a saída.
user59178
BTW, que solitário ')no final do código parece estranho.
manatwork
@manatwork Erro de copiar e colar Obrigado
Jörg Hülsermann
3

Ruby: 23 bytes

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

Isso é atualizado para torná-lo um Proc exigível, e não o snippet original. Eu estaria interessado em saber se existe uma maneira de sretornar implicitamente, em vez de precisar devolvê-lo explicitamente.

Peter Nixey
fonte
2
Geralmente, suas "mais algumas palavras" devem ser uma explicação de como seu código funciona. Mas é uma boa resposta, no entanto.
wizzwizz4
"Você deve produzir uma função" Este é um trecho de código. A menos que explicitamente especificado de outra forma, a entrada e a saída devem ser tratadas explicitamente pelo código ou implicitamente pelo intérprete, se houver esse recurso. Você não pode esperar que algumas variáveis ​​globais sejam definidas e não pode simplesmente deixar o resultado em algumas variáveis ​​globais.
manatwork
Bem-vindo ao PPCG! Todas as respostas devem ser funções que podem ser chamadas ou programas completos, no entanto. No seu caso, a solução mais curta seria usar uma função sem nome como ->s,n{...}.
Martin Ender
@ wizzwizz4, e Martin, obrigado por seu incentivo e contribuição útil. Aprendi algo e atualizarei. manatwork, eu tenho uma pele grossa e tenho muitos pontos em SO, mas você sabe que declarações contundentes como essa afastam os novatos dos sites da Stack e os intimidam. Parece uma pena não?
Pedro Nixey
3

C, 44 bytes , 41 bytes

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

Você pode testá-lo fazendo o seguinte:

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

A saída:

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

Claro, você receberá avisos. Isso funciona no gccbash na minha máquina Windows ( gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3), bem como em uma verdadeira máquina Linux ( gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)).

homersimpson
fonte
2
Não tenho certeza sobre outros compiladores, mas int*n(s,a)int*s;{return!a?s:n(&s,a-1);}funciona com o gcc.
Dennis
Segfaults para cc -v-> Apple LLVM version 8.0.0 (clang-800.0.38).
nimi
2
Você pode descartar a !condição ternária e mudar a ordem se n(&s,a-1)salvar um byte?
Riley #
2
@VolAnd Ao ligar n(s,6), você deve mudar ***para ******na declaração de variável e usar. Isso é necessário exatamente porque a função faz o que se espera: aninhe a string em uma matriz várias (aqui: 6) vezes. É claro que você ainda obteria três níveis []porque eles são codificados. Eu acho que o programa não deveria produzi-los. Esse desafio não é sobre colchetes, é sobre aninhamento. Alguns idiomas imprimem matrizes com colchetes, C não possui nenhuma função interna para imprimi-las. E daí? Não é necessário aqui.
Christian Sievers
1
Você pode soltar os espaços após o *na assinatura da função?
Fund Monica's Lawsuit
2

Python, 32 bytes

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

Ruby, 25 caracteres

Reescrever de jamylak 's solução Python .

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

Exemplo de execução:

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"]]]]]
homem a trabalhar
fonte
2

C # 6, 50 bytes

dynamic a(dynamic s,int n)=>n<2?s:a(new[]{s},n-1);
downrep_nation
fonte
1
Não deveria ser n<1? Também -2 bytes se você usar em objectvez de dynamic.
milk
2

Ruby, 24 bytes

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

Chamado o mesmo que na resposta do manatwork , mas uma implementação mais estranha. *squebra a entrada (uma sequência possivelmente aninhada) em uma matriz. Então, se nfor zero, s[n]retorna o primeiro elemento de s, transformando a função em um no-op. Caso contrário, ele retornará, nilpois ssó terá um elemento, então passamos para a chamada recursiva.

histocrata
fonte
2

V , 6 bytes

Àñys$]

Experimente online!

Explicação:

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

Perl 6 , 23 bytes

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

Expandido:

{ # 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
fonte
Perl nunca deixa de me surpreender com sua sintaxe
Ação do Fundo Monica
2

Agda, 173 bytes

Como o tipo de retorno da função depende do número fornecido como argumento, este é claramente um caso em que uma linguagem tipicamente dependente deve ser usada. Infelizmente, o golfe não é fácil em um idioma em que é necessário importar listas e naturais para usá-los. No lado positivo, eles usam suconde eu esperava o verboso succ. Então, aqui está o meu código:

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 ]

(Espero encontrar todos os lugares onde os espaços podem ser omitidos.) LÉ uma função de tipo que, dada uma natural ne um tipo, aretorna o tipo de nvezes que as listas aninhadas são a, o mesmo L 3 Boolseria o tipo de listas de listas de listas de Bool(se tivéssemos importado Bool). Isso nos permite expressar o tipo de nossa função como(n : ℕ) -> {a : Set} -> a -> L n a , onde os chavetas tornam esse argumento implícito. O código usa uma maneira mais curta de escrever esse tipo. A função agora pode ser definida de maneira óbvia pela correspondência de padrões no primeiro argumento.

Carregando este arquivo com uma .agdaextensão para emacs permite uso C-c C-n(avaliar termo à forma normal), de entrada, por exemplo, f 2 3e obter a resposta correta em uma forma estranha: (3 ∷ []) ∷ []. Agora, é claro, se você quiser fazer isso com strings, precisará importá-las ...

Peneiradores cristãos
fonte
Acabei de lembrar que eu poderia escrever em vez de ->, mas é claro que aumenta o tamanho de um arquivo codificado em UTF-8.
Christian Sievers
Minha tradução feia disso para Haskell é um pouco mais curta. Eu tenho que manter o manual unário para mantê-lo curto.
dfeuer
2

k, 3 bytes

,:/

Tomada como uma função diádica, /aplicará iterativamente a função da esquerda ,:( enlist) n vezes ao segundo argumento.

Exemplo:

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

PHP, 44 bytes

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

nada sofisticado, apenas uma função recursiva

Titus
fonte
1

Python 2, 32 bytes

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

Coloca nos colchetes abertos antes da cadeia e nfecha os colchetes antes dela e avalia o resultado. Se uma saída de string for permitida, ela evalpoderá ser removida.

xnor
fonte
1

Na verdade , 4 bytes

A entrada é stringentão n. Sugestões de golfe são bem-vindas. Experimente 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
fonte
1

R, 39 40 bytes

EDIT: corrigido o n=0problema graças a @rturnbull.

Função que recebe duas entradas s(sequência) e n(aninhamento) e gera a lista aninhada. Observe que a classe R listimprime nativamente a saída de maneira diferente da maioria das outras linguagens, no entanto, é funcionalmente semelhante a um mapa de chave / valor (com possíveis chaves sem nome) ou a uma lista em python.

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

Exemplo

> 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
fonte
1
Muito agradável! n=0Porém, não fornece a saída desejada . Antes eu vi sua resposta, eu vim com uma solução recursiva que pode lidar com n=0, mas é 1 byte mais do que a sua solução (40 bytes):f=function(s,n)if(n)list(f(s,n-1))else s
rturnbull
@rturnbull Você certamente está certo. Sua solução é muito mais elegante na minha opinião e eu esqueci totalmente o n=0caso. No entanto, sua solução é na verdade 38bytes excluindo a nomeação da função e, portanto, mais curta. Grande captura
Billywob
1
Por ser uma função recursiva, deve ser nomeada, infelizmente! (Caso contrário, ele não pode interpretar a f(s,n-1)chamada dentro dele.) Funções anônimas recursivas não são possíveis em R, tanto quanto eu sei.
rturnbull
@rturnbull Você está novamente certo. Atualizando a resposta.
Billywob 18/10/19
Um ano mais tarde, eu golfed fora de um outro byte: f=function(s,n)'if'(n,list(f(s,n-1)),s).
rturnbull
1

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

Teste:

(f "test" 3)

Resultado:

"[[['test']]]"
rnso
fonte
1

Haskell, 40 38 bytes

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

O sistema de tipos estritos de Haskell impede o retorno de tipos diferentes (Strings vs. Lista de Strings vs. Lista de Strings, ...), então eu tenho que definir meu próprio tipo que acomode todos esses casos. A função principal fchama recursivamente nvezes o construtor Cpara aninhar e Npara o caso base.

Exemplo de uso (com deriving (Show)adicionado ao novo datatipo para poder imprimi-lo):f 4 "codegolf" ->C (C (C (C (N "codegolf")))) .

Edit: @Christian Sievers salvou 2 bytes reescrevendo a função em um estilo sem pontos para o argumento da string. Obrigado!

nimi
fonte
É claro que as listas de Haskell podem ser aninhadas, mas uma função não pode retornar uma string para um valor e uma lista de listas de strings para outro valor do mesmo tipo. Golfing a derivingcláusula adicional : os parênteses não são necessários. - Não tenho certeza se é bom aninhar apenas o Cconstrutor que não é do tipo lista. Minha tentativa muito semelhante foi baseada em um tipo de dados definido como data D x=J x|L[D x].
Christian Sievers
Se você reverter a ordem dos argumentos e não usar um operador infix, não precisará mencionar o segundo argumento:f 0=N;f n=C. f(n-1)
Christian Sievers
@ChristianSievers: sim, você está certo, minha explicação sobre listas aninhadas não foi precisa - eu mudei. Em relação à semelhança de lista: acho que minha estrutura de dados é semelhante a uma lista. Compare uma lista Haskell nativa 1:(2:(3:([])))com C (C (C (N "codegolf")))). Cé cons ( :), Né nulo ( []).
N /
Cnão contras, apenas incorpora, seu tipo de dados não pode expressar [["a","b"],["c"]]. Mas talvez isso seja bom, pois esse problema precisa apenas de singletons. - f n=...não faz sentido. Ponto reduzido?
Christian Sievers
Você gasta 19 caracteres definindo seu tipo de dados. Não seria mais sensato usar um tipo existente (por exemplo Either), mesmo que isso significasse que os construtores eram um pouco mais detalhados?
Periata Breatta
1

tinylisp (repl), 34 bytes

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

Define uma função F. Tecnicamente, tinylisp não possui seqüências de caracteres, mas esse código funcionará para qualquer tipo de dado fornecido.

Ungolfed (chave para builtins: d= define, q= cita, i= se, c= contras, s= subtrai):

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

Exemplo de uso:

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
fonte
1

Clojure, 24 bytes

#(nth(iterate list %)%2)

Clojure é um pouco competitivo aqui. iteratecria uma sequência de x, (f x), (f (f x)) ...,nth retorna o elemento necessário.

Veja on-line: https://ideone.com/2rQ166

cliffroot
fonte