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 )