Chia một chuỗi


23

Thử thách

Cho một chuỗi và một số, chia chuỗi thành nhiều phần có kích thước bằng nhau. Ví dụ: nếu số là 3, bạn nên chia chuỗi thành 3 phần bất kể chuỗi đó dài bao nhiêu.

Nếu độ dài của chuỗi không chia đều cho số được cung cấp, bạn nên làm tròn kích thước của từng mảnh và trả về chuỗi "phần còn lại". Ví dụ: nếu độ dài của chuỗi đầu vào là 13 và số là 4, bạn nên trả về bốn chuỗi mỗi kích thước 3, cộng với một chuỗi còn lại có kích thước 1.

Nếu không có phần còn lại, bạn chỉ có thể không trả lại một hoặc trả lại chuỗi trống.

Số được cung cấp được đảm bảo nhỏ hơn hoặc bằng độ dài của chuỗi. Ví dụ, đầu vào "PPCG", 7sẽ không xảy ra vì "PPCG"không thể chia thành 7 chuỗi. (Tôi cho rằng kết quả phù hợp sẽ là (["", "", "", "", "", "", ""], "PPCG"). Đơn giản hơn là không cho phép điều này làm đầu vào.)

Như thường lệ, I / O là linh hoạt. Bạn có thể trả về một cặp chuỗi và chuỗi còn lại hoặc một danh sách các chuỗi có phần còn lại ở cuối.

Các trường hợp thử nghiệm

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

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng.

Điểm thưởng (không thực sự) để làm cho giải pháp của bạn thực sự sử dụng toán tử phân chia ngôn ngữ của bạn.


1
Điểm thưởng? Ôi trời, tôi phải làm điều này
Matthew Roh

Đối với phần thưởng, Jelly, 3 byte;⁹/
Jonathan Allan

Liên quan , nhưng không có phần nào giống như thử thách này.
sĩ523

Để làm cho nó rõ ràng hơn xin vui lòng thêm một testcase PPCG, 7vì vậy phần còn lại làPPCG
Jörg Hülsermann

@ JörgHülsermann Đầu vào đó không được phép. Tôi đã thêm nhiều chi tiết liên quan đến loại đầu vào đó và mọi thứ được định dạng lại để rõ ràng hơn.
sĩ523

Câu trả lời:




5

Pip , 21 byte

20 byte mã, +1 cho -ncờ.

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

Lấy đầu vào làm đối số dòng lệnh; đầu ra chuỗi và phần còn lại được phân tách. Hãy thử trực tuyến!

Giải trình

Vui với các hoạt động regex!

Hãy lấy abcdefgchuỗi của chúng tôi và 3số của chúng tôi. Chúng tôi xây dựng regex (.{2})(.{2})(.{2}), khớp ba lần chạy của hai ký tự và lưu trữ chúng trong ba nhóm bắt giữ. Sau đó, bằng cách sử dụng các biến đối sánh regex của Pip, chúng ta có thể in 1) danh sách các nhóm bắt giữ ["ab";"cd";"ef"]và 2) phần còn lại của chuỗi không khớp "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 byte

#là một toán tử lấy một Stringvà một Int, và trả về một danh sách Strings.

Sử dụng như "Hello, world!"#4.

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

  • slà chuỗi đầu vào và nlà số phần không còn lại.
  • dlà chiều dài của mỗi mảnh "bình thường". divlà phép chia số nguyên.
  • Việc hiểu danh sách xây dựng n+1các mảnh, với phần cuối cùng là phần còn lại.
    • ilặp đi lặp lại từ 0đến n, bao gồm.
    • Đối với mỗi phần, đầu tiên số lượng đúng ( i*d) của các ký tự ban đầu là dropped từ đầu s, sau đó một chuỗi con ban đầu là taken từ kết quả.
    • Độ dài chuỗi con được lấy phải là d, ngoại trừ phần còn lại.
      • Phần còn lại thực tế phải ngắn hơn n, vì nếu không các mảnh bình thường sẽ được kéo dài thay thế.
      • taketrả về toàn bộ chuỗi nếu độ dài cho trước quá lớn, vì vậy chúng ta có thể sử dụng bất kỳ số nào >=n-1cho phần còn lại.
      • Biểu thức d+n*0^(n-i)cho dnếu i<nd+nnếu i==n. Nó sử dụng đó 0^x1khi x==0, nhưng 0nếu x>0.

