Chia chuỗi thành n mảnh (hoặc mảnh có độ dài n)


11

Các thách thức

Trong thử thách này, bạn phải thực hiện hai nhiệm vụ khác nhau (nhưng có liên quan) tùy theo thứ tự của đầu vào.
Chương trình của bạn sẽ nhận được một chuỗi svà một số nguyên nlàm đầu vào và sẽ

  • chia sthành từng phần dài nnếu sđến trước. Phần tử cuối cùng sẽ ngắn hơn nếu cần thiết.
  • chia sthành ncác phần có độ dài bằng nhau nếu nđến trước. Nếu len(s)không phải là bội số của ncác len(s) mod nphần tử đầu tiên sẽ là một phần tử dài hơn.

Bạn chỉ có thể lấy 2 đầu vào đó. ssẽ không bao giờ chỉ chứa các chữ số.

Ghi chú

  • Bạn có thể sử dụng ánh xạ ngược. Lưu ý điều này trong câu trả lời của bạn nếu bạn làm điều đó.
  • ssẽ chỉ chứa các ký tự ASCII có thể in (không có dòng mới).
  • Bạn không được sử dụng bất kỳ nội dung nào giải quyết trực tiếp hai nhiệm vụ đó. Tất cả các nội dung khác được cho phép.
  • Bạn phải lấy cả hai đối số từ cùng một nguồn.
  • Bạn có thể lấy các đối số trong một danh sách có thứ tự hoặc bất kỳ định dạng nào khác chỉ rõ thứ tự của chúng miễn là nó không rõ ràng.
  • Bạn có thể lấy đầu vào dưới dạng một chuỗi / luồng và sử dụng một ký tự không phải là đầu vào hợp lệ (như nullbyte) để phân tách chúng.
  • nsẽ luôn bằng hoặc nhỏ hơn độ dài svà lớn hơn 0.
  • Bạn có thể xuất danh sách kết quả theo bất kỳ định dạng có thể cộng hưởng nào miễn là nó chỉ rõ các phần cụ thể và thứ tự của chúng.

Thí dụ

Đầu vào: programming, 3
Phần tử cuối cùng chỉ chứa 2 ký tự, vì 11 không chia hết cho 3.
Đầu ra: ["pro", "gra", "mmi", "ng"]

Đầu vào: 3, programming
11 không phải là bội số của 3, vì vậy 2 yếu tố đầu tiên sẽ dài hơn một:
Đầu ra: ["prog", "ramm", "ing"]

Quy tắc

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

Các trường hợp thử nghiệm đã được tạo bằng chương trình Pyth này (sử dụng nội trang, vì vậy không có câu trả lời hợp lệ). Cảm ơn @FryAmTheEggman đã cung cấp phiên bản cơ bản đó!

