文字列をn個(または長さn個)に分割します


11

チャレンジ

この課題では、入力の順序に応じて2つの異なる(ただし関連する)タスクを実行する必要があります。
あなたのプログラムは入力として文字列sと整数nを受け取り、

  • 最初に来る場合s、長さの断片に分割されます。必要に応じて、最後の要素が短くなります。ns
  • 最初に来る場合、等しい長sさのn断片に分割されnます。len(s)でない場合n、最初のlen(s) mod n要素の倍数は1つ長くなります。

これら2つの入力のみを使用できます。s数字のみが含まれることはありません。

ノート

  • 逆マッピングを使用できます。それを行う場合は、回答でこれに注意してください。
  • s印刷可能なASCII文字のみが含まれます(改行は含まれません)。
  • これらの2つのタスクを直接解決するビルトインを使用することはできません。他のすべてのビルトインは許可されます。
  • 同じソースから両方の引数を取得する必要があります。
  • 引数を順序付きリストまたは明確な順序である限り明確に示すその他の形式で引数を受け取ることができます。
  • 入力を1つの文字列/ストリームとして受け取り、有効な入力(ヌルバイトなど)ではない文字を使用してそれらを区切ることができます。
  • n常にsゼロ以下の長さと等しくなります。
  • 特定のピースとその順序を明確に示している限り、結果のリストを適切な形式で出力できます。

入力: programming, 3
11は3で割り切れないため、最後の要素には2文字しか含まれていません。
出力: ["pro", "gra", "mmi", "ng"]

入力: 3, programming
11は3の倍数ではないため、最初の2つの要素は1つ長くなります。
出力: ["prog", "ramm", "ing"]

ルール

  • 機能または完全なプログラムが許可されます。
  • 入出力のデフォルト規則
  • 標準の抜け穴が適用されます。
  • これはなので、バイト数が最も少なくなります。Tiebreakerは以前の提出です。

テストケース

このPythプログラムでテストケースが生成されました(ビルトインを使用しているため、有効な回答はありません)。@FryAmTheEggmanの基本バージョンを提供してくれてありがとう!

3、helloworld-> ['hell'、 'owo'、 'rld']
helloworld、3-> ['hel'、 'low'、 'orl'、 'd']
1、プログラミング-> ['programming']
プログラミング、1-> ['p'、 'r'、 'o'、 'g'、 'r'、 'a'、 'm'、 'm'、 'i'、 'n'、 'g']
8、プログラミング-> ['pr'、 'og'、 'ra'、 'm'、 'm'、 'i'、 'n'、 'g']
プログラミング、8-> ['programm'、 'ing']
9、コードゴルフ-> ['c'、 'o'、 'd'、 'e'、 ''、 'g'、 'o'、 'l'、 'f']
コードゴルフ、9-> ['コードゴルフ']
4、133tspeak-> ['133'、 'ts'、 'pe'、 'ak']
133tspeak、4-> ['133t'、 'spea'、 'k']

ハッピーコーディング!


これら2つのタスクを解決するビルトインを使用することはできません。それには、文字列からn番目ごとの文字を取得したり、出現時に分割したりする他の組み込み機能が含まれていますか?
デニス

@Dennisこれは、これを直接解決するビルトインを除外するためだけのものでした。明確にした。
デンカー

言語が配列をサポートしていない場合、どのように出力する必要がありますか?文字列の各結果の間の改行は受け入れられますか?
コナーオブライエン

また、入力があいまいな数字の配列である言語の場合、手順はどうあるべきですか?
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ起こらない sに数字のみが含まれることはありません。また、特定の部分と、もちろん複数行の出力を含むそれらの順序明確に示している限り、結果のリストを適切な形式で出力できます
デンカー

回答:


3

MATL、46 26 21 27 29 42バイト

