แบ่งสตริง


23

ท้าทาย

รับสตริงและตัวเลขแบ่งสตริงออกเป็นส่วนขนาดเท่ากันจำนวนมาก ตัวอย่างเช่นถ้าจำนวน 3 คุณควรแบ่งสตริงออกเป็น 3 ชิ้นไม่ว่าสตริงจะยาวแค่ไหน

หากความยาวของสตริงไม่ได้แบ่งเท่า ๆ กันตามจำนวนที่ระบุคุณควรปัดเศษขนาดของแต่ละชิ้นแล้วส่งกลับสตริง "เศษที่เหลือ" ตัวอย่างเช่นหากความยาวของสตริงอินพุตเท่ากับ 13 และตัวเลขคือ 4 คุณควรส่งคืนสี่สตริงแต่ละขนาด 3 รวมกับสตริงส่วนที่เหลือขนาด 1

หากไม่มีเศษเหลือคุณอาจไม่คืนค่าหรือคืนค่าสตริงว่าง

หมายเลขที่ให้นั้นรับประกันว่าจะน้อยกว่าหรือเท่ากับความยาวของสตริง ตัวอย่างเช่นอินพุต"PPCG", 7จะไม่เกิดขึ้นเพราะ"PPCG"ไม่สามารถแบ่งออกเป็น 7 สตริง (ฉันคิดว่าผลลัพธ์ที่เหมาะสมจะเป็น(["", "", "", "", "", "", ""], "PPCG")มันง่ายกว่าที่จะไม่อนุญาตให้ป้อนข้อมูลนี้)

ตามปกติ I / O ยืดหยุ่นได้ คุณอาจส่งคืนสตริงและสตริงที่เหลือหรือหนึ่งรายการของสตริงที่มีส่วนที่เหลือในตอนท้าย

กรณีทดสอบ

"Hello, world!", 4 -> (["Hel", "lo,", " wo", "rld"], "!") ("!" is the remainder)
"Hello, world!", 5 -> (["He", "ll", "o,", " w", "or"], "ld!")
"ABCDEFGH", 2 -> (["ABCD", "EFGH"], "") (no remainder; optional "")
"123456789", 5 -> (["1", "2", "3", "4", "5"], "6789")
"ALABAMA", 3 -> (["AL", "AB", "AM"], "A")
"1234567", 4 -> (["1", "2", "3", "4"], "567")

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาจะเป็นผู้ชนะ

คะแนนโบนัส (ไม่ใช่จริงๆ😛) สำหรับการแก้ปัญหาของคุณใช้ตัวดำเนินการหารภาษาของคุณ


1
คะแนนโบนัส? โอ้ฉันต้องทำอย่างนี้
Matthew Roh

สำหรับโบนัส, Jelly, 3 ไบต์;⁹/
Jonathan Allan

เกี่ยวข้องแต่ไม่มีส่วนใดเลยที่เหมือนกับความท้าทายนี้
musicman523

ที่จะทำให้มันชัดเจนโปรดเพิ่ม testcase PPCG, 7เพื่อให้ส่วนที่เหลือคือPPCG
JörgHülsermann

@ JörgHülsermannอินพุตไม่ได้รับอนุญาต ฉันได้เพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับประเภทของอินพุตนั้นและจัดรูปแบบใหม่เพื่อให้ชัดเจนยิ่งขึ้น
musicman523

คำตอบ:




5

Pip , 21 ไบต์

โค้ด 20 ไบต์, +1 สำหรับการ-nตั้งค่าสถานะ

a~C(#a//b*XX)XbP$$$'

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง เอาต์พุตสตริงและส่วนที่เหลือคั่นด้วยบรรทัดใหม่ ลองออนไลน์!

คำอธิบาย

สนุกกับการทำงานของ regex!

ลองมาabcdefgเป็นสตริงของเราและ3เป็นจำนวนของเรา เราสร้าง regex (.{2})(.{2})(.{2})ซึ่งจับคู่สามตัวละครสองตัวและเก็บไว้ในกลุ่มการจับสามกลุ่ม จากนั้นใช้ตัวแปรแข่งขัน regex Pip ของเราสามารถพิมพ์ 1) รายชื่อของกลุ่มการจับภาพ["ab";"cd";"ef"]และ 2) "g"ส่วนที่เหลือของสตริงที่ไม่ได้จับคู่

                      a,b are cmdline args; XX is the regex `.` (match any one character)
    #a//b             Len(a) int-divided by b: the length of each chunk
         *XX          Apply regex repetition by that number to `.`, resulting in something
                        that looks like `.{n}`
  C(        )         Wrap that regex in a capturing group
             Xb       Repeat the whole thing b times
