Вкладіть рядок всередині масиву n разів


16

Ви повинні створити функцію, яка розміщує рядок sвсередині масиву, nраз

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

Параметри:

  1. s - рядок ascii
  2. n - Ціле число >= 0

Правила

  • Найкоротший код виграє.
  • Вихід буде вкладеним array, listабо tuple(або аналогічного типу засновані від масиву)

Випробування

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

Натхненний: Введення рядка всередині списку n разів, тобто список списку списку


6
Чи повинен виводити список, чи це може бути рядок, що представляє цей список?
клісмік

2
Чи можемо ми взяти параметри в будь-якому порядку?
Сократичний Фенікс

@SocratPhoenix Я думаю, якщо прямо не заборонено, так - ви можете взяти дані в будь-якому розумному форматі (який би включав прийняття обох як список, я теж вважаю). Можливо, хтось більш досвідчений може вказати на відповідний мета-пост.
Джонатан Аллан

Чи буде рядок колись включати втече "? Напр.N("stack\"overflow",5)
Райлі

@Riley Він міг містити будь-якого персонажа ascii
jamylak

Відповіді:


11

Желе , 2 байти

Трохи заплутаний, оскільки: (1) у желе немає рядків, лише списки символів; і (2); Вихідні дані показують вкладення. Щоб побачити, що це насправді робиться те, що запитується, подивіться на представлення результату на Python за допомогою:

W¡ŒṘ

Додаткова пара []буде присутня, оскільки сама рядок буде переліком символів. Наприклад

Як?

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

Код перевірки концепції додає:

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


"Краще" в тому, що це схоже на те, що рядки використовуються ... це не показує, що список символів насправді використовується.
Джонатан Аллан

15

Java та C #, 62 байти

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

Має працювати без змін і в Java, і в C #.


Розумний! +1 Я намагався змусити його працювати на Java, вклавши String-масив, який насправді не вийшов. Використання об'єкта як типу повернення та вкладення його в Object [] - лише рішення, необхідне для цього виклику, оскільки Object [] (або будь-який масив) також є самим Об'єктом. Хороший.
Кевін Кройсейсен

12

05AB1E , 3 байти

Код

