给定一个字符串,您必须将其分成三个字符的组(
_末尾填充)。相关的,但仍然有所不同。
样本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,_]&
将字符列表作为输入。返回一个三元组的字符列表,其中用Blanks(_)填充。
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 arraya=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)
指令指针在末尾回绕,循环整行。