Lồng một chuỗi bên trong một mảng n lần


16

Bạn phải tạo ra một hàm slồng một chuỗi bên trong một mảng, nlần

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

Thông số:

  1. s - Một chuỗi ascii
  2. n - Một số nguyên >= 0

Quy tắc

  • Mã ngắn nhất sẽ thắng.
  • Đầu ra sẽ là một lồng nhau array, listhoặc tuple(hoặc loại tương tự dựa trên một mảng)

Các trường hợp thử nghiệm

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

Lấy cảm hứng từ: Lồng một chuỗi trong danh sách n lần tức là danh sách danh sách danh sách


6
Là đầu ra phải là một danh sách, hoặc nó có thể là một chuỗi đại diện cho danh sách đó?
clismique

2
Chúng ta có thể lấy các tham số theo thứ tự nào không?
Phượng hoàng Socratic

@SocPhoenix Tôi nghĩ trừ khi bị cấm rõ ràng, vâng - bạn có thể lấy đầu vào ở bất kỳ định dạng hợp lý nào (bao gồm cả việc lấy cả hai làm danh sách quá tôi tin). Có lẽ ai đó có kinh nghiệm hơn có thể trỏ đến một bài đăng meta có liên quan.
Jonathan Allan

Chuỗi bao giờ sẽ bao gồm một thoát "? Ví dụ:N("stack\"overflow",5)
Riley

@Riley Nó có thể chứa bất kỳ ký tự ascii nào
jamylak

Câu trả lời:


11

Thạch , 2 byte

Hơi khó hiểu, vì: (1) Jelly không có chuỗi, chỉ có danh sách các ký tự; và 2); đầu ra sẽ không hiển thị lồng nhau. Để thấy rằng điều này thực sự đang làm những gì được yêu cầu, hãy nhìn vào biểu diễn chuỗi Python của kết quả với:

W¡ŒṘ

Một cặp bổ sung []sẽ có mặt vì chính chuỗi sẽ là một danh sách các ký tự. Ví dụ

Làm sao?

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

Mã bằng chứng khái niệm cho biết thêm:

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


"Tốt hơn" ở chỗ có vẻ như các chuỗi đang được sử dụng ... điều đó không cho thấy rằng một danh sách các ký tự đang thực sự được sử dụng.
Jonathan Allan

15

Java và C #, 62 byte

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

Nên hoạt động mà không sửa đổi trong cả Java và C #.


Thông minh! +1 Tôi đã cố gắng làm cho nó hoạt động trong Java bằng cách lồng một mảng Chuỗi, điều này không thực sự hiệu quả. Sử dụng Object làm kiểu trả về và lồng nó vào Object [] chỉ là giải pháp cần thiết cho thử thách này, vì Object [] (hoặc bất kỳ mảng nào) cũng là một Object. Đẹp một.
Kevin Cruijssen

12

05AB1E , 3 byte

