แบ่งออกเป็นสาม!


16

รับสตริงคุณต้องแบ่งมันออกเป็นกลุ่มของอักขระสามตัว (โดยการเติม_ที่ท้าย)

ที่เกี่ยวข้องแต่ก็ยังแตกต่างกัน


ตัวอย่าง I / O:

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

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

  • '' -> [] or falsey value

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

  • สตริง 6 MB

นี่คือดังนั้นไบต์ที่น้อยที่สุดจึงจะชนะ!

แก้ไข:ในที่สุดการส่งออกคือไม่ จำกัด


10
ทำไมสตริงพิเศษว่างเปล่า เราขอเลือกตัวละครตัวไหนที่จะใช้สำหรับการรอง?
Shaggy

12
ดังนั้นงานจึงเป็นจริง: รับสตริงกลับค่าเท็จถ้ามันว่างเปล่ามิฉะนั้นแบ่งออกเป็นกลุ่มของสาม, padding กับขีดล่างถ้าจำเป็น ? ดูเหมือนว่าเป็นคู่ที่แปลกประหลาดของงานที่ไม่เกี่ยวข้องสองอย่าง (ตรวจสอบความยาวสตริงและการแยก)
อดัม

15
สิ่งที่ควรหลีกเลี่ยง: กรณีขอบเจ๋ง ในกรณีนี้สตริงว่างควรส่งคืนอาร์เรย์ว่างหรือเทียบเท่าไม่ใช่ค่าเท็จ
Jo King

6
ภาษาที่พิมพ์แบบสแตติกจำนวนมากไม่สามารถส่งคืนได้มากกว่าหนึ่งประเภทจากฟังก์ชั่น
ศูนย์รวมของความไม่รู้

4
@manassehkatz ใช่ แต่เฉพาะในภาษาเหล่านั้น ในบางภาษาจะทำให้การแก้ปัญหามีความซับซ้อนมากขึ้นหรือเป็นไปไม่ได้ (เช่นภาษาที่พิมพ์แบบคงที่)
Jo King

คำตอบ:



8

Python 3, 58 47 34 ไบต์

ฉันแน่ใจว่าคนอื่นทำได้ดีกว่าคนอื่นทำได้ดีกว่า ขอบคุณ Jo King สำหรับ-11 -24 ไบต์!

การส่งออกไม่ จำกัด ยินดีต้อนรับสู่ tuple นรก ส่งคืนรายการว่าง ( falsy ) จากอินพุตว่าง

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

TIO




4

APL + ชนะ36 24 22 ไบต์

บันทึก 12 ไบต์เนื่องจากผลลัพธ์ถูกยกเลิกการ จำกัด และใช้รหัสในความคิดเห็นแรกของ @ Adámที่แก้ไขเพื่อให้ทำงานใน APL + WIN และอีก 2 ด้วยความคิดเห็นที่สองของเขา ขอบคุณ

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

Prompts for input of the string and outputs the result as a nx3 array

Try it online! Courtesy of Dyalog Classic


@Adám. Throws a domain error in APL+WIN at the right most ⍴
Graham

Fails on '', no? I think OP (for some strange reason) requires the result to be 0 (with any rank).
Adám

1
@Adám It produces a 0 x 3 array. The OP now appears to want "falsey" for a null input. With the spec keeping on changing I am going to bow out at this point and leave my answer as its stands! Thanks for your improvements.
Graham



3

Japt, 8 bytes

+1 byte to special case the empty string. Can save 2 if we can choose our padding character.

©ò3 ú'_3

Try it

©ò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 bytes

q'_3*+3/);p

Try it online!

For empty input this gives an empty string, which is falsy.

How it works

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

Retina 0.8.2, 10 bytes

$
__
!`...

Try it online! Link includes test cases. Explanation:

$
__

Append two _s, in case the last group needs to be padded.

!`...

Match as many groups of three as possible, outputting the matches themselves rather than the count. (In Retina 1 this would be L instead of !.)




1

Jelly, 9 bytes

s3o€“___”

A monadic Link accepting a list of characters which yields a list of lists of characters (an empty input yields empty output).

Try it online!

How?

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

Notes:
The is only necessary to handle the edge case of an empty input.
A full program can drop a trailing , but here we can't do that as the printing behaviour of a full program smashes everything together.


Equivalent 9:

o3ÐƤ“___”

Try it


Alternative 9:

;“___”s3Ṗ

Try it



1

Java 10, 116 113 bytes

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

Try it online.

Or 104 101 bytes if an empty array instead of false is allowed as output..

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

Try it online.

Explanation:

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

An empty array is now allowed
Benjamin Urquhart

1

Ruby, 73 42 bytes

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

Edit: As falsey value looks like it's not required:

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

1
The maximum padding is of 2 characters, so '_'*2 would be enough, for which a literal '__' is shorter. But if you add the padding in advance then simply not match the pieces shorter than 3 characters, is shorter: puts"#{gets}__".scan /.../. (Note that without the explicit printing that is considered irb not ruby.)
manatwork





1

Bash, 90 bytes

This uses Bash features rather than a combination of more traditional Bourne shell plus *nix commands (which one version I created ended up at 205 bytes). I cheated by using the dodge of adding two _ characters to the string.

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

Try it online!



1

GNU sed, 27 bytes

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

Try it online!

It gets a bit tricky regarding the empty string input, since sed has no meaning of a falsy value. So to deal with this, I provide you with two possible interpretations of the rules to validate my submission:


A. You essentially provide nothing as input, not even a trailing newline (as it is the case with all the examples, including that 6 Mb file).

Usage:

echo -n ""|sed -f script

Output: nothing is printed, because sed doesn't even run the script without input.


B. One could consider as falsy value for sed to be an unique string, i.e., returned only when the input is an empty string.

Usage:

echo ""|sed -f script

Output:

__

I prefer the first interpretation so much more, as I believe it to be the closest to the intended rule, but the last one helps if you run the script using that TIO link.




0

Attache, 34 23 bytes

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

Try it online!

Explanation (outdated)

{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

Would you save anything by padding all the elements instead of just the last one?
Shaggy

@Shaggy Good point! I’ll look into it
Conor O'Brien

0

Charcoal, 10 bytes

E⪪S³…⁺ι__³

Try it online! Link is to verbose version of code. Explanation:

  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 bytes

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

Try it online!

Outputs nothing for an empty input, otherwise outputs strings of length 3 separated by NUL characters.

Explanation:

~                               Push character of input to stack
 :1+                            Duplicate input and add 1
    %                           Modulo top 2 values of stack and push result
                                If input was -1 (end of stream), calculate -1%0 -> halt
                                Otherwise calculate input%(input+1) -> input
     ,                          Pop and output character
      ~                         Push character of input to stack
       :1+!                     Duplicate input, add 1 and perform logical NOT
           "`"*                 Multiply by 96 (ASCII code for '`')
                                This returns 96 or 0 depending on the result of the NOT
               +                Add the top 2 values from the stack and push the result
                                If the input was -1 (end of stream), pushes -1+96=95, or the ASCII code for '_'
                                Otherwise pushes input+0
                ,               Pop and output character
                 ~:1+!"`"*+,    Same block again to handle the third character
                            ,   Output a NUL character (stack is empty, so popping from stack just returns 0)

The instruction pointer wraps around at the end, looping the entire line.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.