Chia làm ba!


16

Đưa ra một chuỗi, bạn đã chia nó thành các nhóm gồm ba ký tự (bằng cách đệm _ở cuối).

Liên quan , nhưng vẫn khác.


Mẫu I / O:

  • 'abcde' -> 'abc', 'de_'

  • '1234' -> '123', '4__'

  • '' -> [] or falsey value

  • 'Three spree!' -> 'Thr', 'ee ', 'spr', 'ee!'

  • Chuỗi 6 MB

Đây là một , vì vậy ít byte nhất sẽ giành chiến thắng!

Chỉnh sửa: Cuối cùng, đầu ra không bị hạn chế .


10
Tại sao trường hợp đặc biệt chuỗi rỗng? Chúng ta có thể chọn nhân vật nào để sử dụng cho phần đệm không?
Xù xì

12
Vì vậy, nhiệm vụ thực sự là: Đưa ra một chuỗi, trả về giá trị falsey nếu nó trống, nếu không thì chia nó thành các nhóm ba, đệm với dấu gạch dưới nếu cần thiết ? Có vẻ như một cặp đôi kỳ lạ của hai nhiệm vụ không liên quan (kiểm tra độ dài chuỗi và tách).
Adám

14
Những điều cần tránh: Trường hợp cạnh đặc biệt . Trong trường hợp này, một chuỗi rỗng sẽ trả về mảng trống hoặc tương đương, không phải là giá trị falsey
Jo King

6
Rất nhiều ngôn ngữ được nhập tĩnh không thể trả về nhiều loại từ một hàm
Hiện thân của sự thiếu hiểu biết vào

4
@manassehkatz Có, nhưng chỉ bằng những ngôn ngữ đó. Trong một số ngôn ngữ, nó làm cho các giải pháp trở nên phức tạp hơn, hoặc thậm chí là không thể (ví dụ: các ngôn ngữ được nhập tĩnh).
Jo King

Câu trả lời:



8

Python 3, 58 47 34 byte

Tôi chắc rằng người khác có thể làm tốt hơn Người khác đã làm tốt hơn. Cảm ơn Jo King vì -11 -24 byte!

Đầu ra là không giới hạn, chào mừng đến với địa ngục. Returns danh sách rỗng ( falsy ) trên đầu vào trống

lambda x:[*zip(*[iter(x+"__")]*3)]

TIO




4

APL + THẮNG 36 24 22 byte

12 byte được lưu do kết quả đầu ra hiện đang bị hạn chế và sử dụng mã trong nhận xét đầu tiên của @ Adám được sửa đổi để hoạt động trong APL + WIN và thêm 2 với nhận xét thứ hai. Cảm ơn.

(⌈(↑⍴s)÷3)3⍴(s←⎕),'__'

Nhắc về đầu vào của chuỗi và xuất kết quả dưới dạng mảng nx3

Hãy thử trực tuyến! Lịch sự của Dyalog Classic


@ Adám. Ném lỗi tên miền trong APL + WIN ở bên phải nhất
Graham

Thất bại '', không? Tôi nghĩ OP (vì một số lý do kỳ lạ) đòi hỏi kết quả phải là 0(với bất kỳ thứ hạng nào).
Adám

1
@ Adám Nó tạo ra một mảng 0 x 3. OP bây giờ dường như muốn "falsey" cho đầu vào null. Với thông số kỹ thuật liên tục thay đổi, tôi sẽ cúi đầu vào thời điểm này và để lại câu trả lời của mình như là giá trị của nó! Cảm ơn những cải tiến của bạn.
Graham


3

Perl 6 , 19 byte

{$_~"__"~~m:g/.../}

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

Đệm chuỗi bằng hai dấu gạch dưới sau đó chia chuỗi thành các đoạn gồm ba ký tự. Trả về dưới dạng một mảng các đối tượng Match.


3

Japt , 8 byte

+1 byte cho trường hợp đặc biệt chuỗi rỗng. Có thể lưu 2 nếu chúng ta có thể chọn nhân vật đệm của mình.

©ò3 ú'_3

Thử nó