jtU?jtbUe!tn2Gn>?0t(]tgbw(}ie]!2t$X{Oc''Zt

オンラインでお試しください!(言語の最新バージョンで動作するようにわずかに更新されました)

説明

j           % Explicitly grab the first input as a string
t           % Duplicate
U           % Attempt to convert it to a number
?           % If the conversion to a number was successful
    j       % Explicitly grab the second input as a string
    t       % Duplicate the value
    b       % Bubble-up the first element in the stack
    U       % Convert to a number from a string
    e       % Reshape the string into a nGroup x nPerGroup matrix
    !       % Take the transpose
    t       % Duplicate the result
    n       % Number of characters in the repmat result
    2Gn     % Number of characters in the string
    >?      % If chars in repmat > chars in string
        O   % Zero
        t   % Duplicate 
        (   % Assign the last element to a null character (bug in MATL)
    ]       % End if statement
    t       % Duplicate this matrix
    g       % Convert to a logical matrix
    b       % Bubble-up the original string
    w       % Flip the top two elements
    (       % Assign the non-empty characters to the chars from the input string
}           % Else the string comes first
    i       % Explicitly grab the second input (the number)
    e       % Reshape the characters into an nPerGroup x nGroup 2D array
]           % End of if statement
!           % Take the transpose so it reads left-to-right
2           % Number literal
t           % Duplicate
$X{         % Call num2cell to convert to a cell array
Oc          % Null character
''          % Empty string
Zt          % Replace null chars with empty strings
            % Implicit display of stack contents

一部のリスト要素の最後に表示される印刷できないものは何ですか?これらは入力の一部ではないため、出力の一部でもありません。
デンカー

e禁止されているビルトインではありませんか?
FliiFe

たぶん、2つのブランチを置き換えXUZN?...U?...交換してくださいif。また、あなたは必要ありません3$
ルイスメンドー

@DenkerAffeそれについてすみません。今すぐ修正する必要があります。
-Suever

@FliiFe最初の投稿のコメントに基づいて、e問題を直接解決しないので、禁止されているとは思わない、いや。
-Suever

4

JavaScript(ES6)、132バイト

(s,t)=>+t?[...Array(-~(~-s.length/+t))].map((_,i)=>s.substr(i*t,t)):[...Array(s=+s)].map(_=>t.slice(p,p-=~((t.length-p-1)/s--)),p=0)

これはおそらく絶望的に過剰に設計されています。


さて、私の(現在は亡くなっている)ソリューションは、大幅に設計が不十分でした。+1
edc65

4

JavaScript(Firefox)、88 87バイト

a=>b=>(s=+b?a:b,i=x=0,l=s.length,[for(c of s)if(r=s.slice(x,x+=+b||l/a+(i++<l%a)|0))r])

(...)("programming")(3)Firefox 30 以降を使用するように呼び出します。


2

ルビー、119バイト

->x,y{r=[t=0];x.to_s==x ?(r.push x[t...t+=y]while x[t]):x.times{r.push y[t...t+=y.size/x+(r[y.size%x]? 0:1)]};r[1..-1]}

そして、私は2バイトで1位になります...


Rubyの正規表現オブジェクトには、文字列と同じ方法で値を注入できるためx.scan(/.{,#{y}})、最初のケースで文字列を分割するのと同じように機能します。それとも組み込みとしてカウントされますか?
バリューインク

2

AWK、121 130 128 122のバイト

$1~/^[0-9]+$/{s=1}{a=$(s+1)
b=s?$1:$2
$0=""
for(j=-b;j<=c=length(a);)$0=$0 substr(a,j+=b+s,b+(s=s&&j<c%b*(b+1)?1:0))" "}1

唯一の問題は、最初のエントリが数値で始まる文字列である場合です。これによりAWK、文字列がその番号として表示され、2番目のエントリが文字列として表示されます。

OK ...数値の問題を修正しましたが、9バイト追加されました:(。

少し手を加えて、数バイト節約しました。

ほぼ元の長さに戻ります。:)


OK、@DenkerAffe、一般的に機能するように修正し、(最終的に)1バイトだけ追加しました。
ロバートベンソン

1

Haskell、131バイト

import Data.Lists
q(d,m)=splitPlaces$(d+1<$[1..m])++[d,d..]
a#b|all(`elem`['0'..'9'])a=q(divMod(length b)$read a)b|1<2=q(read b,0)a

使用例:

*Main> "8" # "programming"
["pr","og","ra","m","m","i","n","g"]
*Main> "programming" # "8"
["programm","ing"]

仕組み:主な作業はq、数値(d,m)と文字列のペアを受け取るヘルパー関数によって行われますs。最初にm時間のリストを作成し、d+1その後に無限の数を続けますd(例(1,3)-> [2,2,2,1,1,1,1,1,...])。次に、リストで指定された長さのチャンクsplitPlacesに分割するために使用しsます。要素がなくなるとsplitPlaces停止するsので、無限リストは問題ありません。

メイン関数#は、どのパラメーターが数値n/文字列であるかをチェックし、どちらかまたはplusでstr呼び出します。 q(div (length str) n, mod (length str) n)(n, 0)str


0

C#(LINQPAD)-335バイト

var y=Util.ReadLine().Split(',');int x,j=0;var t=int.TryParse(y[0].Trim(),out x);x=x==0?int.Parse(y[1].Trim()):x;var i=t?y[1].Trim():y[0];var z="";if(!t){while(i.Substring(j).Length>x){z+=i.Substring(j).Length>x?i.Substring(j,x)+", ":"";j+=x;}z+=i.Substring(j);}else z=string.Join(", ",i.Split(x).Select(s=>string.Concat(s)));z.Dump();

入力読み取り部分は少しスペースを取りました。最長回答の勝者。

使用方法#1:

$ 3, helloworld

>> hell, owo, rld

使用方法#2:

$ helloworld, 3

>>hel, low, orl, d


0

Pyth、181バイト

バイト単位で最長のコードが勝つふりをしましょう\ o /

DyGK@G0J:@G1"."1=YJV%lJKW<l@YN.EclJK=YXYN+@YN@YhN=Y.DYhN)FNr%lJK/-lJ%lJK/-lJ%lJKKW<l@YNsclJK=YXYN+@YN@YhN=Y.DYhN))RY)DPG=K@G1=J:@G0"."1=YJV/lJKW<l@YNK=YXYN+@YN@YhN=Y.DYhN))RY).xyQPQ

