Sarang string di dalam array n kali


16

Anda harus menghasilkan fungsi yang membuat string sdi dalam array, nkali

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

Parameter:

  1. s - Sebuah string ascii
  2. n - Bilangan bulat >= 0

Aturan

  • Kode terpendek menang.
  • Outputnya akan bersarang array, listatau tuple(atau sejenisnya berdasarkan dari array)

Uji Kasus

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

Terinspirasi oleh: Menempatkan string di dalam daftar n kali yaitu daftar daftar daftar


6
Apakah output harus berupa daftar, atau bisakah itu string yang mewakili daftar itu?
clismique

2
Bisakah kita mengambil parameter dalam urutan apa pun?
Socratic Phoenix

@ SocratesPhoenix Saya pikir kecuali dilarang secara eksplisit, ya - Anda dapat mengambil input dalam format yang masuk akal (yang akan mencakup mengambil keduanya sebagai daftar juga saya percaya). Mungkin seseorang yang lebih berpengalaman dapat menunjuk ke pos meta yang relevan.
Jonathan Allan

Apakah string akan pernah termasuk yang lolos "? MisalnyaN("stack\"overflow",5)
Riley

@Riley Ini bisa berisi karakter ascii
jamylak

Jawaban:


11

Jelly , 2 byte

Agak membingungkan, karena: (1) Jelly tidak memiliki string, hanya daftar karakter; dan (2); output tidak akan menunjukkan sarang. Untuk melihat bahwa ini sebenarnya adalah melakukan apa yang diminta, lihat representasi string Python dari hasil dengan:

W¡ŒṘ

Sepasang tambahan []akan hadir karena string itu sendiri akan menjadi daftar karakter. Sebagai contoh

Bagaimana?

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

Kode proof-of-concept menambahkan:

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


"Lebih baik" karena sepertinya string sedang digunakan ... itu tidak menunjukkan bahwa daftar karakter sebenarnya sedang digunakan.
Jonathan Allan

15

Java dan C #, 62 byte

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

Harus bekerja tanpa modifikasi di Java dan C #.


Pintar! +1 Saya mencoba membuatnya berfungsi di Jawa dengan membuat String-array, yang tidak benar-benar berhasil. Menggunakan Object sebagai tipe pengembalian dan menyarangkannya di Object [] hanyalah solusi yang diperlukan untuk tantangan ini, karena Object [] (atau array apa pun) juga merupakan Obyek itu sendiri. Bagus
Kevin Cruijssen

12

05AB1E , 3 byte

Kode

`F)

Penjelasan

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

Ini berarti bahwa ini juga berfungsi untuk 0 -testcase, karena string sudah ada di stack.

Cobalah online!


8

JavaScript (ES6), 20 byte

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

Meskipun orang biasanya mengomel saya untuk menjelajah fungsi saya untuk penghematan 1-byte, ini adalah kasus di mana ia sebenarnya berkontribusi pada solusi.


Penggunaan kari yang bagus. Saya pikir Anda dapat membuatnya sedikit lebih mudah dibaca:d=>g=n=>n?[g(n-1)]:d
ETHproduksi


5

CJam , 7 6 byte

{{a}*}

Penerjemah online

Ini adalah fungsi tanpa nama yang mengambil argumennya dari stack sebagai S N, Smenjadi string danN menjadi pembungkus. Anda dapat menjalankannya dengan ~operator, yang berarti eval.

Penjelasan:

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

Cukup gunakan blok tanpa nama untuk menghindari format input yang canggung {{a}*}atau {'a*~}.
Martin Ender

@ MartinEnder Saya khawatir itu akan memerlukan byte, dan saya pikir format input 100% dapat diterima. Ini hanya daftar, dan saya pikir tidak ada batasan bagaimana kedua parameter dimasukkan. Juga, saya tidak pernah bernama blok.
Erik yang Outgolfer

I don't know what you mean about the bytes? Both of those solutions are only 6 bytes.
Martin Ender

@ MartinEnder Oh, apakah ini semua solusi? Saya pikir Anda berbicara tentang memperpanjang program saya, tetapi Anda baru saja mengubahnya menjadi suatu fungsi? Nah, itu mengubah seluruh intinya. Aku seorang newbie di CJam / GolfScript / Pyth. Saya lebih suka yang pertama karena lebih mudah dipahami (ulangi {a}n kali) daripada yang kedua (menghasilkan string n as dan jalankan).
Erik the Outgolfer

4

Javascript ES6, 23 byte

Fungsi rekursif

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 menghasilkan panjang yang sama

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

4

Brachylog , 10 byte

tT,?h:T:gi

Cobalah online!

Penjelasan

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

Ini akan menjadi 3 byte jika tidak disadap. Di sini kita perlu semua ini untuk mendapatkan daftar [String, T, built-in_group]meskipun [String, T]sudah menjadi masukan kita.

Sayangnya :glangsung menghasilkan [[String, T], built-in_group], yang tidak dikenali dengan benar ikarena bilangan bulat Tada di dalam daftar pertama.


4

MATL, 6 byte

ji:"Xh

Ini menghasilkan array sel bersarang sebagai output. Namun, dengan tampilan standar MATL, Anda tidak perlu melihat seperti itu karena tidak akan menampilkan semua kurung kurawal. Demo di bawah ini adalah versi yang sedikit dimodifikasi yang menunjukkan representasi string dari output.

ji:"Xh]&D

Cobalah secara Online

Penjelasan

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

Ini akan menampilkan sesuatu seperti ...[[[[['string']]]]].... Itu tidak akan mengutip untuk kedalaman nol:string.

Penjelasan:

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

Jika Anda ingin mengutip pada kedalaman nol, gunakan solusi 4-byte ini sebagai gantinya (penjelasan):

`]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 jika terlihat hanya seperti tugas

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

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.


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, dan Martin, terima kasih atas dorongan dan masukan Anda, saya telah mempelajari sesuatu dan akan memperbarui. manatwork, saya memiliki kulit tebal dan memiliki banyak poin di SO tetapi Anda tahu bahwa pernyataan tumpul seperti itu menakuti pemula dari situs Stack dan mengintimidasi mereka. Sayang sekali tidak?
Peter Nixey

