Split into multiples of 7

ruby 2系 42byte

$<.chars{|c|$><<c<<$/[$.=($.*3+c.to_i)%7]}
s='';$<.chars{|c|$><<c<<$/[(s+=c).to_i%7]}

1位に8byte差。 /\B/からの $` 、何故気付けなかったのだろうという感じがある。

angel氏/mitchs氏/olf氏/ludo氏 34byte

$><<gets.gsub(/\B/){$/[$`.to_i%7]}

みんな一緒。gsub(/\B/)$/[...]に気付けばこれになる。 ruby 1系の提出はこれの$/[...]$/if...<1で置き換えたもの。

perl 42byte

$_=<>;print$&,$/x!(($n.=$&)%=7)while s/.//

for<>=~/./gを使えば1位に並ぶ。

print$_,$/x!(($n.=$_)%=7)for<>=~/./g

llhuii氏/teebee氏/tails氏/angel氏 36byte

print$_,$/x!(($n.=$_)%=7)for<>=~/./g

あるいは

print$_,$/x!($n="$n$_"%7)for<>=~/./g

皆ほぼ同一。

brainfuck 75byte

,+[-
    .
    [>+<-]> add
    + incr
    >+++++++< 7
    [->-[>+>]>[+[<+>-]>>]<<<<] mod
    >>[<[-]>>+++<-] mult 3 and flag
    <[+++.>]> 3 newline
,+]

divmodはhttp://esolangs.orgから借りてきたそのまま。

mitchs氏 55byte

,+[-.<[>---<-]>+[>[<[->]<]+++++++<]>+++>>[>]<<[.>]>>,+]

定数除算や分岐が上手い。

解読
,+[-
    .
    <[>---<-]> mult minus 3
    + incr
    [> mod
        [<[->]<]
        +++++++ 7
    <]
    >+++ 3 newline
    >>[>]<< if the reminder exists then shift
    [.>]
    >>
,+]
,+[-
    ...
,+]

まず最外のloop。 EOF($-1$)まで読む。newlineは$3 \pmod 7$なので無視してよい。

    .
    <[>---<-]> mult minus 3
    + incr

読んだ文字を即出力する。読んだ文字のascii code $a$と、ひとつ左に置いてある前回のloopの結果$b$から、$a + 1 - 3b$を作る。$+1$はord('0') % 7 #=> 6であるため。 $-3$倍なのは次の$b’ = 7 - (a + 1 - 3b)$であるから。

    [> mod
        [<[->]<]
        +++++++ 7
    <]

7で剰余を取る。0 0 [n] 0から、$n = 0 \pmod 7$なら0 0 [0] 7、そうでないなら[0] 7 0 7-n%7

>+++ 3 newline

先ほど控えておいた$7$から$10$を作る。

>>[>]<< if the reminder exists then shift
[.>]

[10] 0 nから$n$の真偽に応じて右に、ひとつずれる。 まだずれておらず$10$の上に居るなら、出力してひとつずれる。

angel氏 63byte

,+[-.<[->---<]>+[>[-]<<+++++++[->-[>++>]<<<]>]>[>]>>[--.>]<<,+]
解読
,+[-
    .
    <[->---<]> mult minus 3
    + incr
    [> mod
        [-]
        <<+++++++ 7
        [->-[>++>]<<<]
    >]
    >[>]
    >>[--.>]<<
,+]
    [> mod
        [-]
        <<+++++++ 7
        [->-[>++>]<<<]
    >]

剰余。0 [0] n xから[0] n%7 0 12-2nを作る。 他はだいたい同じ。

sed

難しいと判断して見送ったが、やってみてもよかったかもしれない。

mitchs氏/tails氏

s/./&876543210\n/g
s/\(.\).*\1/\1/mg
s/\B./-/g
:
s/-\n*\(\w\)/\1---/
s/-\{7\}//
t

5,6行目の順序を除いて同一。 嘘を付いている。

解読
s/./&876543210\n/g
s/\(.\).*\1/\1/mg
s/\B./-/g

各文字に関して、その後ろに876543210\nを追加し、その文字から次のその文字に一致するところまで削除し、それ以降の文字を-で置換。

例えば145537と入れると以下のようになる。

1-
4----
5-----
5-----
3---
7-------
:
s/-\n*\(\w\)/\1---/
s/-\{7\}//
t

char -* - newline* charchar -* char ---で置き換える。つまり-の数を$10$倍して下の位に降ろしている。 そして-------をひとつ消去。適当な位置から$7$を引いている。これを交互にやる。

嘘がある。例えば入力が7714だとすると、

7-------
7-------
1-
4----

から

7------
7---
1-
4----

となり、最終的に$1$行目は77になる。