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


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


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


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!


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.


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


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]

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

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.


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


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

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;

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.


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


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

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

2

C # 6, 50 bytes

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

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.



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
}

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


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"

1

PHP, 44 bytes

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

nada sofisticado, apenas uma função recursiva


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.


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.

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"

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

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!


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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.