両者の相違であるmaxを取る部分であるが、llhuiiさんのものは分かりやすい。一方でteebeeさんのそれは、まず直接sortをする。(sort@F)[1]などとするとlvalue的なものにならないので、\によって@Fのreferenceと${...}によるdereferenceを挟んだ上で置換を行っている5。c126bytechar*p,*q,*r,s[99];main(){for(;~scanf("%s%s",p=s,q=s+50);putchar('\n'))for(;*p+*q;putchar(*q++))strcmp(p,q)>0&&(r=p,p=q,q=r);}変数宣言が多すぎて見苦しいが、どうにもならなかった。同氏のもうひとつの提出は手元で動かなかった。*への(実質的に0要素の6)arrayで、その先頭はbss領域の先頭。(他にglobal変数を使っていなければ)十分長い領域として扱える。*)NULLでないとき、putcharが実行される。bcmp7はmemcmpと考えてよい。第3引数にはゴミが渡される。cと副作用を除いて等価。putcharは引数をそのまま返す。*)NULLあるいはputcharが改行を出力したとき、scanfが実行される。%msはGNU拡張8で、いい感じにmallocしてくれるようだ。91bytehttp://golf.shinh.org/reveal.rb?Merge+Digits/tails_1461832311o;main(p,q){for(;o||~scanf("%s%s",p=q+32,q);putchar(o?:10))o=*(0?"":~strcmp(p,q)?p++:q++);}0?"":がすごい。手元ではsegvで動かなかった。**argvなので、これを領域として使っている。q++);の左の条件演算は実行時には意味をなさない。q++);と書くことになる9。0?"":の5byteと(char*)の7byteでは2byteの有利である。87bytehttp://golf.shinh.org/reveal.rb?Merge+Digits/tails+%28nu%29_1461906785o;main(p,q){for(;o||~scanf("%ms%s",&p,q);putchar(o?:10))o=*(0?"":bcmp(p,q)>0?p++:q++);}解読tailsさん本人のものを基本に、%msを使用し、strcmpをbcmpに変更したもの。0<bcmp(p,q)?p++:q++);}sedまともな長さで書ける気がしなかったので見送り。早くsedが書けるようになりたい。z.*//tこの手の正規表現見るたびに、正則性とはなんだったのかという気持ちになる。&z=9876543210z/は前処理。BARz=9876543210zという形に。\2\1/条件節の\1にはふたつの列の共通接頭辞が入る。\3かどうかを見ている。\3にはzが入りうる。matchしなかったとき、ふたつめの文字列の先頭をひとつめの文字列の先頭に移動。これは次で結果の文字列の末尾に移される。/は、ひとつめの文字列の先頭を結果の文字列の末尾に移動。@/!bPdPやdがあって珍しいしloopの形も複雑で技巧的だなあという印象。BAR@@@0123456789の形。@@@を;=;などとしてもよい。s/\n\(.\)/\1\n/共通接頭辞を取ってその次の文字で比較。\3には@が入りうる。\2なら、ひとつめの文字列の先頭を結果の文字列に移動。matchし続ける間繰り返す。\)\(\w\)/\2\1/ふたつめの文字列の先頭を結果の文字列に移動。@/!b空になったら終了。spaceを削除し次の行へ。//ttailsさんのを基本として改良。\2\1/条件部はそのまま。置換するようになっている。z.*が置き換わってできた空白を消す役割を追加した。実際には試せていない。