©ò3 ú'_3     :Implicit input of string
©            :Logical AND with
 ò3          :Split into chunks of 3
    ú'_3     :Right pad each with "_" to length 3


2

CJam , 11 byte

q'_3*+3/);p

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

Đối với đầu vào trống, điều này cung cấp một chuỗi trống, đó là giả.

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

q     e# Read input as a string
'_    e# Push char '_'
3*    e# String formed by that char repeated 3 times
+     e# Concatenate to input string
3/    e# Split in groups of 3, the last of which may be shorter. Gives array of strings
);    e# Detach last string from the array and delete it
p     e# Print string representation of the array

2

Võng mạc 0.8.2 , 10 byte

$
__
!`...

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

$
__

Nối hai _s, trong trường hợp nhóm cuối cùng cần được đệm.

!`...

Ghép càng nhiều nhóm ba càng tốt, xuất ra các trận đấu chứ không phải đếm. (Trong Retina 1, điều này sẽ Lthay vì !.)




1

Thạch , 9 byte

s3o€“___”

Liên kết đơn âm chấp nhận danh sách các ký tự mang lại danh sách các danh sách các ký tự (một đầu vào trống mang lại đầu ra trống).

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

Làm sao?

s3o€“___” - Link: list of characters
s3        - split into chunks of three
   €      - for each chunk:
  o       -   OR (vectorises):
    “___” -     list of characters = ['_', '_', '_']

Ghi chú:
Các chỉ cần thiết để xử lý các trường hợp cạnh của một đầu vào trống.
Một chương trình đầy đủ có thể thả một dấu , nhưng ở đây chúng ta không thể làm điều đó vì hành vi in ​​của một chương trình đầy đủ đập vỡ mọi thứ cùng nhau.


Tương đương 9:

o3ÐƤ“___”

Thử nó


Phương án 9:

;“___”s3Ṗ

Thử nó



1

Java 10, 116 113 byte

s->{s+="__";int l=s.length()/3,i=l;var r=new String[l];for(;i-->0;)r[i]=s.substring(i*3,i*3+3);return l<1?0>1:r;}

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

Hoặc 104 101 byte nếu một mảng trống thay vì falseđược phép làm đầu ra ..

s->{s+="__";int l=s.length()/3;var r=new String[l];for(;l-->0;)r[l]=s.substring(l*3,l*3+3);return r;}

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

Giải trình:

s->{                             // Method with String as both parameter and return-type
  s+="__";                       //  Append two "_" to the input-String
  int l=s.length()/3;            //  Get the length, integer-divided by 3
  var r=new String[l];           //  Create a string-array with that many parts
  for(;l-->0;)                   //  Loop `l` in the range (l, 0]:
    r[l]=                        //   Set the `l`'th value of the array to:
         s.substring(l*3,l*3+3); //   Get the substring of size 3 from index `l*3` from `s`
  return r;}                     //  Return the array

Một mảng trống hiện được cho phép
Benjamin Urquhart

1

Ruby, 73 42 byte

a=gets
a.length!=0?a.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}:'falsey value'

Chỉnh sửa: Vì giá trị falsey có vẻ như không bắt buộc:

gets.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}

1
Phần đệm tối đa là 2 ký tự, vì vậy '_'*2sẽ là đủ, với nghĩa đen '__'là ngắn hơn. Nhưng nếu bạn thêm phần đệm trước thì đơn giản là không khớp với các phần ngắn hơn 3 ký tự, thì ngắn hơn : puts"#{gets}__".scan /.../. (Lưu ý rằng không có in rõ ràng được coi là irbkhông ruby.)
manatwork





1

Bash , 90 byte

Điều này sử dụng các tính năng Bash chứ không phải là sự kết hợp của các lệnh Bourne shell truyền thống cộng với các lệnh * nix (mà một phiên bản tôi đã tạo kết thúc ở mức 205 byte). Tôi đã gian lận bằng cách sử dụng né tránh thêm hai ký tự _ vào chuỗi.

