部分文字列連鎖


27

前書き

この例では、文字列Hello, World!と配列を取りましょう[3, 2, 3]。部分文字列チェーンを見つけるには、次のプロセスを実行します。

配列の最初の数は3、我々はサブ得るので、[0 - 3]あります、Hel。その後3、初期文字列から最初の文字を削除しlo, World!ます。

配列の2番目の数値は2ですので[0 - 2]、新しい文字列から部分文字列を取得しますlo。残りの文字列はになり, World!ます。

最後の数は、3私たちを与えます、, Wサブチェーンは、私たちを与える組み合わせたストリングのすべて、次のとおりです。

['Hel', 'lo', ', W']

より視覚的な例:

[3, 2, 3], 'Hello, World!'
3 -> Hel
2 ->    lo
3 ->      , W

タスク

所与の非空の文字列非空の配列のみからなる正の整数()、出力ストリングチェーン。配列内のすべての整数の合計が文字列の長さを超えないと仮定できます。> 0

また、文字列に改行が含まれないことも想定できます。

テストケース

Input: abcdefghijk, [2, 1, 3]
Output: ['ab', 'c', 'def']

Input: Code Golf, [4, 1]
Output: ['Code', ' ']

Input: Ayyy, [3]
Output: ['Ayy']

Input: lexicographically, [2, 2, 2, 7, 4]
Output: ['le', 'xi', 'co', 'graphic', 'ally']

これはであるため、バイト数が最小の提出が勝ちです!

回答:



12

Python 2、42バイト

s,a=input()
for n in a:print s[:n];s=s[n:]

時々、あなたはそれを退屈な方法で行うだけです。


これまでのところ、あまりにも多くのPythonの回答の中で最も短いもの
Cyoce

まあ明らかに私が...ハハ、それをoverthinkingた
DJMcMayhem

8

Brachylog20 13バイト