`F)

Giải trình

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

Điều này có nghĩa là điều này cũng hoạt động cho 0 -testcase, vì chuỗi đã có trên ngăn xếp.

Hãy thử trực tuyến!


8

JavaScript (ES6), 20 byte

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

Mặc dù mọi người thường cằn nhằn tôi để kiềm chế các chức năng của tôi để tiết kiệm 1 byte, đây là trường hợp nó thực sự đóng góp cho giải pháp.


Công dụng tuyệt vời của cà ri. Tôi nghĩ bạn có thể làm cho nó dễ đọc hơn một chút:d=>g=n=>n?[g(n-1)]:d
ETHproductions


5

CJam , 7 6 byte

{{a}*}

Phiên dịch trực tuyến

Đây là một hàm không tên, lấy các đối số của nó từ ngăn xếp S N, Slà chuỗi và Nlà kết thúc tốt đẹp. Bạn có thể thực hiện nó với ~toán tử, có nghĩa là eval.

Giải trình:

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

Chỉ cần sử dụng một khối không tên để tránh định dạng đầu vào khó xử {{a}*}hoặc {'a*~}.
Martin Ender

@MartinEnder Tôi sợ rằng nó sẽ mất byte, và tôi nghĩ rằng định dạng đầu vào có thể chấp nhận được 100%. Đây chỉ là một danh sách và tôi nghĩ không có hạn chế nào về cách nhập hai tham số đó. Ngoài ra, tôi không bao giờ đặt tên cho khối.
Erik the Outgolfer

Tôi không biết ý của bạn về byte là gì? Cả hai giải pháp đó chỉ có 6 byte.
Martin Ender

@MartinEnder ơi, có phải toàn bộ giải pháp này không? Tôi nghĩ bạn đang nói về việc mở rộng chương trình của tôi, nhưng bạn chỉ chuyển đổi nó thành một chức năng? Vâng, điều đó thay đổi toàn bộ quan điểm. Tôi là người mới chơi tại CJam / GolfScript / Pyth. Tôi thích cái đầu tiên hơn vì nó dễ hiểu hơn (lặp lại {a}n lần) thay vì cái thứ hai (tạo ra một chuỗi n as và thực hiện nó).
Erik the Outgolfer

4

Javascript ES6, 23 byte

Hàm đệ quy

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

Kết quả cà ri trong cùng một chiều dài

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

4

Brachylog , 10 byte

tT,?h:T:gi

Hãy thử trực tuyến!

Giải trình

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

Đây sẽ là 3 byte nếu nó không bị lỗi. Ở đây chúng tôi cần tất cả điều này để có được danh sách [String, T, built-in_group]mặc dù [String, T]đã là đầu vào của chúng tôi.

Thật không may, :gkết quả trực tiếp [[String, T], built-in_group], không được nhận dạng đúng bởi ivì số nguyên Tnằm trong danh sách đầu tiên.


4

MATL, 6 byte

ji:"Xh

Điều này tạo ra một mảng ô lồng nhau làm đầu ra. Tuy nhiên, với màn hình mặc định của MATL, bạn không thể thấy đó là gì vì nó sẽ không hiển thị tất cả các dấu ngoặc nhọn. Bản demo dưới đây là một phiên bản sửa đổi một chút cho thấy đại diện chuỗi của đầu ra.

ji:"Xh]&D

Dùng thử trực tuyến

Giải trình

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

Bình thường , 3 byte

]Fw

Permalink

Điều này sẽ tạo ra một cái gì đó như ...[[[[['string']]]]].... Nó sẽ không trích dẫn cho độ sâu bằng không : string.

Giải trình:

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

Nếu bạn muốn trích dẫn ở độ sâu 0, thay vào đó, hãy sử dụng giải pháp 4 byte này (giải thích):

`]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 nếu nó trông giống như nhiệm vụ

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

Tôi nghĩ rằng việc viết lại trực tiếp câu trả lời Python của chủ sở hữu câu hỏi vẫn là ngắn nhất trong PHP : function f($s,$n){return$n?[f($s,$n-1)]:$s;}.
manatwork

print_r()và, nếu bạn không thích tùy chọn đó, serialize()cả hai đều ngắn hơn json_encode()ing trong khi phân biệt đầu ra.
dùng59178

BTW, cô đơn ')ở cuối mã trông lạ.
manatwork

@manatwork Sao chép và dán lỗi Cảm ơn bạn
Jörg Hülsermann

3

Ruby: 23 byte

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

Điều này được cập nhật để làm cho nó trở thành một Proc có thể gọi được chứ không phải là đoạn gốc. Tôi muốn biết liệu có cách nào để shoàn toàn quay lại thay vì phải trả lại một cách rõ ràng không.


2
Nói chung, "một vài từ" của bạn sẽ là một lời giải thích về cách mã của bạn hoạt động. Nhưng dù sao đó cũng là một câu trả lời hay.
wizzwizz4