c=;read a;a=${a}__;while (($(echo ${#a})>2));do b=${a:0:3};c=$c\ $b;a=${a#$b};done;echo $c

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



1

GNU sed , 27 byte

s:$:__:
s:...:& :g
s: _*$::

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

Nó có một chút khó khăn liên quan đến đầu vào chuỗi trống, vì sed không có nghĩa là giá trị giả. Vì vậy, để giải quyết vấn đề này, tôi cung cấp cho bạn hai cách giải thích về các quy tắc để xác thực việc gửi của tôi:


A. Về cơ bản, bạn không cung cấp gì làm đầu vào, thậm chí không phải là một dòng mới (vì đây là trường hợp với tất cả các ví dụ, bao gồm cả tệp 6 Mb đó).

Sử dụng:

echo -n ""|sed -f script

Đầu ra: không có gì được in, vì sed thậm chí không chạy tập lệnh mà không có đầu vào.


B. Người ta có thể coi là giá trị giả cho sed là một chuỗi duy nhất, nghĩa là chỉ được trả về khi đầu vào là một chuỗi rỗng.

Sử dụng:

echo ""|sed -f script

Đầu ra:

__

Tôi thích cách giải thích đầu tiên hơn rất nhiều, vì tôi tin rằng nó là gần nhất với quy tắc dự định, nhưng cách giải thích cuối cùng sẽ giúp nếu bạn chạy tập lệnh bằng liên kết TIO đó.




0

Tùy viên , 34 23 byte

PadRight&"_"&3=>@Chop&3

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

Giải thích (lỗi thời)

{On[#_-1,PadRight&"_"&3,_]}@Chop&3
                           @Chop&3    chop the input string into groups of 3s
{On[#_-1               ,_]}           on the last group
        ,PadRight                         pad it
                     &3                   to length three
                 &"_"                     with underscores

Bạn có tiết kiệm được gì không bằng cách đệm tất cả các yếu tố thay vì chỉ phần tử cuối cùng?
Xù xì

@Shaggy Điểm tốt! Tôi sẽ xem xét nó
Conor O'Brien

0

Than , 10 byte

E⪪S³…⁺ι__³

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

  S         Input string
 ⪪ ³        Split into groups of up to 3 characters
E           Map over each group
      ι     Current group
     ⁺      Concatenated with
       __   Literal `__`
    …    ³  Moulded to length 3
            Each group implicitly printed on its own line


0

Befunge-93 , 30 29 byte

~:1+%,~:1+!"`"*+,~:1+!"`"*+,,

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

Đầu ra không có gì cho đầu vào trống, nếu không, đầu ra các chuỗi có độ dài 3 được phân tách bằng các ký tự NUL.

Giải trình:

~ Đẩy ký tự đầu vào vào ngăn xếp
 : 1+ Sao chép đầu vào và thêm 1
    % Modulo top 2 giá trị của stack và kết quả đẩy
                                Nếu đầu vào là -1 (cuối luồng), hãy tính -1% 0 -> tạm dừng
                                Nếu không thì tính% đầu vào (đầu vào + 1) -> đầu vào
     , Pop và ký tự đầu ra
      ~ Đẩy ký tự đầu vào vào ngăn xếp
       : 1+! Sao chép đầu vào, thêm 1 và thực hiện logic KHÔNG
           "` "* Nhân với 96 (mã ASCII cho '`')
                                Điều này trả về 96 hoặc 0 tùy thuộc vào kết quả của KHÔNG
               + Thêm 2 giá trị hàng đầu từ ngăn xếp và đẩy kết quả
                                Nếu đầu vào là -1 (cuối luồng), đẩy -1 + 96 = 95 hoặc mã ASCII cho '_'
                                Nếu không thì đẩy đầu vào + 0
                , Pop và ký tự đầu ra
                 ~: 1 +! "` "* +, Cùng một khối lần nữa để xử lý ký tự thứ ba
                            , Xuất ra một ký tự NUL (ngăn xếp trống, do đó, xuất hiện từ ngăn xếp chỉ trả về 0)

Con trỏ lệnh bao quanh ở cuối, lặp lại toàn bộ dòng.
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.