แยกสตริงออกเป็น n ส่วน (หรือส่วนของความยาว n)


11

ความท้าทาย

ในการท้าทายนี้คุณต้องทำงานสองอย่างที่แตกต่างกัน (แต่เกี่ยวข้องกัน) ขึ้นอยู่กับลำดับของอินพุต
โปรแกรมของคุณจะรับสตริงsและจำนวนเต็มnเป็นอินพุตและจะ

  • แบ่งออกsเป็นชิ้นยาวnถ้าsมาก่อน องค์ประกอบสุดท้ายจะสั้นลงหากจำเป็น
  • แบ่งออกsเป็นnชิ้นยาวเท่ากันถ้าnมาก่อน หากlen(s)ไม่ใช่หลายองค์ประกอบnแรกlen(s) mod nจะเป็นอีกต่อไป

คุณสามารถรับอินพุตทั้งสองนี้ได้เท่านั้น sจะไม่ประกอบด้วยตัวเลขเท่านั้น

หมายเหตุ

  • คุณสามารถใช้การทำแผนที่ย้อนกลับ โปรดสังเกตสิ่งนี้ในคำตอบของคุณหากคุณทำเช่นนั้น
  • sจะมีอักขระ ASCII ที่พิมพ์ได้เท่านั้น(ไม่มีบรรทัดใหม่)
  • คุณไม่สามารถใช้บิวอินใด ๆ ที่แก้ปัญหาทั้งสองงานได้โดยตรง อนุญาตบิวด์อื่นทั้งหมด
  • คุณต้องรับทั้งอาร์กิวเมนต์จากแหล่งเดียวกัน
  • คุณอาจรับข้อโต้แย้งในรายการที่สั่งซื้อหรือรูปแบบอื่นใดที่ระบุคำสั่งของพวกเขาได้อย่างชัดเจนตราบใดที่ยังไม่คลุมเครือ
  • คุณอาจรับอินพุตเป็นหนึ่งสตริง / สตรีมและใช้อักขระที่ไม่ใช่อินพุตที่ถูกต้อง (เช่น nullbyte) เพื่อแยกพวกเขา
  • nจะเท่ากับหรือน้อยกว่าความยาวของsและมากกว่าศูนย์
  • คุณสามารถส่งออกรายการผลลัพธ์ในรูปแบบที่เป็นกันเองตราบใดที่มันระบุอย่างชัดเจนถึงชิ้นส่วนและคำสั่งของพวกเขา

ตัวอย่าง

การป้อนข้อมูล: programming, 3
องค์ประกอบสุดท้ายมีเพียง 2 ตัวอักษรเพราะ 11 ไม่หารด้วย 3.
เอาท์พุท: ["pro", "gra", "mmi", "ng"]

อินพุต: 3, programming
11 ไม่ได้เป็นหลายเท่าของ 3 ดังนั้นองค์ประกอบ 2 รายการแรกจะเป็นอีกต่อไป:
เอาต์พุต: ["prog", "ramm", "ing"]

กฎระเบียบ

กรณีทดสอบ

กรณีทดสอบสร้างขึ้นด้วยโปรแกรม Pyth นี้ (ใช้ builtins ดังนั้นจึงไม่มีคำตอบที่ถูกต้อง) ขอบคุณ @FryAmTheEggman ที่ให้บริการเวอร์ชั่นพื้นฐานของสิ่งนั้น!

3, helloworld -> ['hell', 'owo', 'rld']
helloworld, 3 -> ['hel', 'low', 'orl', 'd']
1, การเขียนโปรแกรม -> ['การเขียนโปรแกรม']
การเขียนโปรแกรม 1 -> ['p', 'r', 'o', 'g', 'r', 'a', 'm', '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']
code golf, 9 -> ['code golf']
4, 133tspeak -> ['133', 'ts', 'pe', 'ak']
133tspeak, 4 -> ['133t', 'spea', 'k']

Happy Coding!


คุณไม่สามารถใช้บิวอินใด ๆ ที่แก้ปัญหาทั้งสองงานได้ นั่นรวมถึงบิวด์อินอื่น ๆ เช่นนั้นรับอักขระ n-th ทุกตัวจากสตริงหรือแยกที่เกิดขึ้นหรือไม่
เดนนิส

@Dennis นี่เป็นเพียงความตั้งใจที่จะแยกแยะบิวด์อินที่แก้ปัญหานี้โดยตรง ฉันชี้แจง
Denker