Bạn phải sản xuất một chức năng Đây là đoạn mã. Trừ khi có quy định rõ ràng khác, đầu vào và đầu ra phải được xử lý rõ ràng bằng mã hoặc ngầm định bởi trình thông dịch nếu nó có tính năng đó. Bạn không thể mong đợi một số biến toàn cục được đặt và bạn không thể để kết quả trong một số biến toàn cục.
manatwork

Chào mừng đến với PPCG! Mặc dù vậy, tất cả các câu trả lời phải là các hàm có thể gọi được hoặc các chương trình đầy đủ. Trong trường hợp của bạn, cách khắc phục ngắn nhất sẽ là sử dụng một hàm không tên như thế nào ->s,n{...}.
Martin Ender

@ wizzwizz4 và Martin, cảm ơn bạn đã khuyến khích và đầu vào hữu ích, tôi đã học được điều gì đó và sẽ cập nhật. manatwork, tôi đã có làn da dày và có nhiều điểm về SO nhưng bạn biết rằng những tuyên bố thẳng thừng như thế khiến những người mới sợ hãi khỏi các trang web Stack và đe dọa họ. Có vẻ xấu hổ không?
Peter Nixey

3

C, 44 byte , 41 byte

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

Bạn có thể kiểm tra nó bằng cách làm như sau:

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

Đầu ra:

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

Tất nhiên, bạn sẽ nhận được cảnh báo. Điều này hoạt động trên gccbash trên máy Windows của tôi ( gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)cũng như trên máy Linux thực sự ( gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)).


2
Không chắc chắn về các trình biên dịch khác, nhưng int*n(s,a)int*s;{return!a?s:n(&s,a-1);}hoạt động với gcc.
Dennis

Nó segfaults cho cc -v-> Apple LLVM version 8.0.0 (clang-800.0.38).
nimi

2
Bạn có thể thả !từ điều kiện ternary và chuyển thứ tự sn(&s,a-1)để lưu một byte không?
Riley

2
@VolAnd Khi bạn gọi n(s,6), bạn phải đổi ***sang ******khai báo biến và sử dụng. Điều này là chính xác bởi vì hàm thực hiện những gì nó dự kiến ​​sẽ làm: lồng chuỗi vào một mảng nhiều lần (ở đây: 6) lần. Tất nhiên bạn vẫn sẽ nhận được ba cấp độ []bởi vì chúng được mã hóa cứng. Tôi nghĩ rằng chương trình không nên xuất chúng. Thách thức này không phải là về dấu ngoặc, mà là về lồng nhau. Một số ngôn ngữ in mảng có dấu ngoặc, C không có bất kỳ hàm dựng sẵn nào để in chúng cả. Vậy thì sao? Nó không cần thiết ở đây.
Christian Sievers

1
Bạn có thể bỏ khoảng trắng sau *chữ ký hàm không?
Vụ kiện của Quỹ Monica

2

Python, 32 byte

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

2

Ruby, 25 ký tự

Viết lại của jamylak 's giải pháp Python .

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

Chạy mẫu:

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 byte

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

1
Có nên không n<1? Ngoài ra -2 byte nếu bạn sử dụng objectthay vì dynamic.
sữa

2

Ruby, 24 byte

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

Được gọi giống như trong câu trả lời của manatwork , nhưng thực hiện kỳ ​​lạ. *skết thúc đầu vào (một chuỗi có thể lồng nhau) trong một mảng. Sau đó, nếu nbằng 0, s[n]trả về phần tử đầu tiên của s, biến hàm thành no-op. Mặt khác, nó trả về nilssẽ chỉ có một phần tử, vì vậy chúng tôi chuyển qua cuộc gọi đệ quy.



2

Perl 6 , 23 byte

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

Mở rộng:

