文字列を配列内にn回ネストする


16

あなたは、文字列をネスト機能生成しなければならないs配列内、n

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

パラメーター:

  1. s -アスキー文字列
  2. n -整数 >= 0

ルール

  • 最短のコードが優先されます。
  • 出力は、ネストされたarraylistまたはtuple(または配列に基づく同様のタイプ)になります

テストケース

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

インスピレーション:リスト内の文字列をn回ネストする、つまりリストのリストのリスト


6
出力はリストにする必要がありますか、それともそのリストを表す文字列にすることができますか?
clismique

2
パラメータを任意の順序で取得できますか?
ソクラティックフェニックス

@SocraticPhoenix明示的に禁止されていない限り、はい-妥当な形式で入力を取得できます(この2つをリストとして取得することも考えられます)。おそらく、より経験豊富な人が関連するメタ投稿を指すことができます。
ジョナサンアラン

文字列にはエスケープが含まれ"ますか?例N("stack\"overflow",5)
ライリー

@Rileyそれは任意のアスキー文字を含むことができます
-jamylak

回答:


11

ゼリー、2 バイト

(1)Jellyには文字列がなく、文字のリストしかありません。および(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で動作させようとしていましたが、実際にはうまくいきませんでした。Object [](または任意の配列)もオブジェクト自体であるため、戻り値の型としてObjectを使用し、Object []にネストすることは、この課題に必要なソリューションです。良いですね。
ケビンCruijssen

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

CJam7 6バイト

{{a}*}

オンライン通訳

これは、文字列でありラップであるとしてS N、スタックから引数を受け取る名前のない関数です。evalを意味する演算子で実行できます。SN~

説明:

{{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%受け入れられると思います。これは単なるリストであり、これら2つのパラメーターの入力方法に制限はないと思います。また、ブロックに名前を付けたことはありません。
エリックアウトゴルファー

バイトの意味がわかりませんか?これらのソリューションは両方ともわずか6バイトです。
マーティンエンダー

@MartinEnderああ、これらのソリューション全体でしたか?あなたは私のプログラムを拡張することについて話していると思っていましたが、あなたはそれを関数に変換しただけですか?まあ、それは全体のポイントを変更します。私はCJam / GolfScript / Pythの初心者です。最初の方{a}が、2番目の(n aの文字列を生成して実行する)よりもわかりやすい(n回繰り返す)ので、私は好む。
エリックアウトゴルファー

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

Brachylog、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]認識されません。iT


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()する必要があります。
user59178

ところで、')コードの最後の孤独は奇妙に見えます。
マナトワーク

@manatworkコピーアンドペーストエラーありがとうございます
ヨルクヒュルサーマン

3

ルビー:23バイト

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

これは、元のスニペットではなく、呼び出し可能なProcになるように更新されています。s明示的に返すのではなく、暗黙的に返す方法があるかどうかを知りたいと思います。


2
一般に、「もう少し言葉」とは、コードがどのように機能するかを説明するものです。しかし、それでも良い答えです。
wizzwizz4

「関数を作成する必要があります」これはコードスニペットです。特に明示的に指定されていない限り、入力と出力はコードによって明示的に処理されるか、そのような機能がある場合はインタープリターによって暗黙的に処理される必要があります。一部のグローバル変数が設定されることを期待することはできず、一部のグローバル変数に結果を残すことはできません。
マナトワーク

PPCGへようこそ!ただし、すべての答えは、呼び出し可能な関数または完全なプログラムでなければなりません。あなたの場合、最も簡単な修正方法は、などの名前のない関数を使用することです->s,n{...}
マーティンエンダー

@ wizzwizz4、Martin、あなたの励ましと有益な情報に感謝します。私は何かを学び、更新します。マナトワーク、私は厚い肌を持っており、SOに多くのポイントを持っていますが、あなたはそのような鈍い声明がスタックサイトから離れて初心者を怖がらせ、それらを脅すことを知っています。恥ずかしい?
ピーターニクシー

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

もちろん、警告が表示されます。これgccは、Windowsマシンのbash(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で動作します。
デニス

cc -v->のセグメンテーション違反Apple LLVM version 8.0.0 (clang-800.0.38)
nimi

2
あなたはドロップできる!三元状態からの順番を入れ替えるsn(&s,a-1)、バイトを保存しますか?
ライリー

2
@VolAndを呼び出すときは、変数宣言n(s,6)をに変更*********て使用する必要があります。これは、関数が期待どおりの動作を行うために必要です。つまり、文字列を数回(ここでは6回)配列にネストします。もちろん[]、ハードコーディングされているため、まだ3つのレベルを取得できます。プログラムはそれらをまったく出力すべきではないと思います。この課題は、括弧に関するものではなく、ネストに関するものです。一部の言語では、配列を角かっこで出力しますが、Cにはそれらを出力する組み込み関数がまったくありません。だから何?ここでは必要ありません。
クリスチャンシーバーズ

1
*関数シグネチャの後にスペースをドロップできますか?
ファンドモニカの訴訟


2

ルビー、25文字

書き換えjamylakPythonのソリューション

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か?のobject代わりに-2バイトを使用する場合もdynamic
ミルク

2

ルビー、24バイト

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

manatwork's answerと同じですが、実装は奇妙です。*s入力(ネストされている可能性のある文字列)を配列にラップします。次に、nがゼロの場合、s[n]の最初の要素を返しs、関数を何もしません それ以外の場合は、要素が1つだけになる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

Agda、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)を2番目の引数に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)

プットは、n文字列の前にブラケットと開くnそれは、その結果を試用版とその前にクローズブラケットを。文字列出力が許可されている場合、eval削除できます。



1

R、 39 40バイト

編集:n=0@rturnbullのおかげで問題を修正しました。

2つの入力s(文字列)とn(ネスト)を受け取り、ネストされたリストを出力する関数。Rクラスlistは、他のほとんどの言語とは異なる方法でネイティブに出力を印刷しますが、機能的にはキー/値マップ(名前のないキーを含む)またはPythonのリストに似ていることに注意してください。

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

> 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
非常に素晴らしい!n=0ただし、には目的の出力が得られません。あなたの答えを見る前に、を扱うことができる再帰的な解決策を思いつきましたが、n=0それはあなたの解決策(40バイト)よりも1バイト長いです:f=function(s,n)if(n)list(f(s,n-1))else s
rturnbull

@rturnbullもちろんあなたは正しい。あなたの解決策は私の意見でははるかにエレガントであり、私はこのn=0事件を完全に忘れていました。ただし、実際のソリューションは38、関数の名前を除いたバイト数であり、したがってより短くなります。素晴らしいキャッチ
ビリーウォブ

1
再帰関数なので、残念ながら名前を付けなければなりません!(そうでなければ、そのf(s,n-1)内部の呼び出しを解釈できません。)私が知る限り、Rでは再帰的な匿名関数は使用できません。
-rturnbull

@rturnbull再び正しい。答えを更新します。
ビリーウォブ

1年後、別のバイトでゴルフをしました:f=function(s,n)'if'(n,list(f(s,n-1)),s)
rturnbull

1

ラケット83バイト

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

ゴルフをしていない:

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

テスト:

(f "test" 3)

出力:

"[[['test']]]"

1

Haskell、40 38バイト

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

Haskellの厳密な型システムは、異なる型(文字列対文字列のリスト対文字列のリストなど)を返すことを防ぎます。そのため、これらすべてのケースに対応する独自の型を定義する必要があります。メイン関数fは、ネストとベースケースのnコンストラクターCを再帰的に呼び出しますN

使用例(印刷できるようにderiving (Show)新しいdataタイプに追加):f 4 "codegolf"-> C (C (C (C (N "codegolf"))))

編集:@Christian Sieversは、文字列引数の関数をポイントフリースタイルで書き換えることにより2バイトを節約しました。ありがとう!


もちろん、Haskellのリストはネストできますが、関数は1つの値の文字列と、同じ型の別の値の文字列のリストのリストを返すことはできません。追加deriving条項のゴルフ:括弧は必要ありません。- Cリストのようなものではないコンストラクタをネストするだけでよいかどうかわからない。私の非常に似た試みは、として定義されたデータ型に基づいていましたdata D x=J x|L[D x]
クリスチャンシーバーズ

あなたは引数の順序を逆にし、中置演算子を使用しない場合は、第二引数に言及する必要はありません:f 0=N;f n=C. f(n-1)
クリスチャンSieversの

@ChristianSievers:はい、そうです、ネストされたリストに関する私の説明は正確ではありませんでした-私はそれを変更しました。リストのようなものについて:私のデータ構造はリストのようなものだと思います。ネイティブHaskellリスト1:(2:(3:([])))とC(C(C(N "codegolf")))を比較します。Ccons(:)、Nnil([])です。
nimi

C短所ではなく、埋め込むだけで、データ型は表現できません[["a","b"],["c"]]。しかし、この問題はシングルトンのみを必要とするため、それで問題はありません。- f n=...ポイントフリーではありません。ポイント削減?
クリスチャンシーバーズ

データ型の定義には19文字を費やします。Eitherコンストラクタがもう少し冗長であっても、既存のタイプ(例)を使用する方が賢明ではないでしょうか?
ペリアタブレアッタ16年

1

tinylisp(repl)、34バイト

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

関数を定義しますF。技術的には、tinylispには文字列はありませんが、このコードは指定されたデータ型に対して機能します。

Ungolfed(組み込みのキー:d=定義、q=引用、i= if、c= cons、s=減算):

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

使用例:

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バイト

#(nth(iterate list %)%2)

Clojureはここでいくらか競争力があります。iterateシーケンス作成しx, (f x), (f (f x)) ...nthリターンに必要な要素を。

オンラインで見る: https //ideone.com/2rQ166

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.