Chainifikasi Substring

27

pengantar

Untuk contoh ini, mari kita ambil string Hello, World!dan array [3, 2, 3]. Untuk menemukan rantai substring, kami melalui proses berikut:

Angka pertama array adalah 3, jadi kami mendapatkan substring [0 - 3], yaitu Hel. Setelah itu, kami menghapus 3karakter pertama dari string awal, yang menyisakan kami lo, World!.

Angka kedua dari array adalah 2, jadi kita mendapatkan substring [0 - 2]dari string baru kita, yang memberi kita lo. String sisa menjadi , World!.

Angka terakhir adalah a 3, yang memberi kita , W. The chain substring adalah semua substring gabungan, yang memberi kami:

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

Untuk contoh yang lebih visual:

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

Tugas

Mengingat sebuah non-kosong string yang dan sebuah non-kosong array yang hanya terdiri dari bilangan bulat positif ( > 0), output rantai substring . Anda dapat mengasumsikan bahwa jumlah semua bilangan bulat dalam array tidak melebihi panjang string.

Anda juga dapat mengasumsikan bahwa string tidak akan pernah mengandung baris baru.

Uji kasus

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

Ini adalah , jadi pengiriman dengan jumlah byte terkecil menang!

Adnan
sumber

Jawaban:

33

05AB1E , 1 byte

£

Ini adalah perintah substring (0, N).
Diterapkan pada daftar ini berfungsi berulang kali pada sisa pada string.

Cobalah online!

Emigna
sumber
9
Tidak bisa mengalahkan itu
Steven H.
12

Python 2, 42 byte

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

Terkadang Anda melakukannya dengan cara yang membosankan.

Tidak
sumber
Sejauh ini jawaban terpendek dari jawaban python yang terlalu banyak
Cyoce
Yah, rupanya aku terlalu memikirkannya, haha ​​...
DJMcMayhem
8

Brachylog , 20 13 byte

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

Cobalah online!

Ini sangat tidak efisien dan waktu habis pada TIO untuk test case terakhir.

Penjelasan

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

Versi yang sedikit lebih efisien, 15 byte