{ # 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 không bao giờ hết làm tôi ngạc nhiên với cú pháp của nó
Vụ kiện của Quỹ Monica

2

Agda, 173 byte

Vì kiểu trả về của hàm phụ thuộc vào số được đưa ra làm đối số, nên đây rõ ràng là trường hợp nên sử dụng ngôn ngữ được gõ phụ thuộc. Thật không may, chơi golf không dễ dàng trong một ngôn ngữ mà bạn phải nhập khẩu tự nhiên và danh sách để sử dụng chúng. Về mặt tích cực, họ sử dụng sucnơi mà tôi mong đợi dài dòng succ. Vì vậy, đây là mã của tôi:

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 ]

(Tôi hy vọng tôi thấy tất cả những nơi mà không gian có thể được bỏ qua.) LLà một chức năng kiểu đó được đưa ra một cách tự nhiên nvà một kiểu atrả về loại nlần lồng danh sách a, vì vậy L 3 Boolsẽ là loại danh sách các danh mục danh mục Bool(nếu chúng ta có nhập khẩu Bool). Điều này cho phép chúng ta thể hiện loại hàm của chúng ta (n : ℕ) -> {a : Set} -> a -> L n a, trong đó các dấu ngoặc nhọn làm cho đối số đó ẩn. Mã sử ​​dụng một cách ngắn hơn để viết loại này. Bây giờ hàm có thể được định nghĩa một cách rõ ràng bằng cách khớp mẫu trên đối số đầu tiên.

Tải tệp này với .agdaphần mở rộng vào emacs cho phép sử dụng C-c C-n(đánh giá thuật ngữ thành dạng thông thường), ví dụ nhập f 2 3và nhận câu trả lời đúng trong một hình thức khó xử : (3 ∷ []) ∷ []. Bây giờ tất nhiên nếu bạn muốn làm điều đó với chuỗi, bạn phải nhập chúng ...


Chỉ cần nhớ rằng tôi có thể viết thay vì ->, nhưng tất nhiên điều đó làm tăng kích thước của tệp được mã hóa UTF-8.
Christian Sievers

Bản dịch xấu xí của tôi về điều này sang Haskell có phần ngắn hơn. Tôi phải bám vào thủ công unary để giữ cho nó ngắn.
dfeuer

2

k, 3 byte

,:/

Được thực hiện như một hàm dyadic, /sẽ lặp lại áp dụng hàm bên trái ,:( enlist) n lần cho đối số thứ hai.

Thí dụ:

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

1

PHP, 44 byte

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

không có gì tinh vi, chỉ là một hàm đệ quy


1

Python 2, 32 byte

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

Đặt ndấu ngoặc mở trước chuỗi và nđóng ngoặc trước nó, sau đó tránh kết quả. Nếu một đầu ra chuỗi được cho phép, evalcó thể được gỡ bỏ.



1

R, 39 40 byte

EDIT: Đã sửa lỗi n=0nhờ @rturnbull.

Hàm lấy hai đầu vào s(chuỗi) và n(lồng nhau) và xuất ra danh sách lồng nhau. listTuy nhiên, lưu ý rằng lớp R thực sự in đầu ra khác với hầu hết các ngôn ngữ khác, tuy nhiên, có chức năng tương tự như bản đồ khóa / giá trị (với các khóa có thể chưa được đặt tên) hoặc danh sách trong python.

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

Thí dụ

> 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
Rất đẹp! Nó không cung cấp đầu ra mong muốn cho n=0, mặc dù. Trước khi tôi thấy câu trả lời của bạn, tôi đã đưa ra một giải pháp đệ quy có thể giải quyết n=0, nhưng nó dài hơn 1 byte so với giải pháp của bạn (40 byte):f=function(s,n)if(n)list(f(s,n-1))else s
rturnbull

@rturnbull Tất nhiên là bạn đúng. Theo tôi, giải pháp của bạn thanh lịch hơn nhiều và tôi hoàn toàn quên mất n=0vụ việc. Tuy nhiên, giải pháp của bạn thực sự là các 38byte không bao gồm việc đặt tên hàm và do đó ngắn hơn. Bắt tuyệt vời
Billywob

