| Bytes | Lang | Time | Link |
|---|---|---|---|
| 045 | AWK | 241129T194717Z | xrs |
| 006 | Japt | 190519T144708Z | Shaggy |
| 021 | Wolfram Language Mathematica | 190519T225604Z | att |
| 040 | Haskell | 240203T211243Z | user1210 |
| 021 | Rattle | 240203T165031Z | d01 |
| 816 | Nibbles | 240203T102524Z | 鳴神裁四点一号 |
| 008 | Uiua SBCS | 240202T020304Z | chunes |
| 005 | Thunno 2 | 230726T112520Z | The Thon |
| 007 | Vyxal | 220426T030716Z | naffetS |
| 027 | Factor + grouping.extras | 220426T033215Z | chunes |
| 006 | Jelly | 210416T111529Z | caird co |
| 021 | Ruby | 210414T152216Z | Asone Tu |
| 006 | Husk | 201205T162453Z | Razetime |
| 063 | C clang | 190519T163108Z | a stone |
| 010 | GolfScript | 200326T090059Z | user9206 |
| 060 | APLNARS | 190608T215608Z | user5898 |
| 027 | GNU sed | 190608T171655Z | seshouma |
| 040 | Julia 1.0 | 190603T193523Z | gggg |
| 093 | SNOBOL4 CSNOBOL4 | 190603T191946Z | Giuseppe |
| 059 | Haskell | 190524T172157Z | pommicke |
| 084 | GoLang | 190526T123532Z | salixor |
| 093 | Rust | 190525T053718Z | Jakob |
| 035 | PowerShell | 190524T212254Z | Andrei O |
| 025 | JavaScript | 190522T221445Z | Luvexina |
| 009 | Pyth | 190519T193942Z | uanirudh |
| 029 | Befunge93 | 190522T164457Z | negative |
| 090 | Bash | 190521T145200Z | PJF |
| 055 | C gcc | 190520T152245Z | l4m2 |
| 034 | Kotlin | 190520T151652Z | snail_ |
| 015 | Perl 5 | 190519T150418Z | Kjetil S |
| 031 | Scala | 190520T110454Z | pme |
| 074 | C# Visual C# Interactive Compiler | 190520T120149Z | Innat3 |
| 042 | Ruby | 190520T095326Z | Max Lang |
| 113 | Java 10 | 190520T084142Z | Kevin Cr |
| 016 | J | 190520T064131Z | Galen Iv |
| 067 | C gcc | 190519T230709Z | att |
| 010 | Charcoal | 190519T223149Z | Neil |
| 010 | Retina 0.8.2 | 190519T222315Z | Neil |
| 023 | Attache | 190519T194725Z | Conor O& |
| 025 | JavaScript | 190519T205332Z | Shaggy |
| 009 | Jelly | 190519T192833Z | Jonathan |
| 008 | 05AB1E | 190519T130104Z | Emigna |
| 010 | Jelly | 190519T163655Z | Nick Ken |
| 034 | Python 3 | 190519T122400Z | Benjamin |
| 011 | CJam | 190519T151945Z | Luis Men |
| 022 | APL+WIN | 190519T124615Z | Graham |
| 007 | Stax | 190519T150242Z | recursiv |
| 045 | JavaScript Babel Node | 190519T150210Z | Luis fel |
| 019 | Perl 6 | 190519T122923Z | Jo King |
AWK, 59 45 bytes
{for(;length%3;)$0=$0"_";gsub(/(...)/,"& ")}1
59 bytes
{for($0=$0"__";i++<(NF-2)/3*3;i+=2)printf$i$(i+1)$(i+2)" "}
{for(;length%3;)$0=$0"_"; # tail padding
gsub(/(...)/,"& ")} # matches groups of three
1 # print
Wolfram Language (Mathematica), 28 21 bytes
-7: No longer requires falsy (False) value on empty input
Apparently this has been wrong for 5 years (trivial fix)
Partition[#,3,3,1,_]&
Takes a list of characters as input. Returns a list of 3-tuples of characters padded with Blanks (_).
34 27 bytes
StringPartition[#<>"__",3]&
String input, list of strings output
Haskell, 40 bytes
f(a:b:c:t)=[a,b,c]:f t
f _=[]
f.(++"__")
Rattle, 21 bytes
\__|!II^/3P[[gb>]3B]`
Outputs groups of 3 separated by newlines.
Explanation:
\__| take input and concatenate "__"
! disable implicit output
I save characters of the input in consecutive memory slots
I^ get length of the input
/3 divide by 3 to get n
[...]` loop n times (ignoring any values after the decimal point)
[...]3 loop 3 times
g get the character at the pointer
b add this character to the print buffer
> move pointer right
B print contents of buffer and reset
Nibbles, 8 bytes (16 nibbles)
In literal form:
`/3;_<3:$"__"
`/ chunks of
3 3 characters
;_ for input string
then, apply map(\chunk->...):
<3 take first 3 characters of
:$"__" concatenation of chunk and "__"
Thunno 2, 5 bytes
³'_3Ŀ
³'_ƬṬ
Explanation
³'_3Ŀ '# Implicit input
³ # Split into threes
Ŀ # Left-justify each,
'_ '# padding with "_"s
3 # to length 3
# Implicit output
³'_ƬṬ '# Implicit input
³ # Split into threes
Ƭ # Transpose with
'_ '# filler "_"
Ṭ # Tranpose again
# Implicit output
Vyxal, 7 bytes
3ẇ∩\_ÞṪ
How?
3ẇ∩\_ÞṪ
3ẇ # Split into chunks of three
∩ # Transpose
\_ÞṪ # Transpose with "_" as filler
Jelly, 6 bytes
s3Zz”_
How it works
s3Zz”_ - Main link. Takes a string S on the left
s3 - Split into chunks of 3
Z - Transpose
z”_ - Transpose, using "_" as a filler
Husk, 9 6 bytes
TT'_C3
look ma, no unicode!(-3)
Explanation
TT'_C3
C3 cut into pieces of 3
T'_ transpose, padding with underscore
T transpose again
C (clang), 128 126 94 67 63 bytes
63 bytes thanks to @ceilingcat.
f(char*k){for(;*k;k++)printf("%c%c%c\n",*k,*++k?:95,*++k?:95);}
APL(NARS), 30 chars, 60 bytes
{(3/⍳3÷⍨≢v)⊂v←⍵,'_'⍴⍨3∣3-3∣≢⍵}
test:
f←{(3/⍳3÷⍨≢v)⊂v←⍵,'_'⍴⍨3∣3-3∣≢⍵}
⎕fmt f 'abcde'
┌2────────────┐
│┌3───┐ ┌3───┐│
││ abc│ │ de_││
│└────┘ └────┘2
└∊────────────┘
⎕fmt f '1234'
┌2────────────┐
│┌3───┐ ┌3───┐│
││ 123│ │ 4__││
│└────┘ └────┘2
└∊────────────┘
⎕fmt f ''
┌0──┐
│┌0┐│
││ ││
│└¯┘2
└∊──┘
⎕fmt f 'Three spree!'
┌4──────────────────────────┐
│┌3───┐ ┌3───┐ ┌3───┐ ┌3───┐│
││ Thr│ │ ee │ │ spr│ │ ee!││
│└────┘ └────┘ └────┘ └────┘2
└∊──────────────────────────┘
GNU sed, 27 bytes
s:$:__:
s:...:& :g
s: _*$::
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.
SNOBOL4 (CSNOBOL4), 93 bytes
S =INPUT
S =S DUPL('_',REMDR(3 - REMDR(SIZE(S),3),3))
R S LEN(3) . OUTPUT REM . S :S(R)
END
SNOBOL has a size limit on the length of its input (1023 bytes).
Haskell, 62 61 59 bytes
z(a:b:c:d)=[a,b,c]:z d
f s=takeWhile(/="___")$z$s++cycle"_"
Infinite lists and strings!
GoLang, 84 bytes
func(x string)[]string{return regexp.MustCompile("...").FindAllString(x+"__",-1)}(s)
Rust, 93 bytes
Works for ASCII input strings. Empties the input string and returns a Vec<String>.
|mut s:String|{s+="__";let mut v=vec![];while s.len()>2{let t=s.split_off(3);v.push(s);s=t}v}
Pyth, 10 9 bytes
Pc+z*3\_3
-1 from u_ndefined.
Is it ok if it throws an error on empty input? (does that count as falsey)
Befunge-93, 30 29 bytes
~:1+%,~:1+!"`"*+,~:1+!"`"*+,,
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.
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
Scala, 31 bytes
(s+"___").grouped(3).toSeq.init
Explanation
(s+"___") // add "___"
.grouped(3) // make groups of 3
.toSeq // change to Seq
.init // take all but last
C# (Visual C# Interactive Compiler), 74 bytes
Just append two underscores '_' at the end of the input to make sure they get printed if the length of the input isn't a factor of 3.
s=>Enumerable.Range(0,(s.Length+2)/3).Select(i=>(s+"__").Substring(i*3,3))
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]}
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;}
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;}
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
C (gcc), 67 bytes
i;f(char*_){for(;*_;puts(""))for(i=3;i--;)putchar(*_?*_++:95);_=0;}
Always returns a falsey value (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
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 !.)
Attache, 34 23 bytes
PadRight&"_"&3=>@Chop&3
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
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).
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ÐƤ“___”
Alternative 9:
;“___”s3Ṗ
05AB1E, 9 8 bytes
…___«3ô¨
Try it online! or as a Test Suite
Explanation
…___« # append "___" to input
3ô # split into groups of 3
¨ # discard the last group
Python 3, 58 47 34 bytes
I'm sure someone else can do better Someone else did better. Thanks Jo King for -11 -24 bytes!
Output is unrestricted, welcome to tuple hell. Returns empty list (falsy) on empty input
lambda x:[*zip(*[iter(x+"__")]*3)]
CJam, 11 bytes
q'_3*+3/);p
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
APL+WIN 36 24 22 bytes
12 bytes saved as a result of output now being de-restricted and using the code in @Adám's first comment modified to work in APL+WIN and a further 2 with his second comment. Thanks.
(⌈(↑⍴s)÷3)3⍴(s←⎕),'__'
Prompts for input of the string and outputs the result as a nx3 array
Stax, 7 bytes
é☻εgP▀╪
For an empty string input, the result is an empty array, which is a falsey value in stax.
Perl 6, 19 bytes
{$_~"__"~~m:g/.../}
Pads the string by two underscores then splits the string into chunks of three characters. Returns as an array of Match objects.