t: {~ l} a.,? h @ [~ c

Fatalisasi
sumber
8

Python 3, 45 byte

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

Ini mencetak satu substring per baris dan berakhir dengan kesalahan ketika a habis.

Mengujinya pada repl.it .

Dennis
sumber
2
Sungguh cara yang bagus untuk menyelinap dalam cetakan!
xnor
7

Python, 52 , 46 byte

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

Fungsi lambda rekursif.

Terima kasih kepada Dennis karena telah memangkas 6 byte!

DJMcMayhem
sumber
7

Jelly , 6 byte

Jx$ĠịY

Cobalah online!

        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.
Lynn
sumber
5

Haskell, 34 byte

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

Contoh penggunaan: "lexicographically" # [2,2,2,7,4]->["le","xi","co","graphic","ally"]

Rekursi sederhana.

Atau solusi 29 byte yang membosankan melalui built-in:

import Data.Lists
splitPlaces
nimi
sumber
5

Ruby, 26 byte

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

String direpresentasikan sebagai array karakter.

m-chrzan
sumber
4

PowerShell v2 +, 46 byte

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

Mengambil input string $adan array $b, lilitkan $b. Setiap iterasi, melakukan irisan array $aberdasarkan $i(default ke $null, atau 0) dan nomor saat ini. Perlu melakukan -1dan $i++karena string di PowerShell diindeks nol.

Contohnya

(Output di sini dipisahkan oleh ruang, karena itulah metode stringifikasi default untuk array)

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
AdmBorkBork
sumber
4

Perl, 28 byte

Termasuk +1 untuk -n

Jalankan dengan string input pada STDIN diikuti oleh setiap nomor pada baris yang terpisah:

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

Hanya kode:

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

Versi 23 byte tanpa ||"^"juga semacam karya, tetapi mencetak baris trailing palsu palsu

"^"dapat diganti dengan $_jika string tidak mengandung karakter meta regex

Ton Hospel
sumber
3

MATL , 8 byte

ys:)1bY{

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
3

JavaScript (ES6), 39 38 35 byte

Disimpan 3 byte berkat produk ETH:

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

Contoh:

//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" ]


Solusi sebelumnya:
38 byte berkat Huntro:

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

39 byte:

(s,a)=>a.map(v=>s.substr(t,v,t+=v),t=0)
Hedi
sumber
1
Anda dapat menyimpan satu byte dengan
mengeringkan
2
.slicemenghemat beberapa byte:s=>a=>a.map(v=>s.slice(t,t+=v),t=0)
ETHproduksi
3

Batch, 74 byte

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

Saya mengalahkan C? Ini tidak mungkin benar! Mengambil string pada STDIN dan array sebagai argumen baris perintah.

Neil
sumber
3

Java, 119 Bytes

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

Golf:

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

Saya mengubah jawaban Roman Gräf ( /codegolf//a/93992/59935 ), tetapi saya tidak punya cukup perwakilan untuk berkomentar.

Saya mengubah implementasi loop dan bukannya mengatur string sumber ke substring lain di setiap iterasi, saya hanya mengubah indeks yang saya dapatkan substring.

mrco
sumber
2
Selamat datang di PPCG! Pos pertama yang bagus! Ini persis apa yang harus Anda lakukan dengan saran golf, tetapi tidak cukup perwakilan.
Rɪᴋᴇʀ
1
Selamat datang di PPCG! Dan saya setuju dengan _EasterlyIrk_ , posting pertama yang bagus. Saya mencoba mencari sesuatu untuk bermain golf lebih banyak, tetapi tidak bisa. Mungkin Anda sudah pernah melihatnya, tetapi Anda mungkin menemukan Tips bermain golf di Jawa menarik untuk dibaca. Sekali lagi selamat datang, dan nikmati masa tinggal Anda.
Kevin Cruijssen
2

sed (82 + 2 untuk -rn) 84

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

Baris input pertama adalah string. Kemudian setiap baris setelah itu adalah ukuran substring di unary .

Contoh:

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

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

CJam , 11 byte

lq~{/(ns}/;

Cobalah online!

Penjelasan

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.
Martin Ender
sumber
2

C, 81 byte

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

Karena write()output tidak buffered, kompiler online mana pun akan kesulitan mengeluarkan ini.

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

Output tanpa perpipaan:

Hel
lo
, W
ab
c
def
Code

Ayy
le
xi
co
graphic
ally
betseg
sumber
dalam ideone compiler l'output program c di atas [mengatasi fungsi pertama semakin tinggi di layar] adalah "Halo, WabcdefCode Ayylexicographically" tanpa "\ n" ...
RosLuP
2

PHP, 98 Bytes

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

Pemakaian:

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


Keluaran:

le xi co graphic ally


Mungkin ada solusi yang lebih baik dengan PHP.

jrenk
sumber
2

PHP, 82 Bytes

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

Mengambil input sebagai string dan kemudian daftar angka, output dipisahkan oleh baris baru. misalnya

php chainify.php lexicographically 2 2 2 7 4

Jika Anda salah satu dari orang-orang yang dapat menggunakan $ argv dengan -r Anda dapat menyimpan 6 byte yang digunakan untuk tag pembuka.

pengguna59178
sumber
Saya bingung tentang penggunaan $argv[++$i]. Kenapa tidak $argv[1]dan $argv[2]?
MonkeyZeus
Juga, menggunakan PHP 7.0.2 di sandbox.onlinephpfunctions.com Saya mencapai batas waktu 3 detik
MonkeyZeus
itu bukan $argv[2]karena kita perlu mengulangi argumen yang sudah ada dan ini adalah $argv[++$i]pertama kalinya untuk menghindari kebutuhan untuk ,$i=1dan karenanya menghemat 2 byte.
user59178
2

PHP, 63 Bytes

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

Output sebagai Array 85 Bytes

<?foreach($_GET["a"]as$p){$o[]=substr($_GET["s"],$s,$p);$s+=$p;}echo json_encode($o);
Jörg Hülsermann
sumber
1

Pyth, 7 byte

PcwsM._

Mengambil input yang dipisahkan oleh baris baru, dengan string tidak terhapus dan datang setelah array. Cobalah secara Online!

Penjelasan:

     ._  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
Steven H.
sumber
1

Oktaf / MATLAB, 31 byte

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

Ini adalah fungsi anonim dengan input s: string; a: array numerik.

Cobalah di Ideone .

Penjelasan

Ini adalah port dari jawaban MATL saya.

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
Luis Mendo
sumber
1

Java 142 byte

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

Golf:

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;}
Roman Gräf
sumber
1

Awk, 36 karakter

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

Contoh dijalankan:

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

Dalam kehidupan nyata saya akan menggunakannya seperti ini, hanya tidak tahu bagaimana menghitung nilainya:

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

Dyalog APL 16.0, 15 karakter (tidak bersaing); 15.0, 17 byte

Solusi 16.0

{⍵⊆⍨(⍴⍵)↑⍺/+\⍺}

Dyalog APL 16.0 menambahkan primitif partisi APL2 ,, dengan mesin terbang .

Solusi 15.0:

{(-⍺)↑¨(+\⍺)↑¨⊂⍵}

TryAPL online!

Adám
sumber
1

GNU sed, 55 + 2 (rn flags) = 57 byte

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

Cobalah online! (terima kasih kepada @Dennis karena menambahkan sed)

Penjelasan: String input harus berada pada baris pertama dan angka-angka, secara unary , pada baris yang terpisah setelah itu. Baris baru dibaca secara implisit pada awal siklus, menjalankan skrip setiap kali.

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

Uji coba: menggunakan dokumen di sini dengan EOF sebagai penanda akhir

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

Keluaran:

ab
c
def
seshoumara
sumber
1

Vimscript, 79 78 byte

tidak terlalu cantik, saya yakin itu bisa diperbaiki ...

Mengambil buffer vim, lalu menelepon echom string(A([2,3]))untuk melihat hasilnya

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

Saya benar-benar berpikir untuk menipu dan menghasilkan string ["abc", "def"] ... Tapi saya menolak: P

Penjelasan: Hapus (masukkan dalam daftar default) setiap array item jumlah karakter dan menambahkannya ke array r... Jawaban yang memang membosankan.

Christian Rondeau
sumber
1

Common Lisp, 78 76 byte

Dengan asumsi fungsi anonim diperbolehkan:

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

Pemakaian

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

Keluaran

("AbC" "de" "fGh")

-2 byte dengan menggunakan asalih-alih anddan mengubah definisi y agar sesuai dengan tanda kurung antara dua variabel dalam(subseq ...)


sumber
1

Rebol, 38 byte

func[s b][map-each n b[take/part s n]]
draegtun
sumber