ここで試してみてください!(オンラインインタープリターにはバグがあるようです。入力すべきではないが入力を表示します)

ターミナルからの出力は次のとおりです。

» pyth split.pyth <<<'["helloworld", 3]' 
['hel', 'low', 'orl', 'd']
» pyth split.pyth <<<'[3, "Helloworld"]'
['Hell', 'owo', 'rld']

真剣に、私は新しいアプローチを受け入れています。私はpythonが初めてなので、おそらくいくつかの速記を見逃しました。

つまり、私の答えはjavascriptの答えよりも長いという点から、私はその答えが絶望的だと思う...


サンプルの入力と出力を提供できますか?
リーキー修道女

ヘッダーの下の公式ソリューションに注意してくださいtestcases。テストケースはPythによって生成されます。解決策は.xcsJKcJsK、です。ここでJおよびKは2つの引数です。
漏れの修道女

@KennyLauオンラインpythインタープリターへのリンクを追加しました。奇妙なことに、昨日はそうではなかったと確信していますが、入力も出力します...それを修正しようとします。
FliiFe

印刷を抑制するためにスペースを使用する
リーキー

@KennyLauスペースはどこですか?
FliiFe

0

PHP、114バイト

[$t,$n,$p]=$argv;for(@+$p?$s=$n:$f=$n*($p=strlen($s=$p)/$n)%$n;$t;)echo$t=substr($s,$a+=$e,$e=$p+($i++<$f)|0),"
";
  • 文字列は数字で始まってはいけません。
    (置き換え+@$pis_numeric($p)固定します。)
  • 出力にチャンク「0」を含めることはできません。
    (修正する前の~ASCIIの場合a&は、印刷可能なASCIIを挿入$t;します。)
  • で実行する-nr、オンラインで試してください

0

PowerShell122 118バイト

param($a,$b)if($a-is[int]){$a,$b=$b,((($l=$b|% Le*)-($c=$l%$a))/$a)}$a-split("(..{$b})"*$c+"(.{0,$b})"*$a.Length)-ne''

オンラインでお試しください!

少ないゴルフ:

param($a,$b)
if($a-is[int]){
    $length=$b|% Length
    $c=$length%$a
    $a,$b=$b,(($length-$c)/$a)  # recalc length and swap
}
$pattern="(..{$b})"*$c+"(.{0,$b})"*$a.Length
$parts=$a -split $pattern       # pattern like '(..{3})(..{3})(.{0,3})(.{0,3})(.{0,3})'
$parts -ne ''                   # output not empty parts
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.