Tôi sẽ cần xem nơi tôi có thể sử dụng danh sách hiểu.
qfwfq

4

Python 2 , 68 67 65 byte

  • @ musicman123 đã lưu 2 byte: đầu ra mà không kèm theo []
  • Cảm ơn @Chas Brown cho 1 Byte: x[p*i:p+p*i]nhưx[p*i][:p]
def f(x,n):p=len(x)/n;print[x[p*i:][:p]for i in range(n)],x[p*n:]

Hãy thử trực tuyến!


1
Tiết kiệm 1 byte bằng cách thay thế x[p*i:p+p*i]bằngx[p*i:][:p]
Chas Brown

1
+1 cho :pHoàn thành tốt hơn các câu trả lời khác của Python!
sĩ523

Haha .. mà đã không có ý định ở tất cả ....: p
officialaimm

1
Câu trả lời này đã được outgolfed
musicman523

4

C ++ 14, 209 180 byte

Điều đó hơi dài, nhưng sử dụng toán tử chia:

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

Sử dụng:

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

Phiên bản trực tuyến: http://ideone.com/hbBW9u


4

Bình thường, 9 byte

cz*L/lzQS

Dùng thử trực tuyến

Làm thế nào nó hoạt động

Đầu tiên Qlà autoinitialized đến eval(input())zđược autoinitialized thành 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

Rust , 107 byte

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..])}

Hãy thử trực tuyến!

Định dạng:

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..])
}

Điều này chỉ đơn giản là mapcác chỉ số trên các lát chính xác của nguồn str( collecting vào mộtVec ) và cắt phần còn lại.

Thật không may, tôi không thể đóng cái này (74 byte):

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

vì trình biên dịch thất bại với

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

và nếu tôi cung cấp loại s:&str, tuổi thọ là sai:

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

Võng mạc , 92 byte

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

O^$`.

¶1+$

O^$`.

Hãy thử trực tuyến! Giải thích: Giai đoạn đầu tiên chuyển đổi số phần thành đơn vị và cũng mất độ dài của chuỗi. Giai đoạn thứ hai sau đó chia chiều dài cho số phần, để lại phần còn lại. Giai đoạn thứ ba nhân kết quả với số phần một lần nữa. Điều này cung cấp cho chúng tôi số chuỗi chính xác có độ dài chính xác, nhưng chúng chưa có nội dung. Số lượng các bộ phận hiện có thể bị xóa bởi giai đoạn thứ tư. Giai đoạn thứ năm đảo ngược tất cả các nhân vật. Điều này có tác dụng chuyển đổi nội dung gốc bằng chuỗi giữ chỗ, nhưng mặc dù hiện tại nó đang ở đúng vị trí, nhưng nó lại theo thứ tự ngược lại. Các trình giữ chỗ đã phục vụ mục đích của họ và bị xóa bởi giai đoạn thứ sáu. Cuối cùng, giai đoạn thứ bảy đảo ngược các nhân vật trở lại trật tự ban đầu của họ.


3

Perl 6 , 36 byte

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

Hãy thử trực tuyến!

Trả về một danh sách các danh sách các chuỗi, trong đó phần tử cuối cùng là phần còn lại (nếu có một chuỗi).

Giải trình:

{                                  }  # 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 byte

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

Trả về một mảng gồm hai phần tử: phần chuỗi được chia và phần còn lại.

Kiểm tra đoạn trích

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 byte

¯W=Ul fV)òW/V pUsW

Kiểm tra nó trực tuyến! (sử dụng -Qcờ để trực quan hóa đầu ra)

Giải trình

¯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, 95, 87, 76 73 byte

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

Hãy thử trực tuyến!


Chào mừng đến với PPCG! Tôi đã thêm một liên kết "Dùng thử trực tuyến" vào bài viết của bạn. Tôi nghĩ bạn có thể rút ngắn một chút giải pháp của mình bằng cách biến nó thành một chương trình đầy đủ hơn là một chức năng. Hãy thử trực tuyến!
sĩ523

2

05AB1E , 12 byte

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

Hãy thử trực tuyến!

Giải trình

²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 byte bằng cách đảo ngược thứ tự đầu vào.
Kevin Cruijssen

2

Brachylog , 16 byte

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

Hãy thử trực tuyến!