h@[~c.:la~t?,

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

これは非常に非効率的で、最後のテストケースのTIOでタイムアウトします。

説明

Input = [String, List of integers]

h@[            Take a prefix of the string
   ~c.         Take a possible list of strings which when concatenated results in that prefix
      :la      Take the lengths of each element of that list
         ~t?,  This list of lengths is equal to the list of integers of the Input

わずかに効率的なバージョン、15バイト

t:{〜l} a。、?h @ [〜c


8

Python 3、45バイト

f=lambda s,a:f(s[a[0]:print(s[:a.pop(0)])],a)

これは、行ごとに1つの部分文字列を出力し、aを使い果たすとエラーで終了します。

repl.itでテストします


2
印刷物をこっそり見るにはなんて素晴らしい方法でしょう!
xnor

7

パイソン、52、46のバイト

f=lambda a,s:a and[s[:a[0]]]+f(a[1:],s[a[0]:])

再帰的なラムダ関数。

6バイトを削るデニスに感謝します!


7

ゼリー、6バイト

Jx$ĠịY

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

        The implicit working value is the first argument.
Jx$     Given a list L, repeat (x) an element of [1..len(n)] (J)
        as many times as the corresponding value in L.
   Ġ    Group indices by values. This turns [1, 1, 1, 2, 2, 3, 3]
        into [[1, 2, 3], [4, 5], [6, 7]].
    ị   Index into the second argument.
     Y  Join by newlines.

5

Haskell、34バイト

s#(a:b)=take a s:drop a s#b
_#_=[]

使用例:"lexicographically" # [2,2,2,7,4]->["le","xi","co","graphic","ally"]

単純な再帰。

または、組み込みの退屈な29バイトソリューション:

import Data.Lists
splitPlaces

5

ルビー、26バイト

->w,a{a.map{|n|w.shift n}}

文字列は文字の配列として表されます。


4

PowerShell v2 +、46バイト

param($a,$b)$b|%{-join$a[$i..($i+=$_-1)];$i++}

入力文字列$aと配列を受け取り$b、ループし$bます。各反復は、(デフォルトは、または)と現在の数値に$a基づいて配列スライスを実行します。PowerShellの文字列にはゼロインデックスが付けられているため、これを行う必要があります。$i$null0-1$i++

(ここでの出力はスペースで区切られています。これが配列のデフォルトの文字列化方法だからです)

PS C:\Tools\Scripts\golfing> @('abcdefghijk',@(2,1,3)),@('Code Golf',@(4,1)),@('Ayyy',@(3)),@('lexicographically',@(2,2,2,7,4))|%{""+$_[0]+" -> "+(.\substring-chainification.ps1 $_[0] $_[1])}
abcdefghijk -> ab c def
Code Golf -> Code  
Ayyy -> Ayy
lexicographically -> le xi co graphic ally

4

Perl、28バイト

+1を含む -n

STDINの入力文字列の後に、個別の行の各数値を続けて実行します。

(echo "Hello, World!"; echo 3; echo 2; echo 3) | perl -nE 'say for/(??{"."x<>||"^"})/g'

コードだけ:

say for/(??{"."x<>||"^"})/g

なんらかの機能を持たない23バイトバージョンです||"^"が、誤った末尾の改行を出力します

"^"$_文字列に正規表現のメタ文字が含まれていない場合に置き換えることができます


3

MATL、8バイト

ys:)1bY{

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

説明

y    % Implicitly take the two inputs: numerical array, string. Duplicate the array
s    % Sum of the array, say n
:    % Range from 1 to n
)    % Take first n characters of the string
1    % Push 1
b    % Bubble up the original copy of the string to the top
Y{   % Split into pieces of lengths given by the numerical array. The pieces are 
     % stored in a cell array, which is implicitly displayed, one cell per line

3

JavaScript(ES6)、39 38 35バイト

ETHproductionsのおかげで3バイト節約されました:

s=>a=>a.map(v=>s.slice(t,t+=v),t=0)

例:

//Definition
f=
s=>a=>a.map(v=>s.slice(t,t+=v),t=0)

//Call
f('lexicographically')([2, 2, 2, 7, 4]);

//Output
Array [ "le", "xi", "co", "graphic", "ally" ]


前のソリューション:
Huntroのおかげで38バイト:

s=>a=>a.map(v=>s.substr(t,v,t+=v),t=0)

39バイト:

(s,a)=>a.map(v=>s.substr(t,v,t+=v),t=0)

1
あなたはカリー化によって1つのバイトを保存することができます
Huntro

2
.slice数バイトを節約しますs=>a=>a.map(v=>s.slice(t,t+=v),t=0)
。– ETHproductions

3

バッチ、74バイト

@set/ps=
@for %%i in (%*)do @call echo %%s:~0,%%i%%&call set s=%%s:~%%i%%

私はCを破っている?これは正しくありません!STDINの文字列と配列をコマンドライン引数として受け取ります。


3

Java、119バイト

String[] substringChainification(String s, int[] i) {
    String[] r = new String[i.length];
    int j = 0, f = 0;
    for (int t : i)
        r[j++] = s.substring(f, f += t);
    return r;
}

ゴルフ:

String[]s(String s,int[]i){String[]r=new String[i.length];int j=0,f=0;for(int t:i)r[j++]=s.substring(f,f+=t);return r;}

RomanGräfの回答(/codegolf//a/93992/59935)を修正しましたが、コメントするのに十分な担当者がいません。

ループの実装を変更し、繰り返しごとにソース文字列を別の部分文字列に設定する代わりに、部分文字列を取得するインデックスを変更します。


2
PPCGへようこそ!素晴らしい最初の投稿!これはまさにゴルフの提案ですべきことですが、十分な担当者ではありません。
Rɪᴋᴇʀ

1
PPCGへようこそ!そして、私は_EasterlyIrk_、素晴らしい最初の投稿に同意します。私はもっ​​とゴルフに何かを見つけようとしましたが、見つけることができませんでした。すでに見たことがあるかもしれませんが、Javaでのゴルフのヒントを読むのは面白いかもしれません。再び歓迎し、あなたの滞在をお楽しみください。
ケビンCruijssen


2

sed(-rnの場合は82 + 2)84

s,^,\n,;:l;N;s,\n\n,\n,;:
s,^([^\n]*)\n(.)([^\n]*\n)1,\1\2\n\3,
t;P;s,^[^\n]*,,;tl

入力の最初の行は文字列です。それ以降の各行は、単項の部分文字列のサイズです。

例:

$ cat test.txt:
lexicographically
11
11
11
1111111
1111

$ cat hold | sed -rnf sed.txt
le
xi
co
graphic
ally

2

CJam、11バイト

lq~{/(ns}/;

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

説明

l    e# Read input string.
q~   e# Read array of lengths and eval.
{    e# For each length...
  /  e#   Split the string into chunks of the given size.
  (  e#   Pull off the first chunk.
  n  e#   Print with linefeed.
  s  e#   Flatten the remaining chunks into a single string again.
}/
;    e# Discard any remainder of the input string.

2

C、81バイト

i,j;f(s,l,k)char*s;int*l;{for(i=j=0;i<k;){write(1,s+j,l[i]);puts("");j+=l[i++];}}

write()出力はバッファリングされないため、どのオンラインコンパイラでもこれを出力するのは困難です。

test.c

i,j;f(s,l,k)char*s;int*l;{for(i=j=0;i<k;){write(1,s+j,l[i]);puts("");j+=l[i++];}}
main(){
    int l[]={3,2,3};
    f("Hello, World!",l,3);
    int ll[]={2,1,3};
    f("abcdefghijk",ll,3);
    int lll[]={4,1};
    f("Code Golf",lll,2);
    int llll[]={3};
    f("Ayyy",llll,1);
    int lllll[]={2,2,2,7,4};
    f("lexicographically",lllll,5);
}

配管なしの出力:

Hel
lo
, W
ab
c
def
Code

Ayy
le
xi
co
graphic
ally

ideoneコンパイラでは、上記のcプログラムの出力は[最初の関数を画面の最高点にコピーする]は、「こんにちは、WabcdefCode Ayylexicographically」であり、「\ n」はありません
...-RosLuP

2

PHP、98バイト

<?php
$b=$argv[1];foreach(explode(',',$argv[2])as$a){echo(substr($b,0,$a).' ');$b=substr($b,$a);}

使用法:

php chainification.php lexicographically 2,2,2,7,4


出力:

le xi co graphic ally


PHPにはおそらくより良い解決策があります。


2

PHP、82バイト

<?php for($s=$argv[++$i],$j=-1;$n=$argv[++$i];){for(;$n--;)echo$s[++$j];echo"
";}

入力を文字列として、次に数値のリストを受け取り、出力は改行で区切られます。例えば

php chainify.php lexicographically 2 2 2 7 4

あなたが-rで$ argvを使用できる人の1人であれば、開始タグに使用される6バイトを保存できます。


の使用について混乱しています$argv[++$i]。なぜない$argv[1]$argv[2]
MonkeyZeus

また、sandbox.onlinephpfunctions.comで PHP 7.0.2を使用して、3秒の時間制限に
到達しました-MonkeyZeus

それ$argv[2]は、サポートされている引数を反復処理する必要があるからで$argv[++$i]はなく、aの必要性を避けて,$i=12バイトを節約するのは初めてだからです。
user59178

2

PHP、63バイト

<?foreach($_GET[a]as$p){echo" ".substr($_GET[s],$s,$p);$s+=$p;}

配列85バイトとして出力

<?foreach($_GET["a"]as$p){$o[]=substr($_GET["s"],$s,$p);$s+=$p;}echo json_encode($o);

1

Pyth、7バイト

PcwsM._

改行で区切られた入力を受け取ります。文字列はエスケープされず、配列の後に続きます。 オンラインでお試しください!

説明:

     ._  Get all prefixes of Q
   sM    Map sum across each of these prefixes (to get the total indices)
 cw      Split the string at these locations
P        Remove the last "remainder" of the string

1

オクターブ/ MATLAB、31バイト

@(s,a)mat2cell(s(1:sum(a)),1,a)

これは、入力のある無名関数sです:文字列; a:数値配列。

Ideoneでお試しください

説明

これは私のMATL回答の移植版です。

s(1:sum(a))        % Take first n characters of string s, where n is the sum of array a
mat2cell(...,1,a)  % Split into pieces of lengths given by a and store in a cell array

1

Java 142バイト

public static String[]substringChain(String s,int[]i){
  String[]r=new String[i.length];
  for(int j=-1;++j<i.length;){
    r[j]=s.substring(0,i[j]);
    s=s.substring(i[j]);
  }
  return b;
}

ゴルフ:

String[]s(String s,int[]i){String[]r=new String[i.length];for(int j=-1;++j<i.length;){r[j]=s.substring(0,i[j]);s=s.substring(i[j]);}return b;}

1

Awk、36文字

{FIELDWIDTHS=$0;OFS=RS;getline}$1=$1

サンプル実行:

bash-4.3$ awk '{FIELDWIDTHS=$0;OFS=RS;getline}$1=$1' <<< $'3 2 3\nHello, World!'
Hel
lo
, W

実際には、このように使用しますが、スコアの計算方法はわかりません。

bash-4.3$ awk -vFIELDWIDTHS='3 2 3' -vOFS='\n' '$1=$1' <<< 'Hello, World!'
Hel
lo
, W


1

GNU sed、55 + 2(rnフラグ)= 57バイト

1H;1d;G;:;s=.(\n.*)\n(.)=\1\2\n=;t;s=.==;P;s=[^\n]*==;h

オンラインでお試しください!(sedを追加してくれた@Dennisに感謝)

説明:入力ストリングは最初の行にあり、数値は単項で、その後の別の行になければなりません。サイクルの開始時に新しい行が暗黙的に読み取られ、毎回スクリプトが実行されます。

1H;1d                       # once: append string to hold space and start new cycle
                            #Initially, the hold space contains an useful '\n'.
G                           # append hold space to pattern space. The pattern space
                            #format will be: 'UNARY\n\nSTRING'.
:;s=.(\n.*)\n(.)=\1\2\n=;t  # iteratively remove a char from the string, as many
                            #times as unary chars, and store it on 2nd pattern line
s=.==;P                     # remove '\n', then print the new top line
s=[^\n]*==;h                # delete up to '\n' and update hold space

テスト実行: EOFを終了マーカーとして使用したヒアドキュメントを使用する

sed -rnf program.sed << EOF
> abcdefghijk
> 00
> 0
> 000
> EOF

出力:

ab
c
def

1

Vimscript、79 78バイト

あまりきれいではありませんが、改善できると確信しています...

vimバッファーを取得し、呼び出しechom string(A([2,3]))て出力を確認します

fu A(l)
let r=[]
for i in a:l
exe "norm d".i."l"
let r+=[@"]
endfo
retu r
endf

私は実際に文字列 をだまして出力することを考えました["abc", "def"]...しかし、私は抵抗しました:P

説明:各配列項目の文字数を削除し(デフォルトのレジスターに入れ)、配列に追加しrます...退屈な答えです。


1

Common Lisp、78 76バイト

匿名関数が許可されていると仮定します:

(lambda(s l)(loop for x in l as y = x then(+ y x)collect(subseq s(- y x)y)))

使用法

(funcall #'(lambda(s l)(loop for x in l as y = x then(+ y x)collect(subseq s(- y x)y)))"AbCdefGhijK"'(3 2 3))

出力

("AbC" "de" "fGh")

-のas代わりにandy定義を変更して、2つの変数間の括弧に収まるように-2バイト(subseq ...)


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