给定一个字符串,您必须将其分成三个字符的组(
_
末尾填充)。相关的,但仍然有所不同。
样本I / O:
'abcde' -> 'abc', 'de_'
'1234' -> '123', '4__'
'' -> [] or falsey value
'Three spree!' -> 'Thr', 'ee ', 'spr', 'ee!'
这是一个代码高尔夫球,因此将赢得最少的字节!
编辑:最后,输出不受限制。
给定一个字符串,您必须将其分成三个字符的组(
_
末尾填充)。相关的,但仍然有所不同。
样本I / O:
'abcde' -> 'abc', 'de_'
'1234' -> '123', '4__'
'' -> [] or falsey value
'Three spree!' -> 'Thr', 'ee ', 'spr', 'ee!'
这是一个代码高尔夫球,因此将赢得最少的字节!
编辑:最后,输出不受限制。
Answers:
我确信其他人可以做得更好。感谢Jo King -11 -24字节!
输出不受限制,欢迎进入元组。在空输入上返回空列表(falsy)
lambda x:[*zip(*[iter(x+"__")]*3)]
现在取消了对输出结果的限制,节省了12个字节,并使用@Adám的第一个注释中的代码进行了修改,使其可在APL + WIN中使用,而第二个注释的第二个注释中则使用了该代码。谢谢。
(⌈(↑⍴s)÷3)3⍴(s←⎕),'__'
提示输入字符串并将结果输出为nx3数组
''
,不是吗?我认为OP(出于某种奇怪的原因)要求结果必须是0
(具有任何等级)。
q'_3*+3/);p
对于空输入,这将给出一个空字符串,该字符串是虚假的。
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
$
__
!`...
在线尝试!链接包括测试用例。说明:
$
__
_
如果需要填充最后一组,请追加两个。
!`...
尽可能多地匹配三个一组,输出匹配项本身而不是计数。(在Retina 1中,它将L
代替!
。)
-7:False
在空输入时不再需要falsy()值
Partition[#,3,1,1,_]&
将字符列表作为输入。返回一个三元组的字符列表,其中用Blank
s(_
)填充。
StringPartition[#<>"__",3]&
字符串输入,字符串输出列表
s3o€“___”
单子链接接受一个字符列表,该列表产生一个字符列表(一个空输入产生一个空输出)。
s3o€“___” - Link: list of characters
s3 - split into chunks of three
€ - for each chunk:
o - OR (vectorises):
“___” - list of characters = ['_', '_', '_']
注意:
该€
只需要处理一个空的输入的边缘情况。
完整程序可以拖尾”
,但是在这里我们不能这样做,因为完整程序的打印行为会将所有内容粉碎在一起。
等值9:
o3ÐƤ“___”
备选方案9:
;“___”s3Ṗ
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;}
或104 101字节(如果false
允许使用空数组代替)作为输出。
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;}
说明:
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
a=gets
a.length!=0?a.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}:'falsey value'
编辑:由于falsey值看起来不是必需的:
gets.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}
'_'*2
就足够了,因为其文字'__'
较短。但是,如果您预先添加了填充,则根本不会匹配少于3个字符的片段,即:puts"#{gets}__".scan /.../
。(请注意,如果没有显式打印,则认为irb
不是ruby
。)
只需在输入末尾添加两个下划线'_',以确保在输入长度不是3的倍数的情况下将其打印出来。
s=>Enumerable.Range(0,(s.Length+2)/3).Select(i=>(s+"__").Substring(i*3,3))
s:$:__:
s:...:& :g
s: _*$::
由于sed没有虚假值的含义,因此对于空字符串输入会有些棘手。因此,为了解决这个问题,我为您提供了两种可能的规则解释,以验证我的提交:
答:实际上,您没有提供任何输入,甚至没有结尾的换行符(所有示例,包括6 Mb文件)都是如此。
用法:
echo -n ""|sed -f script
输出:不打印任何内容,因为sed甚至在没有输入的情况下也不运行脚本。
B.可以将sed的假值视为唯一字符串,即仅当输入为空字符串时才返回。
用法:
echo ""|sed -f script
输出:
__
我更喜欢第一种解释,因为我认为它最接近预期的规则,但是如果您使用该TIO链接运行脚本,则最后一种会有所帮助。
~:1+%,~:1+!"`"*+,~:1+!"`"*+,,
空输入不输出任何内容,否则输出由NUL字符分隔的长度为3的字符串。
说明:
〜将输入字符推入堆栈 :1+重复输入并加1 %Modulo堆栈和推入结果的前2个值 如果输入为-1(流的末尾),则计算-1%0->暂停 否则计算输入%(输入+1)->输入 ,弹出并输出字符 〜将输入字符推入堆栈 :1+!输入重复,加1并执行逻辑非 “`” *乘以96(“`”的ASCII码) 根据NOT的结果返回96或0 +从堆栈中添加前2个值并推送结果 如果输入为-1(流的末尾),则按-1 + 96 = 95或'_'的ASCII码 否则按输入+0 ,弹出并输出字符 〜:1 +!“`” * +,再次使用相同的块来处理第三个字符 ,输出一个NUL字符(堆栈为空,因此从堆栈弹出仅返回0) 指令指针在末尾回绕,循环整行。