a~                    Match the regex against a
               P$$    Print $$, the list of all capture groups (newline separated via -n)
                  $'  Print $', the portion of the string after the match

5

Haskell , 62 ไบต์

#เป็นโอเปอเรเตอร์ที่รับ a Stringและa Intและคืนค่ารายการStrings

"Hello, world!"#4ใช้เป็น

s#n|d<-length s`div`n=[take(d+n*0^(n-i))$drop(i*d)s|i<-[0..n]]

ลองออนไลน์!

มันทำงานอย่างไร

  • sเป็นสตริงอินพุตและnเป็นจำนวนของชิ้นส่วนที่ไม่เหลือ
  • dคือความยาวของชิ้นส่วน "ปกติ" แต่ละชิ้น divเป็นการหารจำนวนเต็ม
  • รายการความเข้าใจสร้างn+1ชิ้นส่วนที่เหลือเป็นครั้งสุดท้าย
    • iวนซ้ำจาก0ถึงnรวม
    • สำหรับแต่ละชิ้นส่วนแรกจำนวนที่ถูกต้อง ( i*d) ของตัวละครเริ่มต้นคือdropped จากจุดเริ่มต้นของsจากนั้นสตริงย่อยเริ่มต้นคือtaken จากผล
    • ความยาวซับสตริงที่ถ่ายควรเป็นdยกเว้นชิ้นส่วนที่เหลือ
      • ส่วนที่เหลือจริงจะต้องสั้นกว่าnมิฉะนั้นชิ้นส่วนปกติจะยาวขึ้นแทน
      • takeส่งคืนสตริงทั้งหมดหากความยาวที่กำหนดมีขนาดใหญ่เกินไปดังนั้นเราจึงสามารถใช้ตัวเลขใดก็ได้>=n-1สำหรับส่วนที่เหลือ
      • การแสดงออกd+n*0^(n-i)ให้dถ้าi<nและถ้าd+n i==nมันใช้ว่า0^xเป็น1เมื่อx==0แต่ถ้า0x>0

ฉันจะต้องดูว่าฉันสามารถใช้ความเข้าใจในรายการได้ที่ไหน
qfwfq

4

Python 2 , 68 67 65 ไบต์

  • @ musicman123 บันทึก 2 ไบต์: เอาต์พุตโดยไม่ต้องล้อมรอบ []
  • ขอบคุณ @Chas Brown สำหรับ 1 Byte: x[p*i:p+p*i]asx[p*i][:p]
def f(x,n):p=len(x)/n;print[x[p*i:][:p]for i in range(n)],x[p*n:]

ลองออนไลน์!


1
บันทึก 1 ไบต์โดยแทนที่x[p*i:p+p*i]ด้วยx[p*i:][:p]
Chas Brown

1
+1 สำหรับ:p😛ทำได้ดีกว่าการตอบคำถามอื่น ๆ ของ Python
musicman523

ฮ่าฮ่า .. นั่นมันไม่ได้ตั้งใจเลย .... : p
Officialaimm

1
คำตอบนี้ได้รับการoutgolfed
musicman523

4

C ++ 14, 209 180 ไบต์

มันยาวเกินไป แต่ใช้ตัวดำเนินการหาร:

#include<bits/stdc++.h>
using q=std::string;using z=std::vector<q>;z operator/(q s,int d){int p=s.length()/d,i=0;z a;for(;i<d+1;){a.push_back(s.substr(i++*p,i^d?p:-1));}return a;}

การใช้งาน:

vector<string> result = string("abc")/3;

รุ่นออนไลน์: http://ideone.com/hbBW9u


4

Pyth, 9 ไบต์

cz*L/lzQS

ลองออนไลน์

มันทำงานอย่างไร

ครั้งแรกQเป็น autoinitialized ไปeval(input())และzจะ autoinitialized input()ไป

cz*L/lzQSQ
     lz      length of z
    /  Q     integer division by Q
  *L         times every element of
        SQ       [1, 2, …, Q]
cz           chop z at those locations


3