`F)

Пояснення

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

Це означає, що це також працює для 0 -тестових записів, оскільки рядок вже є в стеку.

Спробуйте в Інтернеті!


8

JavaScript (ES6), 20 байт

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

Хоча люди зазвичай тягнуть мене, щоб карбувати свої функції для 1-байтового збереження, це випадок, коли він насправді сприяє вирішенню.


Прекрасне використання каррі. Я думаю, ви можете зробити це трохи читабельніше:d=>g=n=>n?[g(n-1)]:d
ETHproductions


5

CJam , 7 6 байт

{{a}*}

Онлайн-перекладач

Це безіменна функція , яка приймає аргументи з стека , як S N, Sбудучи рядок і Nбути розсекречувати. Ви можете виконати його з ~оператором, тобто eval.

Пояснення:

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

Просто використовуйте неназваний блок, щоб уникнути незручного формату введення {{a}*}або {'a*~}.
Мартін Ендер

@MartinEnder Я боюся, що це займе байтів, і я думаю, що формат введення є 100% прийнятним. Це лише список, і я думаю, що немає обмежень щодо введення цих двох параметрів. Також я ніколи не називав блок.
Ерік Аутгольфер

Я не знаю, що ви маєте на увазі під байтами? Обидва ці рішення мають лише 6 байт.
Мартін Ендер

@MartinEnder О, це були цілі рішення? Я думав, ти говориш про розширення моєї програми, але ти просто перетворив її на функцію? Ну, і це змінює всю суть. Я новачок у CJam / GolfScript / Pyth. Я вважаю за краще перший, тому що він більш зрозумілий (повторіть {a}n разів) замість другого (створити рядок з n as та виконати його).
Ерік Аутгольфер

4

Javascript ES6, 23 байти

Рекурсивна функція

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

Крірінг отримує однакову довжину

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

4

Брахілог , 10 байт

tT,?h:T:gi

Спробуйте в Інтернеті!

Пояснення

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

Це було б 3 байти, якби його не помилили. Тут нам потрібно все це для того, щоб отримати список, [String, T, built-in_group]хоча [String, T]він вже є нашим вкладом.

На жаль, це :gбезпосередньо призводить до [[String, T], built-in_group], що не розпізнається належним чином, iоскільки ціле число Tзнаходиться в першому списку.


4

MATL, 6 байт

ji:"Xh

Це створює вкладений масив комірок як вихід. З дисплеєм за замовчуванням MATL вам не потрібно бачити , що це таке, оскільки він не відображатиме всі фігурні дужки. Демонстрація нижче - це трохи змінена версія, яка показує рядкове представлення результату.

ji:"Xh]&D

Спробуйте в Інтернеті

Пояснення

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 байти

]Fw

Постійна посилання

Це виведе щось подібне ...[[[[['string']]]]].... Це не процитувати нульовий глибини: string.

Пояснення:

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

Якщо ви хочете цитувати на нульовій глибині, використовуйте замість цього 4-байтне рішення (пояснення):

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

3

PHP, 60 байт

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

48 байт, якщо це виглядає лише як завдання

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

Я думаю , що пряме переписування свою відповідь Python власника сумніви з - як і раніше найкоротший в PHP теж: function f($s,$n){return$n?[f($s,$n-1)]:$s;}.
манатура

print_r()і, якщо вам цей варіант не подобається, serialize()вони обидвіші коротші, ніж json_encode()їх під час розмежування результатів.
користувач59178

До речі, це самотнє ')в кінці коду виглядає дивно.
манатство

@manatwork Помилка копіювання та вставки. Дякую
Jörg Hülsermann

3

Рубін: 23 байти

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

Він оновлюється, щоб зробити програму Proc викликає, а не оригінальний фрагмент. Мені було б цікаво дізнатись, чи існує спосіб sнеявного повернення, а не явне повернення.


2
Як правило, ваші "ще кілька слів" повинні бути поясненням того, як працює ваш код. Але це все-таки хороша відповідь.
wizzwizz4

"Ви повинні створити функцію" Це фрагмент коду. Якщо явно не вказано інше, введення та вихід повинні оброблятися явно кодом або неявно інтерпретатором, якщо він має таку особливість. Ви не можете очікувати встановлення деяких глобальних змінних і не можете просто залишити результат у деяких глобальних змінних.
манатура

Ласкаво просимо до PPCG! Однак усі відповіді повинні бути функціями, що викликаються, або повними програмами. У вашому випадку найкоротшим виправленням буде використання неназваної функції типу ->s,n{...}.
Мартін Ендер

@ wizzwizz4, і Мартін, дякую за заохочення та корисний внесок, я щось дізнався і оновлю. manatwork, у мене товста шкіра і є багато точок на SO, але ви знаєте, що тупі висловлювання на кшталт того, що відлякують новачків далеко від сайтів Stack і залякують їх. Здається сором ні?
Пітер Ніксі

3

C, 44 байти , 41 байт

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

Ви можете перевірити це, виконавши наступне:

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

Вихід:

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

Звичайно, ви отримаєте попередження. Це працює на gccbash на моїй машині Windows ( gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)а також на справжній машині Linux ( gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)).


2
Не впевнений у інших компіляторах, але int*n(s,a)int*s;{return!a?s:n(&s,a-1);}працює з gcc.
Денніс

Це segfaults для cc -v-> Apple LLVM version 8.0.0 (clang-800.0.38).
німі

2
Чи можете ви відмовитися !від потрійного стану та змінити порядок sі n(&s,a-1)зберегти байт?
Райлі

2
@VolAnd Коли ви телефонуєте n(s,6), ви повинні змінити , ***щоб ******в оголошенні змінного і використанні. Це потрібно саме тому, що функція робить те, що очікується зробити: вкладіть рядок у масив кілька (тут: 6) разів. Звичайно, ви все одно отримаєте три рівні, []оскільки вони жорстко закодовані. Я думаю, що програма взагалі не повинна їх виводити. Ця проблема не стосується дужок, це гніздування. Деякі мови друкують масиви дужками, C взагалі не має вбудованої функції для їх друку. І що? Тут вона не потрібна.
Крістіан Сіверс

1
Чи можете ви залишити пробіли після *підпису функції?
Фонд позову Моніки


2

Рубі, 25 символів

Переписати з jamylak «s рішення Python .

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

Проба зразка:

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 байт

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

1
Чи не повинно бути n<1? Також -2 байти, якщо ви використовуєте objectзамість dynamic.
молоко

2

Рубін, 24 байти

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

Називається так само, як у відповіді на маневреність , але більш дивною реалізацією. *sзагортає вхід (можливо вкладений рядок) у масив. Тоді, якщо nдорівнює нулю, s[n]повертає перший елемент s, перетворюючи функцію в неоперативний варіант. В іншому випадку він повертається, nilоскільки sбуде мати колись один елемент, тому ми переходимо до рекурсивного виклику.



2

Perl 6 , 23 байти

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

Розширено:

{ # 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 ніколи не перестає дивувати мене своїм синтаксисом
Фонд судового позову Моніки

2

Агда, 173 байт

Оскільки тип повернення функції залежить від числа, поданого в якості аргументу, це явно випадок, коли слід використовувати залежно введений мову. На жаль, гольф не є простим мовою, куди вам доведеться імпортувати природні та списки, щоб їх використовувати. З позитивного боку, вони використовують sucтам, де я б очікував багатослівного succ. Отже ось мій код:

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 ]

(Я сподіваюся, що я знайшов усі місця, де пропуски можуть бути пропущені.) L- це функція типу, яка надає натуральний, nа тип aповертає тип nвкладених разів списків a, таким чином L 3 Boolбуде тип списків списків списків Bool(якби ми мали імпорт Bool). Це дозволяє нам виразити тип нашої функції як (n : ℕ) -> {a : Set} -> a -> L n a, де фігурні дужки роблять цей аргумент неявним. Код використовує коротший спосіб написання цього типу. Тепер функцію можна визначити очевидним чином шляхом узгодження шаблону на першому аргументі.

Завантаження цього файлу з .agdaрозширенням в Emacs дозволяє використовувати C-c C-n(оцінити термін до нормальної форми), вхід для прикладу f 2 3і отримати правильну відповідь в незручному вигляді: (3 ∷ []) ∷ []. Звичайно, якщо ви хочете зробити це за допомогою рядків, вам доведеться імпортувати їх ...


Просто згадав, що я можу писати замість ->, але, звичайно, це збільшує розмір закодованого файлом UTF-8.
Крістіан Сіверс

Мій потворний переклад цього на Haskell дещо коротший. Я маю дотримуватися ручної одинарної, щоб тримати її короткою.
dfeuer

2

k, 3 байти

,:/

Взята як діадична функція, /ітеративно застосовуватиме ліву функцію ,:( enlist) n разів n до другого аргументу.

Приклад:

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

1

PHP, 44 байти

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

нічого складного, просто рекурсивна функція


1

Python 2, 32 байти

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.