3

C, 44 byte , 41 byte

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

Anda dapat mengujinya dengan melakukan hal berikut:

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

Hasil:

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

Tentu saja, Anda akan mendapat peringatan. Ini berfungsi pada gccbash di mesin Windows saya ( gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3), dan juga pada mesin Linux yang sebenarnya ( 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

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
Bukankah seharusnya begitu 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]}

Disebut sama dengan jawaban manatwork, 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 byte

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

Diperluas:

{ # 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 tidak pernah berhenti memukau saya dengan sintaksnya
Fund Monica's Lawsuit

2

Agda, 173 byte

Karena tipe kembalinya fungsi tergantung pada angka yang diberikan sebagai argumen, ini jelas merupakan kasus di mana bahasa yang diketik secara dependen harus digunakan. Sayangnya, bermain golf tidak mudah dalam bahasa di mana Anda harus mengimpor naturals dan daftar untuk menggunakannya. Di sisi positifnya, mereka menggunakan di sucmana saya harapkan verbose succ. Jadi, inilah kode saya:

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 ]

(Saya harap saya menemukan semua tempat di mana spasi dapat dihilangkan.) LAdalah fungsi tipe yang diberikan alami ndan tipe amengembalikan jenis nkali daftar bersarang a, jadi L 3 Boolakan menjadi jenis daftar daftar daftar Bool(jika kita memiliki diimpor Bool). Ini memungkinkan kita untuk mengekspresikan jenis fungsi kita sebagai (n : ℕ) -> {a : Set} -> a -> L n a, di mana kurung kurawal membuat argumen itu tersirat. Kode ini menggunakan cara yang lebih pendek untuk menulis jenis ini. Fungsi sekarang dapat didefinisikan dengan cara yang jelas dengan pencocokan pola pada argumen pertama.

Memuat file ini dengan .agdaekstensi ke emacs memungkinkan untuk digunakan C-c C-n(mengevaluasi jangka ke bentuk normal), masukan misalnya f 2 3dan mendapatkan jawaban yang benar dalam bentuk canggung: (3 ∷ []) ∷ []. Sekarang tentu saja jika Anda ingin melakukannya dengan string, Anda harus mengimpornya ...


Hanya ingat bahwa saya bisa menulis alih-alih ->, tetapi tentu saja itu meningkatkan ukuran file yang disandikan UTF-8.
Christian Sievers

Terjemahan jelek saya tentang ini ke Haskell agak lebih pendek. Saya harus tetap menggunakan manual unary agar singkat.
dfeuer

2

k, 3 byte

,:/

Diambil sebagai fungsi diad, / secara iteratif akan menerapkan fungsi tangan kiri ,:( enlist) n kali pada argumen kedua.

Contoh:

k),:/[3;"hello"]
,,,"hello"

1

PHP, 44 byte

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

tidak ada yang canggih, hanya fungsi rekursif


1

Python 2, 32 byte

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

Letakkan ntanda kurung di depan string dan ntutup tanda kurung di depannya, lalu evaluasi hasilnya. Jika output string diizinkan, evaldapat dihapus.


1

Sebenarnya , 4 byte

Masukan stringkemudian n. Saran golf diterima. Cobalah online!

`k`n

Tidak melakukanolf

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

1

R, 39 40 byte

EDIT: Memperbaiki n=0masalah ini berkat @rturnbull.

Fungsi yang mengambil dua input s(string) dan n(nestedness) dan menampilkan daftar bersarang. Perhatikan bahwa R-class listmencetak hasil asli secara berbeda dari kebanyakan bahasa lain, secara fungsional mirip dengan peta kunci / nilai (dengan kunci yang mungkin tidak disebutkan namanya) atau daftar dengan python.

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

Contoh

> 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
Sangat bagus! Itu tidak memberikan output yang diinginkan n=0. Sebelum saya melihat jawaban Anda, saya datang dengan solusi rekursif yang dapat menangani n=0, tetapi 1 byte lebih lama dari solusi Anda (40 byte):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

Setahun kemudian, saya sudah golfed off byte lain: f=function(s,n)'if'(n,list(f(s,n-1)),s).
rturnbull

1

Racket 83 byte

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

Tidak Terkumpul:

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

Pengujian:

(f "test" 3)

Keluaran:

"[[['test']]]"

1

Haskell, 40 38 byte

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

Sistem tipe ketat Haskell mencegah pengembalian tipe yang berbeda (Strings vs. List of Strings vs. List of Strings, ...), jadi saya harus mendefinisikan tipe saya sendiri yang mengakomodasi semua case. Fungsi utama fsecara rekursif memanggil nkali konstruktor Cuntuk bersarang dan Nuntuk kasing.

Contoh penggunaan (dengan deriving (Show)ditambahkan ke datatipe baru untuk dapat mencetaknya):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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.