สนิม 107 ไบต์

fn f(s:&str,n:usize)->(Vec<&str>,&str){let c=s.len()/n;((0..n).map(|i|&s[i*c..i*c+c]).collect(),&s[c*n..])}

ลองออนไลน์!

จัดรูปแบบ:

fn q129259(s: &str, n: usize) -> (Vec<&str>, &str) {
    let c = s.len() / n;
    ((0..n).map(|i| &s[i * c..i * c + c]).collect(), &s[c * n..])
}

นี่เป็นเพียงmapดัชนีของชิ้นส่วนที่ถูกต้องของแหล่งที่มาstr(collectไอเอ็นจีเข้าไปVec) และชิ้นส่วนที่เหลือออก

น่าเสียดายที่ฉันไม่สามารถทำการปิดได้ (74 ไบต์):

|s,n|{let c=s.len()/n;((0..n).map(|i|&s[i*c..i*c+c]).collect(),&s[c*n..])}

ในขณะที่คอมไพเลอร์ล้มเหลวด้วย

error: the type of this value must be known in this context
 --> src\q129259.rs:5:18
  |
5 |          let c = s.len() / n;
  |                  ^^^^^^^

และถ้าฉันให้ประเภทs:&strอายุการใช้งานไม่ถูกต้อง:

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
 --> src\q129259.rs:6:27
  |
6 |          ((0..n).map(|i| &s[i * c..i * c + c]).collect(), &s[c * n..])
  |                           ^^^^^^^^^^^^^^^^^^^
  |
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the body at 4:18...
 --> src\q129259.rs:4:19
  |
4 |       (|s: &str, n| {
  |  ___________________^
5 | |          let c = s.len() / n;
6 | |          ((0..n).map(|i| &s[i * c..i * c + c]).collect(), &s[c * n..])
7 | |      })(s, n)
  | |______^
note: ...so that reference does not outlive borrowed content
 --> src\q129259.rs:6:27
  |
6 |          ((0..n).map(|i| &s[i * c..i * c + c]).collect(), &s[c * n..])
  |                           ^
note: but, the lifetime must be valid for the lifetime 'a as defined on the body at 3:58...
 --> src\q129259.rs:3:59
  |
3 |   fn q129259<'a>(s: &'a str, n: usize) -> (Vec<&str>, &str) {
  |  ___________________________________________________________^
4 | |     (|s: &str, n| {
5 | |          let c = s.len() / n;
6 | |          ((0..n).map(|i| &s[i * c..i * c + c]).collect(), &s[c * n..])
7 | |      })(s, n)
8 | | }
  | |_^
note: ...so that expression is assignable (expected (std::vec::Vec<&'a str>, &'a str), found (std::vec::Vec<&str>, &str))
 --> src\q129259.rs:4:5
  |
4 | /     (|s: &str, n| {
5 | |          let c = s.len() / n;
6 | |          ((0..n).map(|i| &s[i * c..i * c + c]).collect(), &s[c * n..])
7 | |      })(s, n)
  | |_____________^

3

เรติน่า , 92 ไบต์

(.+)¶(.+)
$2$*1¶$.1$*1¶$1
(1+)¶(\1)+
$1¶$#2$*1¶
\G1(?=1*¶(1+))
$1¶
¶¶1+

O^$`.

¶1+$

O^$`.

ลองออนไลน์! คำอธิบาย: ขั้นตอนแรกจะแปลงจำนวนชิ้นส่วนเป็นเอกและใช้ความยาวของสตริง ขั้นตอนที่สองจะแบ่งความยาวตามจำนวนชิ้นส่วนที่เหลือ ขั้นตอนที่สามคูณผลลัพธ์ด้วยจำนวนชิ้นส่วนอีกครั้ง สิ่งนี้ทำให้เรามีจำนวนสตริงที่ถูกต้องของความยาวที่ถูกต้อง แต่พวกเขายังไม่มีเนื้อหา สามารถลบจำนวนชิ้นส่วนได้ในระยะที่สี่ ขั้นตอนที่ห้าฝืนตัวละครทั้งหมด สิ่งนี้มีผลในการสลับเนื้อหาต้นฉบับด้วยสตริงตัวยึดตำแหน่ง แต่แม้ว่าตอนนี้จะอยู่ในตำแหน่งที่ถูกต้อง แต่ก็อยู่ในลำดับที่กลับกัน ตัวยึดได้รับบริการตามวัตถุประสงค์และถูกลบโดยขั้นตอนที่หก ในที่สุดขั้นตอนที่เจ็ดก็จะกลับตัวละครกลับสู่ลำดับเดิม