หากภาษาของเราไม่รองรับอาเรย์เราควรจะส่งออกอย่างไร จะมีการขึ้นบรรทัดใหม่ระหว่างผลลัพธ์แต่ละรายการของสตริงหรือไม่
Conor O'Brien

นอกจากนี้สำหรับภาษาที่อินพุตเป็นอาเรย์ของตัวเลขที่คลุมเครือขั้นตอนควรเป็นอย่างไร
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴไม่สามารถเกิดขึ้นได้ s ไม่เคยจะมีตัวเลขเท่านั้น นอกจากนี้คุณสามารถส่งออกรายการผลลัพธ์ในรูปแบบที่เป็นกันเองตราบใดที่มันระบุอย่างชัดเจนถึงชิ้นส่วนเฉพาะและคำสั่งของพวกเขาที่มีเอาท์พุทหลายบรรทัดแน่นอน
Denker

คำตอบ:


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

Unprintables เหล่านั้นคืออะไรที่ปรากฏในตอนท้ายขององค์ประกอบบางรายการ? สิ่งเหล่านี้ไม่ใช่ส่วนของอินพุตดังนั้นจึงไม่ควรเป็นส่วนหนึ่งของเอาต์พุตเช่นกัน
Denker

ไม่ใช่eสิ่งต้องห้ามในตัวใช่หรือไม่
FliiFe

อาจแทนที่XUZN?...ด้วยU?...และสลับทั้งสองifสาขา นอกจากนี้คุณไม่จำเป็นต้องใช้3$
Luis Mendo

@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

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


วัตถุ Regex ใน Ruby สามารถมีค่าที่แทรกเข้าไปได้เช่นเดียวกับที่สายสามารถx.scan(/.{,#{y}})ทำงานได้เช่นกันเพื่อแยกสตริงในกรณีแรก หรือว่านับเป็น builtin?
หมึกมูลค่า

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เห็นสตริงเป็นตัวเลขนั้นและรายการที่สองเป็นสตริง

ตกลง ... แก้ไขปัญหาตัวเลข แต่เพิ่ม 9 ไบต์ :(

ทำใหม่เล็กน้อยเพื่อบันทึกสองสามไบต์

เกือบกลับสู่ความยาวดั้งเดิม :)


ตกลง @DenkerAffe แก้ไขให้ทำงานโดยทั่วไปและเพิ่มเพียง 1 ไบต์เท่านั้น (ในที่สุด)
Robert Benson

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/ สตริง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

เป็นหนี้อะไร
Benjamin Urquhart

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

ฉันเปิดรับแนวทางใหม่อย่างจริงจัง ฉันใหม่กับงูหลามดังนั้นฉันจึงอาจพลาดชวเลขไม่กี่

ฉันหมายความว่าฉันคิดว่าคำตอบของฉันแยกจากจุดที่ยาวกว่าคำตอบจาวาสคริปต์ ...


คุณสามารถให้อินพุตตัวอย่างและเอาต์พุตได้หรือไม่?
แม่ชีที่รั่ว

หมายเหตุ: testcasesการแก้ปัญหาอย่างเป็นทางการภายใต้ส่วนหัว ชุดทดสอบถูกสร้างขึ้นโดย Pyth วิธีการแก้ปัญหาคือ.xcsJKcJsKที่ไหนJและKเป็นสองข้อโต้แย้ง
แม่ชีที่รั่ว

@KennyLau ฉันได้เพิ่มลิงก์ไปยังล่าม pyth ออนไลน์ น่าแปลกที่มันจะแสดงผลอินพุตเช่นกันในขณะที่ฉันแน่ใจว่ามันไม่ได้เมื่อวานนี้ ...
FliiFe

ใช้ช่องว่างเพื่อระงับการพิมพ์
Leaky Nun

@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),"
";
  • สตริงไม่ควรเริ่มต้นด้วยตัวเลข
    (แทนที่+@$pด้วยis_numeric($p)เพื่อแก้ไข)
  • ผลลัพธ์ไม่ควรประกอบด้วยอัน "0"
    (แทรก~สำหรับ ASCII ที่พิมพ์ได้สำหรับ ASCII a&ใด ๆ ก่อนที่$t;จะแก้ไข)
  • ทำงานด้วย-nrหรือลองออนไลน์

0

PowerShell , 122 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.