一分为三!


16

给定一个字符串,您必须将其分成三个字符的组(_末尾填充)。

相关的,但仍然有所不同。


样本I / O:

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

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

  • '' -> [] or falsey value

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

  • 6 MB字串

这是一个,因此将赢得最少的字节!

编辑:最后,输出不受限制


10
为什么特殊情况下使用空字符串?我们可以选择填充哪个字符吗?
毛茸茸的

12
因此任务实际上是:给定一个字符串,如果为空则返回falsey值,否则将其分成三组,必要时用下划线填充?看起来像是两个不相关任务的奇特配对(检查字符串长度和拆分)。
阿达姆

15
避免的事情:特殊情况。在这种情况下,空字符串应返回空数组或等效数组,而不是假值
Jo King

6
许多静态类型的语言不能从一个函数中返回多种类型
无知的体现

4
@manassehkatz是的,但仅适用于这些语言。在某些语言中,它使解决方案变得更加复杂,甚至是不可能的(例如,静态类型的语言)。
乔·金

Answers:






4

APL + WIN 36 24 22字节

现在取消了对输出结果的限制,节省了12个字节,并使用@Adám的第一个注释中的代码进行了修改,使其可在APL + WIN中使用,而第二个注释的第二个注释中则使用了该代码。谢谢。

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

提示输入字符串并将结果输出为nx3数组

在线尝试!由Dyalog Classic提供


@亚当。最右边的APL + WIN中引发域错误
Graham

失败了'',不是吗?我认为OP(出于某种奇怪的原因)要求结果必须是0(具有任何等级)。
阿达姆

1
@Adám它产生一个0 x 3的数组。现在,OP似乎要为空输入输入“ false”。随着规格的不断变化,我将在这一点上鞠躬致辞,让我的答案保持不变!感谢您的改进。
格雷厄姆



3

Japt,8字节

+1个字节(特殊情况下为空字符串)。如果我们可以选择填充字符,则可以节省2。

©ò3 ú'_3

尝试一下

©ò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个字节

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

2

视网膜0.8.2,10字节

$
__
!`...

在线尝试!链接包括测试用例。说明:

$
__

_如果需要填充最后一组,请追加两个。

!`...

尽可能多地匹配三个一组,输出匹配项本身而不是计数。(在Retina 1中,它将L代替!。)




1

果冻,9 字节

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Ṗ

尝试一下



1

爪哇10,116个 113字节

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

现在允许使用空数组
本杰明·厄克特

1

Ruby,73个 42字节

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

1
最大填充为2个字符,因此'_'*2就足够了,因为其文字'__'较短。但是,如果您预先添加了填充,则根本不会匹配少于3个字符的片段,即:puts"#{gets}__".scan /.../。(请注意,如果没有显式打印,则认为irb不是ruby。)
manatwork





1

重击,90个字节

它使用Bash功能,而不是结合使用更传统的Bourne Shell和* nix命令(我创建的那个版本最终以205个字节结尾)。我通过在字符串中添加两个_字符来躲避欺骗。

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

在线尝试!



1

GNU sed,27个字节

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

在线尝试!

由于sed没有虚假值的含义,因此对于空字符串输入会有些棘手。因此,为了解决这个问题,我为您提供了两种可能的规则解释,以验证我的提交:


答:实际上,您没有提供任何输入,甚至没有结尾的换行符(所有示例,包括6 Mb文件)都是如此。

用法:

echo -n ""|sed -f script

输出:不打印任何内容,因为sed甚至在没有输入的情况下也不运行脚本。


B.可以将sed的假值视为唯一字符串,即仅当输入为空字符串时才返回。

用法:

echo ""|sed -f script

输出:

__

我更喜欢第一种解释,因为我认为它最接近预期的规则,但是如果您使用该TIO链接运行脚本,则最后一种会有所帮助。




0

附件34 23字节

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

在线尝试!

说明(过时)

{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

您会通过填充所有元素而不是最后一个元素来节省任何东西吗?
蓬松的

@Shaggy好点!我会考虑它
康纳尔奥布莱恩

0

木炭,10字节

E⪪S³…⁺ι__³

在线尝试!链接是详细版本的代码。说明:

  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

Scala,31个字节

(s+"___").grouped(3).toSeq.init

在线尝试!

说明

(s+"___")       // add "___"
  .grouped(3)   // make groups of 3
  .toSeq        // change to Seq
  .init         // take all but last

0

Befunge-9330 29个字节

~: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)

指令指针在末尾回绕,循环整行。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.