1
Vì nó là một hàm đệ quy nên nó không được đặt tên! (Nếu không, nó không thể diễn giải f(s,n-1)cuộc gọi bên trong nó.) Các hàm ẩn danh đệ quy không thể thực hiện được trong R, theo như tôi biết.
rturnbull

@rturnbull Bạn lại đúng. Cập nhật câu trả lời.
Billywob

Một năm sau, tôi đã chơi một byte khác : f=function(s,n)'if'(n,list(f(s,n-1)),s).
rturnbull

1

Vợt 83 byte

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

Ung dung:

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

Kiểm tra:

(f "test" 3)

Đầu ra:

"[[['test']]]"

1

Haskell, 40 38 byte

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

Hệ thống loại nghiêm ngặt của Haskell ngăn trả về các loại khác nhau (Chuỗi so với Danh sách Chuỗi so với Danh sách Chuỗi, ...), vì vậy tôi phải xác định loại riêng phù hợp với tất cả các trường hợp đó. Hàm chính fgọi đệ quy nlần hàm tạo Cđể lồng và Ncho trường hợp cơ sở.

Ví dụ sử dụng ( deriving (Show)được thêm vào dataloại mới để có thể in nó): f 4 "codegolf"-> C (C (C (C (N "codegolf")))).

Chỉnh sửa: @Christian Sievers đã lưu 2 byte bằng cách viết lại hàm theo kiểu không có điểm cho đối số chuỗi. Cảm ơn!


Tất nhiên các danh sách của Haskell có thể được lồng vào nhau, nhưng một hàm không thể trả về một chuỗi cho một giá trị và một danh sách các danh sách các chuỗi cho một giá trị khác cùng loại. Đánh gôn derivingđiều khoản bổ sung : không cần parens. - Không chắc chắn liệu có ổn không khi chỉ Cxây dựng hàm tạo không giống như danh sách. Nỗ lực rất giống nhau của tôi dựa trên một loại dữ liệu được xác định là data D x=J x|L[D x].
Christian Sievers

Nếu bạn đảo ngược thứ tự của các đối số và không sử dụng toán tử infix, bạn không cần đề cập đến đối số thứ hai:f 0=N;f n=C. f(n-1)
Christian Sievers

@ChristianSievers: vâng, bạn nói đúng, lời giải thích của tôi về danh sách lồng nhau là không chính xác - Tôi đã thay đổi nó. Về tính thích danh sách: Tôi nghĩ rằng cấu trúc dữ liệu của tôi giống như danh sách. So sánh danh sách Haskell bản địa 1:(2:(3:([])))với C (C (C (N "codegolf"))). Clà khuyết điểm ( :), Nlà nil ( []).
nimi

Ckhông có nhược điểm, nó chỉ nhúng, kiểu dữ liệu của bạn không thể biểu thị [["a","b"],["c"]]. Nhưng có lẽ điều đó là tốt vì vấn đề này chỉ cần singletons. - f n=...không phải là điểm miễn phí. Giảm điểm?
Christian Sievers

Bạn dành 19 ký tự xác định loại dữ liệu của bạn. Sẽ không hợp lý hơn khi sử dụng một loại hiện có (ví dụ Either) ngay cả khi điều đó có nghĩa là các nhà xây dựng dài dòng hơn một chút?
Periata Breatta

1

tinylisp (thay thế), 34 byte

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

Xác định một hàm F. Về mặt kỹ thuật, tinylisp không có chuỗi, nhưng mã này sẽ hoạt động với mọi loại dữ liệu được cung cấp.

Ungolfed (khóa để xây dựng: d= xác định, q= quote, i= if, c= cons, s= trừ):

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

Ví dụ sử dụng:

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 byte

#(nth(iterate list %)%2)

Clojure có phần cạnh tranh ở đây. iteratetạo ra một chuỗi x, (f x), (f (f x)) ..., nthtrả về phần tử cần thiết.

Xem trực tuyến: https://ideone.com/2rQ166

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.