3

Perl 6 , 36 ไบต์

{$^a.comb.rotor($a.comb/$^b xx$b,*)}

ลองออนไลน์!

ส่งคืนรายการของรายการสตริงโดยที่องค์ประกอบสุดท้ายคือส่วนที่เหลือ (ถ้ามี)

คำอธิบาย:

{                                  }  # Anonymous code block
 $^a.comb                             # Split the string into a list of chars
         .rotor(                  )   # And split into
                            xx$b      # N lists
                $a.comb/$^b           # With string length/n size
                                ,*    # And whatever is left over  

2

JavaScript (ES6), 77 ไบต์

(s,d,n=s.length)=>[s.match(eval(`/.{${n/d|0}}/g`)).slice(0,d),s.slice(n-n%d)]

ส่งคืนอาร์เรย์ของสององค์ประกอบ: ส่วนสตริงที่แบ่งและส่วนที่เหลือ

ตัวอย่างการทดสอบ

f=
(s,d,n=s.length)=>[s.match(eval(`/.{${n/d|0}}/g`)).slice(0,d),s.slice(n-n%d)]
<div oninput="O.innerHTML=I.value&&J.value?JSON.stringify(f(I.value,+J.value)):''">String: <input id=I> Number: <input id=J size=3></div>
<pre id=O>


2

Japt , 18 ไบต์

¯W=Ul fV)òW/V pUsW

ทดสอบออนไลน์! (ใช้-Qค่าสถานะเพื่อแสดงผลลัพธ์)

คำอธิบาย

¯W=Ul fV)òW/V pUsW  : Implicit: U = input string, V = input integer
   Ul fV            : Floor U.length to a multiple of V.
 W=                 : Assign this value to variable W.
¯       )           : Take the first W characters of U (everything but the remainder).
         òW/V       : Partition this into runs of length W / V, giving V runs.
              pUsW  : Push the part of U past index W (the remainder) to the resulting array.
                    : Implicit: output result of last expression

2

Python, 82 76 74 ไบต์

def G(h,n):l=len(h);r=l/n;print[h[i:i+r]for i in range(0,n*r,r)],h[l-l%n:]

ดูเหมือนว่าสิ่งนี้มีคุณสมบัติสำหรับคะแนนโบนัส ฉันขอได้รับคุกกี้แทนได้ไหม เดี๋ยวก่อนพวกเขาไม่ใช่ของจริงเหรอ? ยี้ ...

ลองออนไลน์!



2

Python, 95, 87, 76 73 ไบต์

def f(s,n):
 a=[];i=len(s)/n
 while n:a+=s[:i],;s=s[i:];n-=1
 print a+[s]

ลองออนไลน์!


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

2

05AB1E , 12 ไบต์

