makeplex salon:あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定 回答(もちろんJ言語で)

問題は右のリンクから あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定 (2/2) - ITmedia エンタープライズ

まずは実際の動作から。

   get_wait '1112224588899'
+---+---+--+---+--+
|111|222|45|888|99|
+---+---+--+---+--+
   get_wait '1122335556799'
+---+---+---+---+--+
|123|123|55 |567|99|
+---+---+---+---+--+

+---+---+---+---+--+
|123|123|555|67 |99|
+---+---+---+---+--+
   get_wait '1112223335559'
+---+---+---+---+-+
|111|222|333|555|9|
+---+---+---+---+-+

+---+---+---+---+-+
|123|123|123|555|9|
+---+---+---+---+-+
   get_wait '1223344888999'
+---+---+---+---+---+
|123|23 |44 |888|999|
+---+---+---+---+---+

+---+---+---+---+---+
|123|234|4  |888|999|
+---+---+---+---+---+

+---+---+---+---+---+
|1  |234|234|888|999|
+---+---+---+---+---+
   get_wait '1112345678999'
+---+---+---+---+---+
|11 |123|456|78 |999|
+---+---+---+---+---+

+---+---+---+---+---+
|11 |123|45 |678|999|
+---+---+---+---+---+

+---+---+---+---+---+
|11 |12 |345|678|999|
+---+---+---+---+---+

+---+---+---+---+---+
|11 |123|456|789|99 |
+---+---+---+---+---+

+---+---+---+---+---+
|111|234|567|89 |99 |
+---+---+---+---+---+

+---+---+---+---+---+
|111|234|56 |789|99 |
+---+---+---+---+---+

+---+---+---+---+---+
|111|23 |456|789|99 |
+---+---+---+---+---+

+---+---+---+---+---+
|111|234|567|8  |999|
+---+---+---+---+---+

+---+---+---+---+---+
|111|234|5  |678|999|
+---+---+---+---+---+

+---+---+---+---+---+
|111|2  |345|678|999|
+---+---+---+---+---+

コードは以下。かかった時間は1時間40分。

一つだけ言いいたいことは、これでも可読性がよくなるように書いたということ。

rec =: 3 : 0 M.
  ret =. i.0
  if. 2>:#y do.
    if. (-._1=-/y)*.-.1=#+/"1=y do. _1 else. <<":10#.y end.
  else.
    for_p. 2 3 do. for_k. >:i.9 do. if. p<:c=.+/k=y do. if. -._1=r=.rec/:~(k#~c-p),~y-.k do.
      ret =. ret, /:~L:1(<":10#.p#k),L:1 r
    end. end. end. end.
    for_k. >:i.7 do. t=.y if. 3=+/y e.~k+i.3 do.
      for_p. k+i.3 do. t=.(p#~<:+/t=p),~t-.p end.
      if. -._1=r=.rec/:~t do. ret =. ret, /:~L:1(<":10#.k+i.3),L:1 r end.
    end. end.
    if. 0=$ret do. _1 else. ~.ret end.
  end.
)

get_wait =: 3 : 0
  y =. (13#10)#:".'x',~/:~y
  ret =. i.0
  if. (1,6#2)-:/:~+/"1=y do.
    ret =. <(<w),~":@#.~&10 L:0;/6 2$y-.w=.y{~+:1 i.~+/"1=y
  end.
  (1,~#p)$>p=.ret,t#~(>(;/2,2,3#3)&-:L:1 c)+.>(;/1,4#3)&-:L:1 c=./:~L:1#L:0 t=.rec y
)