3つに分割します!


16

文字列が与えられたら、それを3文字のグループに分割する必要があります(_最後にパディングすることにより)。

関連しますが、それでも異なります。


サンプルI / O:

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

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

  • '' -> [] or falsey value

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

  • 6 MBストリング

これはなので、最少バイトが勝ちます!

編集:最後に、出力は無制限です。


10
空の文字列が特別な場合 パディングに使用する文字を選択できますか?
シャギー

12
したがって、タスクは実際には次のとおりです。文字列を指定すると、空の場合はfalsey値を返し、そうでない場合は3つのグループに分割し、必要に応じてアンダースコアを埋め込みますか?2つの無関係なタスク(文字列の長さのチェックと分割)の奇妙なペアのようです。
アダム

14
避けるべきこと:例外的なエッジケース。この場合、空の文字列は空の配列または同等の、ないfalsey値returnan必要があります
ジョー・キング

6
静的に型付けされた言語の多くは、関数から複数の型を返すことはできません
無知の具現化

4
@manassehkatzはい、ただしそれらの言語でのみ。一部の言語では、ソリューションがはるかに複雑になったり、不可能になったりします(静的に型付けされた言語など)。
ジョーキング

回答:



8

Python 3、58 47 34バイト

他の誰かがもっとうまくやれると確信しています。-11 -24バイトをありがとう、ジョーキング!

出力は無制限です。タプル地獄へようこそ。空の入力で空のリスト(falsy)を返します

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

TIO




4

APL + WIN 36 24 22バイト

出力の制限が解除され、APL + WINで機能するように修正された@Adámの最初のコメントのコードと、2番目のコメントの2を使用した結果、12バイトが節約されました。ありがとう。

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

文字列の入力を要求し、結果をnx3配列として出力します

オンラインでお試しください!Dyalog Classic提供


@アダム。⍴右せいぜいAPL + WINのドメインエラーがスローされます
グラハム

失敗します''、いいえ?OP(何らかの奇妙な理由で)は、結果が0(任意のランクで)である必要があると思います。
アダム

1
@Adám0 x 3配列を生成します。OPは、null入力に対して「falsey」を要求するようになりました。仕様が変化し続けているので、この時点でお辞儀をし、私の答えをそのままにしておきます!改善していただきありがとうございます。
グラハム



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

Retina 0.8.2、10バイト

$
__
!`...

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

$
__

_最後のグループをパディングする必要がある場合に備えて、2を追加します。

!`...

3つのグループをできるだけ多く一致させ、カウントではなく一致自体を出力します。(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

Java 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

ルビー、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

Bash、90バイト

これは、従来のBourneシェルと* nixコマンド(私が作成した1つのバージョンが最終的に205バイトになった)の組み合わせではなく、Bash機能を使用しています。文字列に2つの_文字を追加するという回避策を使用してごまかしました。

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には偽の値の意味がないため、空の文字列入力に関して少し注意が必要です。したがって、これに対処するために、私はあなたの提出を検証するためのルールの2つの可能な解釈を提供します:


A.基本的に、入力として何も提供せず、末尾の改行すら提供しません(その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

Befunge-9330の 29バイト

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

オンラインでお試しください!

空の入力に対しては何も出力しません。それ以外の場合は、NUL文字で区切られた長さ3の文字列を出力します。

説明:

〜入力の文字をスタックにプッシュ
 :1+入力を複製して1を追加
    スタックおよびプッシュ結果の上位2つのモジュロ値
                                入力が-1(ストリームの終わり)だった場合、-1%0-> haltを計算します
                                それ以外の場合は、input%(input + 1)-> inputを計算します
     、ポップおよび出力文字
      〜入力の文字をスタックにプッシュ
       :1+!入力を複製し、1を追加して論理NOTを実行します
           "` "* 96で乗算( '`'のASCIIコード)
                                これは、NOTの結果に応じて96または0を返します
               +スタックから上位2つの値を追加し、結果をプッシュします
                                入力が-1(ストリームの終わり)の場合、-1 + 96 = 95、または '_'のASCIIコードをプッシュします
                                それ以外の場合は、input + 0をプッシュします
                、ポップおよび出力文字
                 〜:1 +! "` "* +、3番目の文字を処理するための同じブロック
                            、NUL文字を出力します(スタックは空なので、スタックからポップすると0が返されます)

命令ポインタは最後で折り返され、行全体をループします。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.