文字列が与えられたら、それを3文字のグループに分割する必要があります(
_最後にパディングすることにより)。関連しますが、それでも異なります。
サンプルI / O:
'abcde' -> 'abc', 'de_''1234' -> '123', '4__''' -> [] or falsey value'Three spree!' -> 'Thr', 'ee ', 'spr', 'ee!'
これはcode-golfなので、最少バイトが勝ちます!
編集:最後に、出力は無制限です。
文字列が与えられたら、それを3文字のグループに分割する必要があります(
_最後にパディングすることにより)。関連しますが、それでも異なります。
サンプルI / O:
'abcde' -> 'abc', 'de_' 
'1234' -> '123', '4__'
'' -> [] or falsey value
'Three spree!' -> 'Thr', 'ee ', 'spr', 'ee!'
これはcode-golfなので、最少バイトが勝ちます!
編集:最後に、出力は無制限です。
回答:
…___«3ô¨
オンラインでお試しください! またはテストスイートとして
説明
…___«      # append "___" to input
     3ô    # split into groups of 3
       ¨   # discard the last group
              他の誰かがもっとうまくやれると確信しています。-11 -24バイトをありがとう、ジョーキング!
出力は無制限です。タプル地獄へようこそ。空の入力で空のリスト(falsy)を返します
lambda x:[*zip(*[iter(x+"__")]*3)]
              出力の制限が解除され、APL + WINで機能するように修正された@Adámの最初のコメントのコードと、2番目のコメントの2を使用した結果、12バイトが節約されました。ありがとう。
(⌈(↑⍴s)÷3)3⍴(s←⎕),'__'
文字列の入力を要求し、結果をnx3配列として出力します
''、いいえ?OP(何らかの奇妙な理由で)は、結果が0(任意のランクで)である必要があると思います。
                    特別な場合は空の文字列に+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
              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を追加します。
!`...
3つのグループをできるだけ多く一致させ、カウントではなく一致自体を出力します。(Retina 1 Lでは、これはの代わりになり!ます。)
-7:False空の入力でfalsy()値を必要としなくなりました
Partition[#,3,1,1,_]&
入力として文字のリストを受け取ります。Blanks(_)が埋め込まれた3タプルの文字のリストを返します。
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倍でない場合、入力の最後にアンダースコア「_」を2つ追加するだけで印刷されます。
s=>Enumerable.Range(0,(s.Length+2)/3).Select(i=>(s+"__").Substring(i*3,3))
              {"${it}___".chunked(3).dropLast(1)}
                    \t10 ()の代わりに9()を使用して\nも問題ありませんが、それは主要なポイントではありません
                    @ceilingcatのおかげで67バイト
f(char*k){for(;*k;k++)printf("%c%c%c\n",*k,*++k?*k:95,*++k?*k:95);}
              これは、従来の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
              s:$:__:
s:...:& :g
s: _*$::
sedには偽の値の意味がないため、空の文字列入力に関して少し注意が必要です。したがって、これに対処するために、私はあなたの提出を検証するためのルールの2つの可能な解釈を提供します:
A.基本的に、入力として何も提供せず、末尾の改行すら提供しません(その6 Mbファイルを含むすべての例がそうであるように)。
使用法:
echo -n ""|sed -f script
出力: sedは入力なしでもスクリプトを実行しないため、何も出力されません。
B. sedの偽の値は一意の文字列、つまり、入力が空の文字列の場合にのみ返される値と考えることができます。
使用法:
echo ""|sed -f script
出力:
__
最初の解釈は、意図したルールに最も近いと思うので、はるかに好みますが、最後の解釈は、そのTIOリンクを使用してスクリプトを実行する場合に役立ちます。
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
              (s+"___").grouped(3).toSeq.init
説明
(s+"___")       // add "___"
  .grouped(3)   // make groups of 3
  .toSeq        // change to Seq
  .init         // take all but last
              ~: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が返されます)
命令ポインタは最後で折り返され、行全体をループします。