3, hellowworld -> ['hell', 'owo', 'rld']
hellowworld, 3 -> ['hel', 'thấp', 'orl', 'd']
1, lập trình -> ['lập trình']
lập trình, 1 -> ['p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'i', 'n', 'g']
8, lập trình -> ['pr', 'og', 'ra', 'm', 'm', 'i', 'n', 'g']
lập trình, 8 -> ['chương trình', 'ing']
9, mã golf -> ['c', 'o', 'd', 'e', ​​'', 'g', 'o', 'l', 'f']
mã golf, 9 -> ['mã golf']
4, 133tspeak -> ['133', 'ts', 'pe', 'ak']
133tspeak, 4 -> ['133t', 'spea', 'k']

Chúc mừng mã hóa!


Bạn không thể sử dụng bất kỳ nội dung nào giải quyết hai nhiệm vụ đó. Có bao gồm các phần dựng sẵn khác, chẳng hạn như nhận mọi ký tự thứ n từ một chuỗi hoặc phân tách tại các lần xuất hiện không?
Dennis

@Dennis Điều này chỉ nhằm loại trừ các nội dung giải quyết vấn đề này trực tiếp. Tôi nói rõ.
Denker

Nếu ngôn ngữ của chúng tôi không hỗ trợ mảng, chúng ta nên xuất như thế nào? Một dòng mới giữa mỗi kết quả của chuỗi có thể được chấp nhận?
Conor O'Brien

Ngoài ra, đối với các ngôn ngữ mà đầu vào là một mảng các số không rõ ràng, quy trình nên là gì?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Không thể xảy ra. s sẽ không bao giờ chỉ chứa các chữ số . Ngoài ra, bạn có thể xuất danh sách kết quả theo bất kỳ định dạng có thể cộng hưởng nào miễn là nó chỉ ra rõ ràng các phần cụ thể và thứ tự của chúng bao gồm đầu ra đa dòng tất nhiên.
Denker

Câu trả lời:


3

MATL, 46 26 21 27 29 42 byte

jtU?jtbUe!tn2Gn>?0t(]tgbw(}ie]!2t$X{Oc''Zt

Hãy thử trực tuyến! (Cập nhật một chút để làm việc với phiên bản mới nhất của ngôn ngữ)

Giải trình

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

Những gì không thể in được xuất hiện ở cuối của một số yếu tố danh sách là gì? Chúng không phải là một phần của đầu vào và do đó cũng không phải là một phần của đầu ra.
Denker

Không phải là emột nội dung bị cấm?
FliiFe

Có thể thay thế XUZN?...bằng U?...và trao đổi hai ifchi nhánh. Ngoài ra, bạn không cần3$
Luis Mendo

@DenkerAffe Xin lỗi về điều đó. Nên sửa ngay.
Suever

@FliiFe Dựa trên các nhận xét về bài đăng ban đầu, ekhông trực tiếp giải quyết vấn đề, vì vậy tôi không coi đó là bị cấm, không.
Suever

4

JavaScript (ES6), 132 byte

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

Điều này có lẽ là vô vọng quá mức thiết kế.


Vâng, giải pháp của tôi (bây giờ đã chết) đã được thiết kế quá mức. +1 cho bạn
edc65

4

JavaScript (Firefox), 88 87 byte

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

Gọi nó như (...)("programming")(3)sử dụng Firefox 30+.


2

Ruby, 119 byte

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

Và tôi chiếm vị trí đầu tiên bằng 2 byte ...


Các đối tượng Regex trong Ruby có thể có các giá trị được đưa vào chúng giống như các chuỗi có thể, do đó, cũng x.scan(/.{,#{y}})hoạt động tốt như vậy để phân tách các chuỗi trong trường hợp đầu tiên. Hay điều đó được tính là tích hợp?
Mực giá trị

2

AWK, 121 130 128 122 byte

$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

Vấn đề duy nhất là nếu mục nhập đầu tiên là một chuỗi bắt đầu bằng một giá trị số. Điều này sẽ gây ra AWKđể xem chuỗi là số đó và mục thứ hai là chuỗi.

OK ... đã sửa lỗi số, nhưng nó đã thêm 9 byte :(.

Làm lại một chút để tiết kiệm một vài byte.

Gần như trở lại chiều dài ban đầu. :)


OK, @DenkerAffe, đã sửa nó để hoạt động nói chung và chỉ (cuối cùng) thêm 1 byte.
Robert Benson

1

Haskell, 131 byte

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

Ví dụ sử dụng:

*Main> "8" # "programming"
["pr","og","ra","m","m","i","n","g"]
*Main> "programming" # "8"
["programm","ing"]

Cách thức hoạt động: công việc chính được thực hiện bởi hàm trợ giúp qcó một cặp số (d,m)và một chuỗi s. Đầu tiên, nó xây dựng một danh sách các mlần d+1theo sau là vô số d(ví dụ (1,3)-> [2,2,2,1,1,1,1,1,...]). Sau đó, nó sử dụng splitPlacesđể phân chia sthành các đoạn có độ dài được đưa ra bởi danh sách. splitPlacesdừng lại nếu shết các phần tử, vì vậy một danh sách vô hạn là tốt.

Hàm chính #kiểm tra tham số nào là số n/ chuỗi strvà gọi qbằng (div (length str) n, mod (length str) n)hoặc (n, 0)cộng str.


0

C # (LINQPAD) - 335 byte

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

Phần đọc đầu vào chiếm một chút không gian. Người chiến thắng câu trả lời dài nhất.

Cách sử dụng số 1:

$ 3, helloworld

>> hell, owo, rld

Cách sử dụng số 2:

$ helloworld, 3

>>hel, low, orl, d

owo cái gì đây?
Benjamin Urquhart

0

Bình thường, 181 byte

Hãy giả vờ mã dài nhất tính bằng byte thắng \ 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

Hãy thử nó ở đây! (Trình thông dịch trực tuyến dường như có lỗi, nó sẽ hiển thị đầu vào trong khi không nên)

Đây là đầu ra từ thiết bị đầu cuối:

» pyth split.pyth <<<'["helloworld", 3]' 
['hel', 'low', 'orl', 'd']
» pyth split.pyth <<<'[3, "Helloworld"]'
['Hell', 'owo', 'rld']

Nghiêm túc mà nói, tôi cởi mở với cách tiếp cận mới. Tôi mới biết về python, vì vậy tôi có thể đã bỏ lỡ một vài tốc ký.

Ý tôi là, tôi nghĩ rằng câu trả lời của tôi là tuyệt vọng từ điểm nó dài hơn câu trả lời javascript ...


Bạn có thể cung cấp một đầu vào mẫu và đầu ra?
Leaky Nun

Lưu ý các giải pháp chính thức dưới tiêu đề testcases. Các testcase được tạo ra bởi Pyth. Giải pháp là .xcsJKcJsK, ở đâu JKlà hai đối số.
Leaky Nun

@KennyLau Tôi đã thêm một liên kết đến trình thông dịch pyth trực tuyến. Kỳ lạ thay, nó cũng xuất ra đầu vào trong khi tôi chắc chắn không phải ngày hôm qua ... Sẽ cố gắng khắc phục điều đó.
FliiFe

sử dụng khoảng trắng để chặn in
Leaky Nun

@KennyLau không gian ở đâu?
FliiFe

0

PHP, 114 byte

[$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),"
";
  • Chuỗi không nên bắt đầu bằng chữ số.
    (Thay thế +@$pbằng is_numeric($p)để sửa chữa.)
  • Đầu ra không được chứa một đoạn "0".
    (Chèn ~cho ASCII có thể in, a&cho bất kỳ ASCII nào trước khi $t;sửa.)
  • Chạy với -nrhoặc thử trực tuyến .

0

PowerShell , 122 118 byte

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

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

Ít chơi gôn hơn:

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
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.