การย่อยสายย่อย


27

บทนำ

สำหรับตัวอย่างนี้เรามาดูสตริงHello, World!และอาร์เรย์[3, 2, 3]กัน ในการค้นหา substring chain เราจะทำตามขั้นตอนต่อไปนี้:

หมายเลขแรกของอาร์เรย์คือ3เพื่อให้เราได้รับอักขระย่อยซึ่งเป็น[0 - 3] Helหลังจากนั้นเราจะลบ3อักขระตัวแรกออกจากสตริงเริ่มต้นซึ่งปล่อยเราlo, World!ไว้

ตัวเลขที่สองของอาร์เรย์คือ2เพื่อให้เราได้รับอักขระย่อยจากสตริงใหม่ของเราซึ่งจะช่วยให้เรา[0 - 2] สตริงที่เหลือจะกลายเป็นlo, World!

จำนวนสุดท้ายคือซึ่งจะช่วยให้เรา3 ห่วงโซ่ substringคือทั้งหมดของสตริงรวมกันซึ่งจะช่วยให้เรา:, 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:]

บางครั้งคุณก็ทำแบบที่น่าเบื่อ


จนถึงตอนนี้คำตอบของงูหลามที่สั้นที่สุด
Cyoce

เห็นได้ชัดว่าฉันคิดมากฮ่าฮ่า ...
DJMcMayhem

8

Brachylog , 20 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} ที่ H @ [~ ค


8

Python 3, 45 ไบต์

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

พิมพ์นี้หนึ่ง substring ต่อบรรทัดและสิ้นสุดลงด้วยข้อผิดพลาดเมื่อหมด

ทดสอบบนrepl.it


2
ช่างเป็นวิธีที่ยอดเยี่ยมในการพิมพ์!
xnor

7

Python, 52 , 46 ไบต์

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

ฟังก์ชั่นแลมบ์ซ้ำแบบเรียกซ้ำได้

ขอบคุณเดนนิสที่ช่วยกำจัด 6 ไบต์!



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ตาม$i(ค่าเริ่มต้น$nullหรือ0) และหมายเลขปัจจุบัน จำเป็นต้องทำ-1และ$i++เพราะสตริงใน PowerShell นั้นไม่มีดัชนี

ตัวอย่าง

(เอาต์พุตที่นี่คั่นด้วยช่องว่างเนื่องจากเป็นวิธีการสร้างสตริงเริ่มต้นสำหรับอาร์เรย์)

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 ไบต์ที่ไม่มีการ||"^"เรียงลำดับ แต่พิมพ์บรรทัดใหม่ต่อท้ายปลอม

"^"สามารถถูกแทนที่ด้วย$_หากสตริงไม่มีอักขระเมตาของ regex


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 ไบต์

บันทึก 3 ไบต์ด้วย ETHproductions:

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


โซลูชันก่อนหน้า:
38 ไบต์ขอบคุณ Huntro:

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
คุณสามารถบันทึกหนึ่งไบต์โดย currying
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;}

ฉันแก้ไขคำตอบของ Roman Gräf ( /codegolf//a/93992/59935 ) แต่ฉันมีตัวแทนไม่เพียงพอที่จะแสดงความคิดเห็น

ฉันเปลี่ยนการใช้ลูปและแทนที่จะตั้งค่าสตริงต้นทางเป็นซับสตริงอื่นในการวนซ้ำทุกครั้งฉันแค่เปลี่ยนดัชนีที่ฉันได้รับซับสตริง


2
ยินดีต้อนรับสู่ PPCG! โพสต์แรกสุดยอด! นี่คือสิ่งที่คุณควรทำกับคำแนะนำกอล์ฟ แต่ตัวแทนไม่เพียงพอ
Rɪᴋᴇʀ

1
ยินดีต้อนรับสู่ PPCG! และฉันเห็นด้วยกับ_EasterlyIrk_ซึ่งเป็นโพสต์แรกที่ยอดเยี่ยม ฉันพยายามหาสิ่งที่จะเล่นกอล์ฟมากกว่านี้ แต่ทำไม่ได้ บางทีคุณอาจเคยเห็นมันมาแล้ว แต่คุณอาจพบเคล็ดลับสำหรับการเล่นกอล์ฟใน Java ที่น่าสนใจในการอ่าน ยินดีต้อนรับอีกครั้งและเพลิดเพลินกับการเข้าพักของคุณ
Kevin Cruijssen


2

sed (82 + 2 สำหรับ -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

บรรทัดแรกของอินพุตคือสตริง จากนั้นแต่ละบรรทัดหลังจากนั้นคือขนาดของสตริงย่อยในส่วนเอก

ตัวอย่าง:

$ 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 เอาท์พุทคอมไพเลอร์แมงของโปรแกรมคด้านบน [รับมือฟังก์ชั่นแรกสูงมากขึ้นในหน้าจอ] คือ "สวัสดี 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

หากคุณเป็นหนึ่งในคนเหล่านั้นที่สามารถใช้ $ argv ด้วย -r คุณสามารถบันทึก 6 ไบต์ที่ใช้สำหรับแท็กเปิด


$argv[++$i]ฉันกำลังสับสนเกี่ยวกับการใช้งานของ ทำไมไม่$argv[1]และ$argv[2]?
MonkeyZeus

นอกจากนี้การใช้ PHP 7.0.2 ที่sandbox.onlinephpfunctions.comฉันใช้เวลาถึง 3 วินาที
MonkeyZeus

ไม่ใช่$argv[2]เพราะเราจำเป็นต้องทำซ้ำผ่านอาร์กิวเมนต์ที่มีการเพิ่มระดับและมันเป็น$argv[++$i]ครั้งแรกที่จะหลีกเลี่ยงความต้องการ a ,$i=1และประหยัด 2 ไบต์
user59178

2

PHP, 63 ไบต์

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

เอาต์พุตเป็น Array 85 Bytes

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

1

Pyth, 7 ไบต์

PcwsM._

รับอินพุตแยกจากกันโดยขึ้นบรรทัดใหม่ด้วยสตริงที่ไม่ได้ใช้ Escape และมาหลังอาเรย์ ลองออนไลน์!

คำอธิบาย:

     ._  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: string; 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

อ๊ะ 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

ลองออนไลน์! (ขอบคุณ @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

ทดสอบการทำงาน:ใช้ here-document กับ EOF เป็น marker marker

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

เสียงกระเพื่อมสามัญ, 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")

-2 ไบต์โดยใช้asแทนandและเปลี่ยนนิยาม y เพื่อให้พอดีกับวงเล็บระหว่างสองตัวแปรใน(subseq ...)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.