²g¹‰`s¹.D)R£

ลองออนไลน์!

คำอธิบาย

²g¹‰`s¹.D)R£
²g           # Push length of string
  ¹          # Push amount of pieces
   ‰         # divmod of the two
    `s       # Flatten the resulting array and flip it around
      ¹.D    # Repeat the resulting length of the pieces amount of pieces times(wow that sounds weird)
         )   # Wrap stack to array
          R  # Reverse (so the remainder is at the end)
           £ # Split the input string into pieces defined by the array

1
9 ไบต์โดยการกลับคำสั่งอินพุท
Kevin Cruijssen

2

Brachylogขนาด 16 ไบต์

kʰ↙Xḍ₎Ylᵛ&ht↙X;Y

ลองออนไลน์!

จะเข้าเป็นรายการและผลเป็นรายการ[string, number] [remainder, parts](เครื่องหมายจุลภาคถูกแทนที่ด้วยเครื่องหมายอัฒภาคในกรณีทดสอบ "Hello, world!" เพื่อความชัดเจนเนื่องจากแฟรกเมนต์สตริงไม่ได้รับการพิมพ์ด้วยคำพูด)

                    The input
 ʰ                  with its first element
k ↙X                having the last X elements removed
    ḍ               and being cut into a number of pieces
     ₎              where that number is the last element of the input
      Y             is Y
       lᵛ           the elements of which all have the same length,
         &          and the input
          h         's first element
           t↙X      's last X elements
              ;     paired with
               Y    Y
                    are the output.

(ฉันยังแทนที่เครื่องหมายจุลภาคในรหัสด้วยเครื่องหมายอัฒภาคสำหรับรูปแบบผลลัพธ์ที่สอดคล้องกันด้วยเครื่องหมายจุลภาคกรณีที่ไม่มีส่วนที่เหลือจะเพียงแค่ส่งออกชิ้นส่วนโดยไม่มีส่วนที่เหลือที่ว่างเปล่าและเป็นสิ่งที่ดีสำหรับวัตถุประสงค์บางอย่างฉันไม่ จริง ๆ แล้วรู้ว่าทำไมมันทำงานอย่างนั้น ... )

หลังจากนี้ออกมาเป็นทั้ง 16 ไบต์ฉันพยายามทำบางสิ่งตาม+₁ᵗ⟨ġl⟩งาน แต่เนื่องจากการแก้ไขได้นานขึ้นและนานขึ้นฉันตัดสินใจว่าฉันจะติดกับโซลูชันดั้งเดิมของฉันในตอนนี้



2

Excel Formula, 185 173 165 161 149 ไบต์

ควรป้อนข้อมูลต่อไปนี้เป็นสูตรอาร์เรย์ ( Ctrl+ Shift+ Enter):

=MID(A1,(ROW(OFFSET(A1,,,B1+1))-1)*INT(LEN(A1)/B1)+1,INT(LEN(A1)/B1)*ROW(OFFSET(A1,,,B1+1))/IF(ROW(OFFSET(A1,,,B1+1))=B1+1,1,ROW(OFFSET(A1,,,B1+1))))

ที่A1มีข้อมูลที่คุณป้อน (เช่น12345678) และB1มีตัวหาร นอกจากนี้ยังใช้ตัวดำเนินการหารของ Excel เพื่อรับโบนัส

หลังจากป้อนสูตรเป็นสูตรอาร์เรย์ให้ไฮไลต์ลงในแถบสูตรและประเมินโดยใช้F9เพื่อส่งคืนผลลัพธ์ตัวอย่างเช่น:

Excel formula evaluation showing split groups

-12 ไบต์:แทนที่แต่ละรายการINDIRECT("1:"&B1+1)ด้วยOFFSET(A1,,,B1+1)การบันทึก 2 ไบต์ต่อการเกิดขึ้นรวมทั้งการลบการลบเครื่องหมายวงเล็บซ้ำซ้อน

-8 ไบต์:ลบINDEXฟังก์ชั่นซ้ำซ้อน

-4 ไบต์:ทำใหม่การจัดการ "ส่วนที่เหลือ"

-12 ไบต์:ลบออกซ้ำซ้อนINT(LEN(A1)/B1)โดยการชดเชยอาร์เรย์ที่สร้างขึ้นROW(OFFSET(A1,,,B1+1))โดย -1




1

Mathematica, 58 ไบต์

{#~Partition~a,#2}&@@TakeDrop[#,(a=Floor[Length@#/#2])#2]&

ฟังก์ชั่นการถ่ายรายการของตัวละครบริสุทธิ์และจำนวนเต็มบวกเป็นอินพุต ตัวอย่างเช่นกรณีทดสอบสุดท้ายถูกเรียกโดย

{#~Partition~a,#2}&@@TakeDrop[#,(a=Floor[Length@#/#2])#2]&[{"1","2","3","4","5","6","7"},4]

และผลตอบแทน:

{{{"1"}, {"2"}, {"3"}, {"4"}}, {"5", "6", "7"}}

1

Haskell, 120 88 ไบต์ (ขอบคุณØrjan Johansen!)

ไม่divนับเป็นผู้ประกอบการส่วน?

ฉันอยากรู้ว่าฉันจะลดทอนนี้ได้อย่างไรฉันยังไม่ได้เรียนรู้เทคนิคทั้งหมด

q=splitAt;x!s|n<-div(length s)x,let g""=[];g s|(f,r)<-q n s=f:g r,(a,b)<-q(n*x)s=(g a,b)

2
เขียนใหม่อย่างรวดเร็วด้วยเทคนิคพื้นฐานที่สุด: t=splitAt;x!s|n<-div(length s)x,let g""=[];g s|(f,r)<-t n s=f:g r,(a,b)<-t(n*x)s=(g a,b). ดังนั้น (1) ตัวระบุที่ใช้ซ้ำ ๆ อาจมีตัวย่อโดยเฉพาะถ้ามันยาว (2) ยามและยามรูปแบบมักจะสั้นกว่าlet... in, และwhere if then else(3) การจับคู่รูปแบบมักจะดีกว่าการทดสอบความเท่าเทียมกัน (ตกลงว่าletในยามรูปแบบไม่ว่าพื้นฐานฉันเพิ่งได้เรียนรู้จากคนอื่นที่นี่.) และตรวจสอบcodegolf.stackexchange.com/questions/19255/...
Ørjan Johansen

1
ดูเคล็ดลับการตีกอล์ฟใน Haskellเพื่อดูเทคนิคที่มีประโยชน์
sudee

@ ØrjanJohansenขอบคุณ! ฉันลืมเซมิโคลอนนั้นถูกต้องและletในยามนั้นค่อนข้างคดเคี้ยว แต่รหัสที่สั้นกว่าสามารถอ่านได้มากกว่าใช่ไหม
qfwfq

1

โอห์ม, 3 ไบต์ (ไม่ใช่การแข่งขัน?)

lvσ

ไม่ใช่การแข่งขันเนื่องจากบิวด์อินยังไม่ได้ติดตั้งใน TIO และฉันไม่มีพีซีที่มีประโยชน์ในการทดสอบว่ามันทำงานได้ดีใน repo ล่าสุดหรือไม่

ในตัว¯ \\ _ (ツ) _ / ¯ ฉันใช้ความผิดพลาดในตัว ... แต่เดี๋ยวก่อนยังมีอีกอันที่วางอยู่รอบ ๆตอนนี้ฉันใช้ผิดในตัวสองครั้ง (หรือหนึ่งในตัวทำงานผิดกับเศษ)

ฉันจะได้รับคะแนนโบนัสเพราะvเป็นแผนก (ชั้น) หรือไม่


1
สิ่งนี้ไม่ได้แยกในแบบที่ต้องการ เช่นHello, world! 5testcase ผิด ลองออนไลน์!
Ørjan Johansen

ฉันจะไปหาคนอื่นในตัว ....
Roman Gräf

1

CJam , 16 ไบต์

{_,2$//_2$<@@>s}

บล็อกแบบไม่ระบุชื่อที่คาดหวังข้อโต้แย้งในสแต็กและปล่อยให้ผลลัพธ์ในสแต็กหลัง

ลองออนไลน์!

คำอธิบาย

number "string"คาดว่าข้อโต้แย้ง

_,              e# Copy the string and get its length.
  2$            e# Copy the number.
    /           e# Integer divide the length by the number.
     /          e# Split the string into slices of that size.
      _         e# Copy the resulting array.
       2$       e# Copy the number.
         <      e# Slice the array, keeping only the first <number> elements.
          @@    e# Bring the number and original array to the top.
            >   e# Slice away the first <number> elements,
             s  e# and join the remaining elements into a string.

1

J , 26 ไบต์

(]$~[,(<.@%~#));]{.~0-(|#)

นอกเหนือจากการกำจัดช่องว่างและขั้นตอนกลางแล้วสิ่งนี้ยังไม่ได้รับการตีกอล์ฟ ฉันคาดหวังว่าฉันจะได้ใช้เวลานานอย่างใดสิ่งที่มีวงเล็บและการอ้างอิงอาร์กิวเมนต์ของฉัน ( [และ] )

ดูJupyter notebookสำหรับกรณีทดสอบเช่นต่อไปนี้:

   5 chunk test2
┌──┬───┐
│He│ld!│
│ll│   │
│o,│   │
│ w│   │
│or│   │
└──┴───┘

ขอบคุณ อ่านเร็วเกินไป ลบความคิดเห็นแล้ว
Jonah

1

R , 79 63 ไบต์

-16 จาก Giuseppe แก้ไขการทำดัชนี

function(s,n,k=nchar(s),l=k%/%n)substring(s,0:n*l+1,c(1:n*l,k))

ลองออนไลน์!

สร้างขึ้นโดยให้อินพุตแบบเวกเตอร์กับ substring()


63 ไบต์ - ทำให้การทำดัชนีง่ายขึ้นเล็กน้อย
Giuseppe

@Giuseppe ฮ่าฮ่าฉันต้องลองหลาย ๆ แบบของการเพิ่มและทวีคูณในดัชนี แต่พลาดไปหนึ่งอัน จับดี.
CrulallyVulgar

0

PHP , 152 ไบต์

ขอบคุณ @ JörgHülsermann (เคล็ดลับวงเล็บ!)

$c=$s=explode('|',readline());
while($s[1]--)$s[0]=preg_replace('/^'.($l[]=substr($s[0],0,strlen($c[0])/$c[1])).'/','',$s[0]);
$l[r]=$s[0];
print_r($l);

ลองออนไลน์!


1
PHP Way ของคุณใช้งานไม่ได้เพราะมันเข้ามาแทนที่ไม่เพียง แต่ในตอนแรก preg_replaceเป็นทางเลือกหรือคุณสามารถใช้[,$s,$d]=$argv;print_r(array_slice(str_split($s,$l=strlen($s)/$d^0),0,$d)+[$d=>substr($s,$l*$d)]);
JörgHülsermann

คุณสามารถอธิบายรหัสตัวอย่างให้ฉันฟังได้ไหมเพราะเหตุใดรหัส PHP ของฉันจึงไม่ทำงาน
กีบ

1
ลองออนไลน์! มันเข้ามาแทนที่Aในการวิ่งครั้งแรก
JörgHülsermann

1
คุณสามารถวางโครงสร้าง array_walk ถ้าคุณใช้วงเล็บลองออนไลน์!
JörgHülsermann

คำแนะนำที่ดี! ฉันลืมไปโดยสิ้นเชิง
คิป

0

Python 3 , 94 ไบต์

i=input().split('|')
s,n=i[0],int(i[1])
c=len(s)//n
while n:print(s[:c]);s=s[c:];n-=1
print(s)

ลองออนไลน์!


สมมติว่าใส่เป็นในตัวแปรไม่ได้เป็นวิธีการป้อนข้อมูลที่ถูกต้อง
Ørjan Johansen

สิ่งนี้หมายความว่าอะไรตามปกติ I / O มีความยืดหยุ่น ? ขอบคุณมากฉันแก้ไขคำตอบของฉัน ...
kip

1
วิธีการมาตรฐานของ PPCG นั้นค่อนข้างยืดหยุ่น เพียงแค่ไม่ค่อยมากเท่าไหร่
Ørjan Johansen

0

PowerShell v3 + , 72 , 80 ไบต์

ถือว่า $sมีสายป้อน; $nมีจำนวนอักขระต่อ "ชิ้น" นอกจากนี้ยังถือว่าว่า "StrictMode" ปิดอยู่ มิฉะนั้นจะส่งคืนข้อผิดพลาดเนื่องจากการจัดทำดัชนีเพิ่มเติมในอาร์เรย์มากกว่าที่มีอยู่จริง (เช่นถ้าอาร์เรย์มี 4 องค์ประกอบและฉันเรียกองค์ประกอบที่ 5 ที่ไม่มีอยู่จริง) เมื่อปิด StrictMode แล้ว PS จะไม่สนใจและมันจะเพิกเฉยต่อข้อผิดพลาด

for($i = 0;$i -le $s.Length;$i+=$n+1){-join($s|% ToCharA*)[$i..($i+$n)]}

โดยใช้สัญกรณ์($s|% ToCharA*)ฉันก็สามารถที่จะบันทึกตัวอักษร 1 เมื่อเทียบกับ$s.ToCharArray():)

ปรับปรุง:

อัปเดตรหัสเพื่อให้เป็นไปตามข้อกำหนดของความท้าทายจริง ๆ สมมติอีกครั้งว่า$sมีสตริงการป้อน; อย่างไรก็ตามในครั้ง$nนี้มีจำนวน "ชิ้น" ส่วนที่เหลือจะพิมพ์ออกมาครั้งสุดท้าย และฉันใช้โอเปอเรเตอร์ของ PowerShell

0..($n-1)|%{$p=[math]::Floor($s.length/$n)}{$s|% Su*($_*$p) $p}{$s|% Su*($n*$p)}

ลองออนไลน์!


ฉันเชื่อว่าคุณเข้าใจผิดคำถามอินพุตคือจำนวนชิ้น (ไม่รวมส่วนที่เหลือ)
Ørjan Johansen

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