Lấy đầu vào là một danh sách [string, number]và đầu ra là một danh sách [remainder, parts]. (Dấu phẩy đã được thay thế bằng dấu chấm phẩy trong trường hợp kiểm tra "Xin chào, thế giới!" Cho rõ ràng, vì các đoạn chuỗi không được in bằng dấu ngoặc kép.)

                    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.

(Tôi cũng đã thay thế dấu phẩy trong mã bằng dấu chấm phẩy cho định dạng đầu ra nhất quán. Với dấu phẩy , trường hợp không có phần còn lại sẽ chỉ ra những phần mà không có một phần còn lại trống rỗng, và là tốt đẹp như đó là đối với một số mục đích, tôi không thực sự biết tại sao nó hoạt động theo cách đó ...)

Sau khi nó xuất hiện toàn bộ 16 byte, tôi đã cố gắng tạo ra một cái gì đó dựa trên +₁ᵗ⟨ġl⟩công việc, nhưng khi các bản sửa lỗi ngày càng dài hơn, tôi quyết định rằng bây giờ tôi sẽ chỉ sử dụng giải pháp ban đầu của mình.



2

Công thức Excel, 185 173 165 161 149 byte

Sau đây nên được nhập dưới dạng công thức mảng ( 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))))

Nơi A1chứa đầu vào của bạn (ví dụ 12345678) và B1chứa ước số. Điều này cũng sử dụng toán tử phân chia của Excel để nhận tiền thưởng.

Sau khi nhập công thức dưới dạng công thức mảng, hãy tô sáng nó trong thanh công thức và đánh giá nó bằng cách sử dụng F9để trả về kết quả, ví dụ:

Đánh giá công thức Excel hiển thị các nhóm phân chia

-12 byte: thay thế từng INDIRECT("1:"&B1+1)OFFSET(A1,,,B1+1)để tiết kiệm 2 byte cho mỗi điều xảy ra, cộng với một số làm sạch loại bỏ dấu ngoặc không cần thiết.

-8 byte: loại bỏ INDEXchức năng dự phòng .

-4 byte: xử lý lại "phần còn lại".

-12 byte: loại bỏ dự phòng INT(LEN(A1)/B1)bằng cách bù mảng được tạo ROW(OFFSET(A1,,,B1+1))bởi -1.




1

Toán học, 58 byte

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

Hàm thuần túy lấy danh sách các ký tự và số nguyên dương làm đầu vào. Ví dụ, trường hợp thử nghiệm cuối cùng được gọi bởi

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

và trả lại:

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

1

Haskell, 120 88 byte (nhờ rjan Johansen!)

Làm div được tính là toán tử phân chia?

Tôi tò mò làm thế nào tôi có thể cắt nó xuống, tôi chưa học được tất cả các mánh khóe.

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
Viết lại nhanh chóng với các thủ thuật cơ bản nhất : 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). Vì vậy, (1) Một mã định danh được sử dụng nhiều lần có thể được viết tắt, đặc biệt nếu nó dài. (2) Bảo vệ và lính gác mẫu hầu như luôn luôn ngắn hơn let... in, whereif then else. (3) Kết hợp mẫu thường tốt hơn kiểm tra đẳng thức. (OK, lettrong một mô hình bảo vệ không phải là cơ bản, gần đây tôi đã học được nó từ một người khác ở đây.) Và kiểm tra codegolf.stackexchange.com/questions/19255/ .
Ørjan Johansen

1
Ngoài ra, hãy xem Mẹo chơi golf trong Haskell để biết một số thủ thuật hữu ích.
sudee

@ RjanJohansen Cảm ơn! Tôi quên rằng dấu chấm phẩy là hợp lệ, và lettrong bảo vệ là khá sai lệch. Nhưng mã ngắn hơn là dễ đọc hơn, phải không?
qfwfq

1

Ohm, 3 byte (không cạnh tranh?)

lvσ

Không cạnh tranh vì tích hợp chưa được triển khai trong TIO và tôi không có PC nào để kiểm tra xem nó có hoạt động trong lần kéo mới nhất trong repo hay không.

Tích hợp ¯ \\ _ (ツ) _ /. Tôi đã sử dụng sai tích hợp ... Nhưng hey vẫn còn một cái khác nằm xung quanh.Bây giờ tôi đã sử dụng sai tích hợp hai lần (hoặc một tác phẩm tích hợp sai với phần còn lại).

Tôi có nhận được điểm thưởng vì vphân chia (sàn) không?


1
Điều này không phân chia theo cách cần thiết. ví dụ như Hello, world! 5testcase sai. Hãy thử trực tuyến!
Ørjan Johansen

Chà, tôi sẽ tìm kiếm một tích hợp khác ....
Roman Gräf

1

CJam , 16 byte

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

Khối ẩn danh mong đợi các đối số trên ngăn xếp và để lại kết quả trên ngăn xếp sau.

Hãy thử trực tuyến!

Giải trình

Mong đợi các đối số như 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 byte

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

Ngoài việc sắp xếp các không gian và các bước trung gian, điều này đã không được đánh gôn. Tôi hy vọng rằng tôi đã đi một chặng đường dài bằng cách nào đó, những gì với dấu ngoặc đơn và tham chiếu đối số của tôi ( [] ) của tôi.

Xem sổ tay Jupyter để biết các trường hợp thử nghiệm, chẳng hạn như sau:

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

Cảm ơn. Đọc quá nhanh. Nhận xét đã bị xóa
Jonah

1

R , 79 63 byte

-16 từ Giuseppe sửa lỗi lập chỉ mục

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

Hãy thử trực tuyến!

Được xây dựng xung quanh việc cung cấp đầu vào vector cho substring()


63 byte - đơn giản hóa việc lập chỉ mục một chút.
Giuseppe

@Giuseppe Haha, tôi đã thử mọi biến thể của việc thêm và nhân lên chỉ mục, nhưng đã bỏ lỡ cái đó. Nắm bắt tốt.
CriminallyVulgar

0

PHP , 152 byte

Cảm ơn @ JörgHülsermann (dấu ngoặc nhọn!)

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

Hãy thử trực tuyến!


1
Cách thức PHP của bạn không hoạt động vì nó không chỉ thay thế ngay từ đầu. preg_replacelà một giải pháp thay thế hoặc bạn có thể sử dụng[,$s,$d]=$argv;print_r(array_slice(str_split($s,$l=strlen($s)/$d^0),0,$d)+[$d=>substr($s,$l*$d)]);
Jörg Hülsermann

Bạn có thể giải thích cho tôi với một mã ví dụ tại sao không hoạt động mã PHP của tôi không?
kip

1
Hãy thử trực tuyến! Nó thay thế tất cả Atrong lần chạy đầu tiên
Jörg Hülsermann

1
Bạn có thể thả cấu trúc mảng_walk nếu bạn sử dụng dấu ngoặc Hãy thử trực tuyến!
Jörg Hülsermann

Mẹo hay! Tôi hoàn toàn quên mất
kip

0

Python 3 , 94 byte

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)

Hãy thử trực tuyến!


Giả sử đầu vào nằm trong một biến không phải là phương thức nhập hợp lệ .
Ørjan Johansen

Điều này có nghĩa gì Như thường lệ, I / O là linh hoạt. ? Dù sao cũng cảm ơn, tôi chỉnh sửa câu trả lời của mình ...
kip

1
Phương pháp chuẩn PPCG của khá linh hoạt. Chỉ là không quá nhiều.
Ørjan Johansen

0

PowerShell v3 + , 72 , 80 byte

Giả sử $schứa chuỗi đầu vào; $nchứa số lượng ký tự trên mỗi "mảnh". Điều này cũng giả sử rằng "StrictMode" bị tắt. Mặt khác, một lỗi sẽ được trả về do lập chỉ mục sâu hơn vào một mảng hơn thực tế tồn tại (nghĩa là nếu mảng có 4 phần tử và tôi gọi phần tử thứ 5 không tồn tại). Khi tắt StrictMode, PS không quan tâm và nó sẽ bỏ qua lỗi.

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

Sử dụng ký hiệu ($s|% ToCharA*)tôi đã có thể lưu 1 ký tự so với$s.ToCharArray() :)

Cập nhật:

Mã cập nhật để thực sự đáp ứng yêu cầu thách thức. Một lần nữa giả định $schứa chuỗi đầu vào; tuy nhiên, lần này $ncó chứa số "miếng". Phần còn lại được in ra cuối cùng. Và tôi đã sử dụng toán tử phân chia của PowerShell

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

Hãy thử trực tuyến!


Tôi tin rằng bạn đã hiểu nhầm câu hỏi, đầu vào là số phần (không bao gồm phần còn lại).
Ørjan Johansen

Oh bạn nói đúng. Tôi đọc sai câu hỏi tối qua :) Tôi sẽ đăng giải pháp cập nhật của mình khi có cơ hội.
GAT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.