YAPCのREG.RUによるPerlゎルフ::ペヌロッパ2013





perl-developers YAPC :: Europe 2013の定期䌚議が8月12〜14日にキ゚フで開催されたした。意識的な報告、Perl 5およびPerl 6開発者からのむンサむダヌ情報、Perlの䞖界Larry Wall自身を含むの䌝説、リバヌクルヌズずパブの傍芳者ずの玠晎らしいコミュニケヌション-すべおがそこにありたした。 むベントは最高の賞賛に倀し、䞻催者ず講挔者および他のすべおの䌚議参加者-あらゆる皮類の賞賛ず感謝。



しかし、perlプログラマヌは、通垞の人間の喜びに加えお、垞に理解可胜で密接ではない特別な通垞の「ホモサピ゚ンス」で楜したせる傟向があるこずはよく知られおいたす。



それで、どうやっおPerl GolfをYAPCに入れたのか、そしおそれが䜕をもたらしたのか。



REG.RUはスポンサヌずしお䌚議をサポヌトしたした。 ブヌスずホヌルのスタッフは、玠晎らしいTシャツ、䌚瀟に関する有益な情報、笑顔、前向きな雰囲気をためらうこずなく、さらに「最も匷力なPerlプログラマヌ」のコンテストを開催したした REG.RUのりェブサむトですべおの詳现ず写真を報告しおください 



YAPCのREG.RU :: 2013幎ペヌロッパ



しかし、もちろん、そこで止たるこずはできたせんでした。 「Perl-event-perl-activity、他には䜕もありたせん」-私たちは自分自身に蚀い聞かせお、それから実際に䜕を意味するのか考え始めたした。



Perl Golfずは䜕ですか



䞀般に、Perl Golfはプログラミングの競争ですもちろん、Perlでは、他の蚀語で「ゎルフ」を詊みおいたすが、問題を正しく解決する最短のプログラムが勝ちたす。 同時に、远加のモゞュヌルず倖郚ツヌルの䜿甚は蚱可されおいたせん。 ゚ンタヌテむンメントは、JAPH、難読化、コヌド詩、その他の゚キサむティングなおそらく実甚的ではないかもしれたせんがアクティビティずずもに、Perlプログラマヌのお気に入りの1぀です。 さらに、Perl Golfには絶察に明確な評䟡基準プログラム内の最小文字数があるため、競争圢匏ずしお完党に適合したす。









チヌムには経隓豊富なゎルファヌがいなかったので、私は䞀からクラフトを習埗しなければなりたせんでした。 そしお、私は蚀わなければならない、倖郚の゚キゟティズムにもかかわらずそしお通垞のコヌドがどのように芋えるべきかを理解するプログラマヌの芳点からは恐ろしいものでさえ、ゎルフは興味深く有甚な掻動であるこずが刀明し、蚀語の深くお明癜でない機胜ず胜力を孊び、理解するのを助けたした、問題ずその解決策を明確か぀簡朔に定匏化する胜力を蚓緎したす。 倚くの考えず創造的な苊痛の結果ずしお、次の物語が生たれたした。



凡䟋



あなたは江戞時代の貎族の貎族の息子です。 あなたは垞にプログラマになるこずを倢芋おいたしたが、家族の䌝統がより匷力であるこずが刀明したした-あなたは蚓緎のために郭をマスタヌするために送られたした。 短い理論的玹介の埌、マスタヌは石を捕獲するタスクを尋ね始めたした。



タスクは簡単ですが、Goの胜力がないこずは明らかです。 さらに、マスタヌは誀っお解決されたタスクごずに竹の棒で痛いほどあなたを叩き、1本の棒だけで食事をさせたす。 暎行ず慢性的な栄逊倱調にうんざりしおいるあなたは、あなたのために問題を解決するプログラムを曞くこずにしたす。 そしお、江戞時代の玙は高䟡なので、プログラムはできるだけ短くすべきです。











Goゲヌムの基本



郭は、数千幎前に䞭囜に登堎し、日本で党盛期を生き延びた最叀のボヌド戊略ゲヌムです。 2人のプレヌダヌがゲヌムに参加し、亀互にボヌドグリッドの亀点に黒ず癜の石を眮きたす。 石たたは石のグルヌプは、敵の石に四方が囲たれおいる堎合、捕獲されおボヌドから取り陀かれたずみなされたす。 たずえば、次の図では、黒「b」が「x」で瀺されるポむントに移動するず、癜い石「w」たたは石のグルヌプがボヌドから削陀されたす。











利甚芏玄
  1. タスクは9×9の生埒䌚で行われたす。
  2. 右の動きは黒い石です。
  3. すでに捕獲されおいる石がボヌド䞊にないこずが保蚌されおいたす。


入力 ゲヌムボヌドを衚す9行がSTDINで提䟛されたす。 行はスペヌスボヌド䞊の空のドットを瀺す、文字 "w"癜い石および "b"黒い石で構成され、改行文字 "\ n"で終わりたす。



出口 ポむントの座暙スペヌスを通る行番号ず列番号、1から番号付け、そこぞの移動は癜い石の捕獲に぀ながりたす。 STDOUTに1行に1ポむント衚瀺する必芁がありたす。 ボヌド䞊のすべおの朜圚的な動きを掚枬しお、癜い石を捕獲する必芁がありたす。 ポむントは、ボヌド䞊で巊から右、䞊から䞋の順に衚瀺されたす。



競技は、Perl Golfの通垞のルヌルに埓っお開催されたす。

  1. テストに合栌した最短のプログラムが勝ちたす。
  2. ShebangはPerlたたはPerl -flagsのように芋えるはずです。 perlは文字数をカりントする際に考慮されたせんが、「-」文字を含む指定されたフラグは考慮されたす。
  3. スペヌスや改行など、他のすべおの文字がカりントされたす。
  4. プログラムは、他のモゞュヌルを䜿甚したり、倖郚プログラムを呌び出したり、倖郚デヌタ゜ヌスにアクセスしたりするこずはできたせん。
  5. この゜リュヌションは、STDERRに䜕も衚瀺せずに、Perlバヌゞョン5.18.0で正垞に動䜜するはずです。




問題の状態ず怜蚌のための䞀連のテストがcontest.reg.ruに公開されたした 。 テストに合栌するこずは、゜リュヌションの正確さの基準ず芋なされたした。 しかし、競技埌、参加者はいく぀かの远加の掗緎されたテストケヌスを提案し、その䞊でいく぀かの決定が぀たずきたした。 そのため、远加のテストケヌスに合栌しない堎合、指定された゜リュヌションは個別にマヌクされたす。



䌚議の日䞭および倕方ず倜に参加者の掻発な専門的および瀟䌚的生掻にもかかわらず、私たちはいく぀かの非垞に興味深い解決策を受け取りたした。それは私自身の泚釈でさらに䞎えたす私の理解床はただゎルフであるので割匕しお 



競争力のある゜リュヌション



205文字-ブラむアンマッコヌリヌ


REG.RUのPerlゎルフコンペティションの勝者 競争の勝者は、隣接する石のグルヌプを匷調衚瀺し、正芏衚珟を「走り回っお」近隣ポむントをチェックする゜リュヌションを提案したした叀代から正芏衚珟の゜リュヌションだけがPerl Golfに勝぀ず信じられおいたす。 さらに、入力に远加の初期行を远加するこずで倚くの゜リュヌションに珟れるトリックが䜿甚されたした。これにより、ボヌド䞊のポむントの連続した䜍眮が座暙行番号ず列番号の組み合わせに倉わりたす。



#!perl $b=++$/x11 .<>;for$i(9..99){if(($x=$b)=~s/^(.{$i}) /$1x/s){while($x=~/w/g){$_="$`W$'";1while s/w((?<=W.{10})|(?<=W.)|(?=.{9}W|W))/W/s;/W((?<= .{10})|(?<= .)|(?=.{9} | ))/s||$i=~/./+(print"$& $'\n")+last}}}
      
      





泚釈
 #!perl # $/   «1»,  «<>»       #  (   ).      #     11  (   / #          . $b = ++$/ x 11 . <>; #    . for $i ( 9 .. 99 ) { #   .     , . . , #    «x» ( ,  ,    #  ,   )  . if ( ( $x = $b ) =~ s/^(.{$i}) /$1x/s ) { #          («w»). while ( $x =~ /w/g ) { #    $_,     «w»  «W» # (     while # $`      ,   $' — ). $_ = "$`W$'"; #    ,    . 1 while s/w((?<=W.{10})|(?<=W.)|(?=.{9}W|W))/W/s; #   ( ) -    . /W((?<= .{10})|(?<= .)|(?=.{9} | ))/s #   ,   . #   «/./»     $& (  #  )  $' ( ,     # ), .   ,    #     . || $i =~ /./ + ( print "$& $'\n" ) + last; } } }
      
      







ブラむアンは圌の決定ず圌自身の泚釈をPerlMonksで公開したした 。 さらに、圌は皲劻ブロックでこの決定を説明するレポヌトを䜜成したした。



競争での勝利のために、ブラむアンはミニゎルフの玠晎らしいセットを受け取ったので、今では職堎で退屈に盎面するこずはありたせん。







212文字-Sergey Mozhaysky远加のテストケヌスは合栌したせん


無限の再垰を回避するために、隣接ポむントを再垰的に走査し、チェックポむントに関する情報を保存する゜リュヌション。



 #!perl @g=(d..n,map{/./g,''}<>);sub n{my($i,$j,$r)=@_;map{$_=1and map{$r=n($i,$j+1)+n($i,$j-1)+n($i+1,$j)+n($i-1,$j)==1if/w/;$r=1and$0="$i $j\n"if/ /}$g["$i$j"]if!$_}$s{"$i$j"};$r}map{print$0if$g[$_]eq'w'&&n(/./g)}0..99
      
      





泚釈
 #!perl #        d .. n, #    . @g = ( d .. n, map { /./g, '' } <> ); #     sub n { my ( $i, $j, $r ) = @_; #  %s       # (   ). #    %s  $_   map. map { #   %s    #   ,      . $_ = 1 and map { #     —  ,    #     ,   #        # (. .         ). $r = n( $i, $j + 1 ) + n( $i, $j - 1 ) + n( $i + 1, $j ) + n( $i - 1, $j ) == 1 if /w/; #   ,    #     $0. $r = 1 and $0 = "$i $j\n" if / / } $g["$i$j"] if !$_ } $s{"$i$j"}; #    $r } #     . map { #      ,     #     . print $0 if $g[$_] eq 'w' && n(/./g) } 0 .. 99
      
      





残念ながら、远加のテストでは、゜リュヌションに誀怜出がありたす。



279文字-ニコラむシュリャコフスキヌ


再垰的゜リュヌションでもありたすが、無限再垰ず結果の繰り返し出力に察する保護のロゞックが異なりたす。



 #!/usr/bin/perl while(<>){tr/ wb\n/2133/;$str.=$_.'3'}@m=split//,('3'x12).$str;for(@m){%l=();$r=1;z($i);$o{$w[0]}=1if/1/&&$r&&(@w=%l)==2;$i++}printf"%d %d$/",$_/11,$_%11for sort keys%o;sub z{my$c=$_[0];for(qw/11 1 -11 -1/){$x=$c+$_;$n=$m[$x];$l{$x}=1if$n==2;if($n==1){z($x)if!/-/;$r=0if$i>$x}}}
      
      





泚釈
 #!/usr/bin/perl while (<>) { #   , tr/ wb\n/2133/; #      . $str .= $_ . '3'; } @m = split //, ( '3' x 12 ) . $str; #      #     for (@m) { %l = (); $r = 1; z($i); #  . $o{ $w[0] } = 1 #  , if /1/ #     ( ), && $r #  , && ( @w = %l ) == 2; #       . $i++; } printf "%d %d$/", $_ / 11, $_ % 11 #       #     11 for sort {$a > $b} keys %o; #    . sub z { my $c = $_[0]; for (qw/11 1 -11 -1/) { #     $x = $c + $_; #   , $n = $m[$x]; #   . $l{$x} = 1 if $n == 2; #  ,    —  if ( $n == 1 ) { #    —  , z($x) if !/-/; #     . $r = 0 if $i > $x #  ,    #    # (  ) } } }
      
      





远加のテストケヌスでは、かなり明らかなバグが芋぀かりたした。フィヌルドの最埌の行に「゚キサむティングな」䜍眮100以䞊の配列内の䜍眮があるず、ボヌド䞊の早い䜍眮の前の出力に到達したす。 これは、䞊べ替えが結果の䞊べ替えに䜿甚されるずいう事実が原因であり、デフォルトでは文字列比范モヌドで機胜したす。぀たり、「100」は「99」未満になりたす。



370キャラクタヌ-ミカラむ・リオヘンキ+デニス・シロコフ


再垰゜リュヌションの別のバリ゚ヌション。 別のよく䜿甚されるトリックがここに衚瀺されたす。各ポむントをチェックするには、ボヌドのコピヌを䜜成し、そこに黒い石を取り付け、その埌ボヌドに癜い石がキャプチャされおいるかどうかをチェックしたす。



 #!perl $s='b'x12; while(<>){s/\n/bb/;s/ /0/g;$s.=$_;}$s.='b'x10;@q=(-1,+1,11,-11);@a=split//,$s; for(@a){++$i;if(!$a[$i]){$res=0;$p=[];for(@q){$c=$_+$i;if($a[$c]eq'w'){$p=[@a];$p->[$i]='b';$res+=b($p,$c);}}if($res){printf"%d %d\n",$i/11,$i%11;}}} sub b{my($e,$w)=@_;$r=1;for(@q){$z=$_+$w;return 0 if!$r||!$e->[$z];if($e->[$z]eq'w'){$t=[@$e];$t->[$w]='b';$r&=b($t,$z)}}return$r}
      
      





泚釈
 #!perl #   ,       . #    0,     . $s = 'b' x 12; while (<>) { s/\n/bb/; s/ /0/g; $s .= $_; } $s .= 'b' x 10; @q = ( -1, +1, 11, -11 ); #     . @a = split //, $s; #      . for (@a) { #  . ++$i; if ( !$a[$i] ) { #   . $res = 0; $p = []; for (@q) { #   . $c = $_ + $i; if ( $a[$c] eq 'w' ) { #     . $p = [@a]; #   $p->[$i] = 'b'; #      . $res += b( $p, $c ); #  «». } } if ($res) { #   , printf "%d %d\n", $i / 11, $i % 11; #     . } } } sub b { my ( $e, $w ) = @_; $r = 1; for (@q) { #   .    . $z = $_ + $w; return 0 if !$r || !$e->[$z]; if ( $e->[$z] eq 'w' ) { $t = [@$e]; $t->[$w] = 'b'; $r &= b( $t, $z ) } } return $r; }
      
      





390文字-Dmitri L.


カりンタヌの圢で隣接をチェックした結果の特定の集蚈を䜿甚する別の再垰的な゜リュヌション。



 #!perl push@t,split//,'b'x11;for(<>){chomp;push@t,split//,"b$_"."b"}push@t,@t[0..10];for(;$r++<11;){for($c=0;$c++<11;){$i=$r*11+$c;if($t[$i]eq' '){for($i-11,$i+1,$i+11,$i-1){next unless$t[$_]eq'w';$t[$i]='b';if(f($_)>7){print"$r $c\n";last}$t[$i]=' '}}}}sub f{my($r,$e,$k)=@_;$d{$r}?return$e||$dr:($d{$r}=2);for($r-11,$r+1,$r+11,$r-1){$k+=1+f($_,1)if$t[$_]eq'w';$k+=2if$t[$_]eq'b'}$e?$k>7?$e:0:$k}
      
      





泚釈
 #!perl #   ,        push @t, split //, 'b' x 11; for (<>) { chomp; push @t, split //, "b$_" . "b" } push @t, @t[ 0 .. 10 ]; #      for ( ; $r++ < 11 ; ) { for ( $c = 0 ; $c++ < 11 ; ) { #    $i = $r * 11 + $c; #    - ,   if ( $t[$i] eq ' ' ) { for ( $i - 11, $i + 1, $i + 11, $i - 1 ) { next unless $t[$_] eq 'w'; $t[$i] = 'b'; if ( f($_) > 7 ) { #    7 (. . 8) print "$r $c\n"; #   last } $t[$i] = ' ' } } } } sub f { my ( $r, $e, $k ) = @_; $d{$r} ? return $e || $dr : ( $d{$r} = 2 ); for ( $r - 11, $r + 1, $r + 11, $r - 1 ) { #   $k += 1 + f( $_, 1 ) if $t[$_] eq 'w'; #    -    1    $k += 2 if $t[$_] eq 'b'; #    2    } $e ? $k > 7 ? $e : 0 : $k; }
      
      





404文字-Philippe BruhatBooK


最短ではありたせんが、おそらく最もアルゎリズム的に耇雑で、最も耇雑で解析が難しい゜リュヌションの1぀なので、泚釈から完党な明確さを期埅しないでください。



 #!perl #!perl -ln sub M{$k=pop;my%t;$l[$k]=[grep!$t{$_}++,@{$l[$k]},@_]}sub S{($m,$n)=@_;($M,$N)=sort$$m,$$n;M@{delete$l[$N]},$M if$N!=($$m=$$n=$M)}$i=1;for(split//){$b[$c=$..$i]=/w/?++$e:$_;$x=($R=$.-1).$i;$y=$..($C=$i-1);/w/&&do{$b[$_]>0&&S\$b[$c],\$b[$_]for$x,$y;M$b[$x]eq$"?"$R $i":(),$b[$y]eq$"?"$. $C":(),$b[$c]};/ /&&map{$b[$_]>0&&M"$. $i",$b[$_]}$x,$y;$i++}}{print for sort grep!$s{$_}++,map@$_-1?():@$_,@l
      
      





泚釈
 #!perl -ln sub M { $k = pop; my %t; #  «». $l[$k] = [ grep !$t{$_}++, @{ $l[$k] }, @_ ] } sub S { ( $m, $n ) = @_; ( $M, $N ) = sort $$m, $$n; #          #    «»  M @{ delete $l[$N] }, $M if $N != ( $$m = $$n = $M ); } $i = 1; #       . for ( split // ) { $b[ $c = $. . $i ] = #  $.   . /w/ ? ++$e : $_; #      #   . $x = ( $R = $. - 1 ) . $i; #    . $y = $. . ( $C = $i - 1 ); #     . #    —      /w/ && do { #      $b[$_] > 0 && S \$b[$c], \$b[$_] for $x, $y; #   «». M $b[$x] eq $" ? "$R $i" : (), $b[$y] eq $" ? "$. $C" : (), $b[$c]; }; #    —  «»     . / / && map { $b[$_] > 0 && M "$. $i", $b[$_] } $x, $y; $i++; } }{ #  . print for sort grep !$s{$_}++, map @$_ - 1 ? () : @$_, @l
      
      





幞いなこずに、フィリップは問題を真剣に受け止め、解決策に圌自身の詳现な説明を提䟛したした。



著者からの芁玄
アルゎリズムの䞭栞は、石のグルヌプを䜜成し、曎新するこずです

各グルヌプの自由のリスト。 最埌に、自由のみ

゜ヌトされた埌、単䞀の自由を持぀グルヌプから印刷されたす

そしお重耇排陀。



アルゎリズムは、ボヌドに@bを䜿甚し、それが

9x9ボヌド。 したがっお、座暙は00..99ず$ xの範囲にありたす。$ Yは

任意の亀差点を指したす。 ボヌドを構築するずき、列

行0には䜕も曞き蟌たれたせんundefたたは ''。



ボヌドは1行で1行で衚瀺されたす-lnに感謝。

各セルに぀いお、䞊ず巊のセルを芋たした。



珟圚のセルが「w」の堎合、次の利甚可胜なセルに倉わりたす

番号、および各隣人に぀いお、それが番号の堎合、䞡方が有効になりたす

2぀の数倀の最小倀に入れ、それらの自由のリストは

合䜵したした。 ''の隣人は、次の自由のリストに远加されたす。

珟圚のセル。



珟圚のセルが ''の堎合、そのセルに自由ずしお远加されたす

数字である隣人。



「b」セルに぀いおは、䜕もしたせん。



数倀は、ホワむトグルヌプの「等䟡クラス」です。

同じ番号の2぀のセルは同じグルヌプの䞀郚です。



ボヌドの印刷は、アルゎリズムをデバッグするのに非垞に圹立ちたした。



  ...wb.... ...1b.... ...b..... ...b..... ......... ......... ..b...... would ..b...... .bwb..... become .b2b..... bwwwb.... b222b.... ......... ......... ......... ......... .......bw .......b6
      
      





セルのマヌゞがない堎合、「2」グルヌプは実際には次のようになりたす。



  2 345
      
      





パス䞭、次のように進化したす。



  ..b...... .b2
      
      





次の癜たですべおのセルを蚪問



  ..b...... .b2...... b3
      
      





  ..b...... .b2b..... b34
      
      





珟圚のセル4を2にマヌゞ



  ..b...... .b2b..... b32
      
      





珟圚のセル2を3にマヌゞ



  ..b...... .b2b..... b22
      
      





  ..b...... .b2b..... b225
      
      





珟圚のセル5を2にマヌゞ



  ..b...... .b2b..... b222
      
      





サブMは自由床を远加し、重耇を削陀したす。

sub Sは等䟡クラスのマヌゞを行い、呌び出したす

Mは圌らの自由を統合したす。



400では、勝぀こずを期埅しおいたせんでした。 ゎルフの有名な事実

競争は正芏衚珟ベヌスのアルゎリズムが垞に勝぀こずです。 :-)



500文字-サビオ・ピマテオ


そしお、各空のセルに黒い石を取り付ける前ず取り付けた埌のボヌド䞊の「非自由」黒たたは捕獲された癜の石の数を比范するもう1぀の再垰的な゜リュヌション



 #!perl my$X=121;my$m;sub z{my($s,$x,$m)=shift;while($x<$X){$m+=f($x++,$s);}$m;}sub f{my($n,$t,$d)=@_;my$c=substr($t,$n,1);return 0 if $c eq ' '||!$d&& $c ne 'w';return 1 if $c eq 'b';substr($t,$n,1)='b';(!(($n+1)%11)||f($n+1,$t,1))*(!(($n-1)%10)||f($n-1,$t,1))*f($n+11,$t,1)*f($n-11,$t,1);}my$y='b'x11;while(<>){$y.="b$_";}$y=~s/\n/b/g;$y.='b'x11;$d=z($y);my$i=0;while($i<$X){my$ch=substr($y,$i,1);if($ch eq ' '){$b=$y;substr($b,$i,1)='b';if(z($b)>$d){my$y=int($i/11);my$x=$i-($y*11);print"$y $x\n";}}$i++;}
      
      





泚釈
 #!perl my $X = 121; #    . my $m; #   «» (   )    . sub z { my ( $s, $x, $m ) = shift; #      . while ( $x < $X ) { $m += f( $x++, $s ); } $m; } #    «» sub f { my ( $n, $t, $d ) = @_; my $c = substr( $t, $n, 1 ); #   . #  0    #               . return 0 if $c eq ' ' || !$d && $c ne 'w'; #  1,      . return 1 if $c eq 'b'; #     . substr( $t, $n, 1 ) = 'b'; #    . ( !( ( $n + 1 ) % 11 ) || f( $n + 1, $t, 1 ) ) * ( !( ( $n - 1 ) % 10 ) || f( $n - 1, $t, 1 ) ) * f( $n + 11, $t, 1 ) * f( $n - 11, $t, 1 ); #    0,      #      . } #   ,       . my $y = 'b' x 11; while (<>) { $y .= "b$_"; } $y =~ s/\n/b/g; $y .= 'b' x 11; $d = z($y); my $i = 0; while ( $i < $X ) { #  . my $ch = substr( $y, $i, 1 ); #   . if ( $ch eq ' ' ) { #    , $b = $y; #  , substr( $b, $i, 1 ) = 'b'; #     . #      «»   if ( z($b) > $d ) { #    . my $y = int( $i / 11 ); my $x = $i - ( $y * 11 ); print "$y $x\n"; } } $i++; }
      
      





581文字-ディミトリヌ・むワノフ


Savio Pimatteoの以前の゜リュヌションに非垞に近い゜リュヌション。



 #!perl eval{ $a->[10]=$a->[0]=[('b')x11]; while(<STDIN>){chomp;@{$a->[++$i]}=('b',(split''),'b');last if $i>=9} sub f { my($x,$y)=@_; return $o[$j] if $n->[$x][$y]; return $o[$j]||2 if $a->[$x][$y]eq'b'; return 1 if $a->[$x][$y]ne'w'; $n->[$x][$y]=$j; $o[$j]=f($_,$y)for($x-1,$x+1); $o[$j]=f($x,$_)for($y-1,$y+1); return $o[$j]; } sub p { for $x(0..10){for $y(0..10){ f($x,$y,$j++) if $a->[$x][$y]eq'w'&&!$n->[$x][$y]; }} return grep{$_==2}@o; } my $t=p; for $x(0..10){for $y(0..10){ next if $a->[$x][$y]ne' '; $a->[$x][$y]='b'; @o=();$n=[]; print"$x $y\n" if $t<p; $a->[$x][$y]=' '; }} }
      
      





泚釈
 #!perl eval { #       . $a->[10] = $a->[0] = [ ('b') x 11 ]; #  ,     . while (<STDIN>) { chomp; @{ $a->[ ++$i ] } = ( 'b', ( split '' ), 'b' ); last if $i >= 9; } #     . sub f { my ( $x, $y ) = @_; #   ,    . return $o[$j] if $n->[$x][$y]; #     2,      . return $o[$j] || 2 if $a->[$x][$y] eq 'b'; #  ,        (. .  ). return 1 if $a->[$x][$y] ne 'w'; #    ,   , $n->[$x][$y] = $j; #    . $o[$j] = f( $_, $y ) for ( $x - 1, $x + 1 ); $o[$j] = f( $x, $_ ) for ( $y - 1, $y + 1 ); #   $o[$j]   1      #       . return $o[$j]; } #    . sub p { #    . for $x ( 0 .. 10 ) { for $y ( 0 .. 10 ) { #  ,       #      . f( $x, $y, $j++ ) if $a->[$x][$y] eq 'w' && !$n->[$x][$y]; } } #       # (. .     ). return grep { $_ == 2 } @o; } my $t = p; # . for $x ( 0 .. 10 ) { #   . for $y ( 0 .. 10 ) { next if $a->[$x][$y] ne ' '; # ,    . $a->[$x][$y] = 'b'; #     . @o = (); #  . $n = []; #     . print "$x $y\n" if $t < p; #   ,   #      # (. .    ). $a->[$x][$y] = ' '; #   . } } }
      
      





競合他瀟の゜リュヌション



競争を組織し、競争問題の解決策を持たないのは奇劙だろう。 だからここに䞻催者からの解決策がありたす、それは私です



192文字-ティムヌル・ノザッツェ


簡単な再垰的゜リュヌション。 密な最小化ず䞍芁なすべおの削陀、フラグを䜿甚した入力デヌタの解析の節玄、およびregexpず特殊倉数を䜿甚しおポむント䜍眮を座暙に倉換する十分に効果的なトリックにより、良い結果が埗られたした。



 #!perl -ln0aF// sub c{my$s=pop;$s=~/-|9/||$g[$s]eq'b'||$g[$s]=~/w/*!grep{$g[$s]='b';!c($s+$_)}1,-1,10,-10}map{@g=@F;$g[$_]='b';/\d$/,print$`+1,$",$&+1if$F[$_]=~/ /*grep{$g[$_]eq'w'&&c$_}0..$#g}0..$#F
      
      





泚釈
 #!perl -ln0aF// #   : # -n  «while () { 
 }»  ; # -0     ,    ; # -a  ,       @F; # -F//  -a   ; # -l      print. #   «»  sub c { my $s = pop; #  ,  #      (   ), $s =~ /-|9/ #     , || $g[$s] eq 'b' #         . || $g[$s] =~ /w/ * !grep { $g[$s] = 'b'; !c( $s + $_ ) } 1, -1, 10, -10; } #     . map { #  . @g = @F; #      . $g[$_] = 'b'; # ,     ,        #      . /\d$/, print $`+ 1, $", $& + 1 if $F[$_] =~ / / * grep { $g[$_] eq 'w' && c $_} 0 .. $#g } 0 .. $#F
      
      





゜リュヌションのアルゎリズムの単玔さにもかかわらず、驚くべきこずに、問題の本質に集䞭し、新しい倉数を䜜成せず、寛倧な手でコヌドの重耇郚分を䜜成しない堎合、倚くの堎合、倚くの䜙分なコヌドをコヌドから削陀できたす。 そのため、Golfでは、コヌドのサむズを小さくするだけでなく、問題ずその解決策の衚面的な理解をより深く、明確にするこずにも焊点を圓おおいたす。



実際、コンテスト䞭、この結果192文字は負けたせんでした。 しかし、これで終わりではなく、コラボレヌションず経隓の亀換の時間でした。



197文字-Sergey Mozhaysky远加のテストケヌスは合栌したせん


セルゲむは䞭間倉数を取り陀き、座暙を衚瀺するための新しいオプションを考え出し、決定を改善したした。



 #!perl @g=(d..n,map{/./g,''}<>);sub n{my($i,$r)=@_;map{do{$_=1and$r=n($i+1)+n($i-1)+n($i+10)+n($i-10)==1if/w/;$_=$r=1and$0=$i if/ /}if/\D/}$g[$i];$r}map{printf"%s %s\n",$0=~/./g if$g[$_]eq'w'&&n($_)}0..99
      
      





泚釈
 #!perl @g = ( d .. n, map { /./g, '' } <> ); #        . sub n { my ( $i, $r ) = @_; #        , #      . map { do { $_ = 1 and $r = n( $i + 1 ) + n( $i - 1 ) + n( $i + 10 ) + n( $i - 10 ) == 1 if /w/; $_ = $r = 1 and $0 = $i if / / } if /\D/ } $g[$i]; $r } map { #          printf "%s %s\n", $0 =~ /./g if $g[$_] eq 'w' && n($_) } 0 .. 99
      
      





189文字-ティムヌル・ノザッツェ


私の決定は、Brianの発蚀のおかげで数文字枛りたした。$を介しお配列のサむズを取埗するこずは、数倀定数89に眮き換えられ、正芏衚珟/\d$/



は/.$/



。



 #!perl -ln0aF// sub c{my$s=pop;$s=~/-|9/||$g[$s]eq'b'||$g[$s]=~/w/*!grep{$g[$s]='b';!c($s+$_)}1,-1,10,-10}map{@g=@F;$g[$_]='b';/.$/,print$`+1,$",$&+1if$F[$_]=~/ /*grep{$g[$_]eq'w'&&c$_}0..89}0..89
      
      





泚釈
 #!perl -ln0aF// #   : # -n  «while () { 
 }»  ; # -0     ,    ; # -a  ,       @F; # -F//  -a   ; # -l      print. #   «»  sub c { my $s = pop; #  ,  #      (   ), $s =~ /-|9/ #     , || $g[$s] eq 'b' #         . || $g[$s] =~ /w/ * !grep { $g[$s] = 'b'; !c( $s + $_ ) } 1, -1, 10, -10; } #     . map { #  . @g = @F; #      . $g[$_] = 'b'; # ,     ,        #      . /.$/, print $`+ 1, $", $& + 1 if $F[$_] =~ / / * grep { $g[$_] eq 'w' && c $_} 0 .. 89 } 0 .. 89
      
      





このアプロヌチの根本的な改善はほずんど期埅できたせん。



そしお、Perlmonksでのタむタンの戊いを目撃したした。



175文字-ブラむアンマッコヌリヌ


ブラむアンは、セルゲむのアドバむスず私の゜リュヌションからのいく぀かのアむデアを䜿甚しお、結果を真剣に改善したした。



 #!perl -ln0 map{$i=$-[0]+11;{map{1while s/w((?<=W.{10})|(?<=W.)|(?=.{9}W|W))/W/s;/W((?<= .{10})|(?<= .)|(?=.{9} | ))/s||$i=~/./+print("$& $'")+last}"$`W$'"while/w/g}}"$`x$'"while/ /g
      
      





泚釈
 #!perl -ln0 #  ,       . map { $i = $-[0] + 11; #     . { map { 1 while s/w((?<=W.{10})|(?<=W.)|(?=.{9}W|W))/W/s; /W((?<= .{10})|(?<= .)|(?=.{9} | ))/s || $i =~ /./ + print("$& $'") + last } "$`W$'" while /w/g } } "$`x$'" while / /g
      
      





127文字-グリミヌ


PerlMonksを䜿甚するGrimyナヌザヌはBrianのアむデアを抌し進め、正芏衚珟オプションを127文字ずいう玠晎らしい結果に導きたした



 #!perl -ln0 map{1while$,=s=$,w=g=s?'(g|(?=.g|..{9}g)|g.{9})\K':/g/>/$, /s&&map{y!.! !;print;redo}/x/+"@+E-1"or y&g&b&}"$`x$'"while/ /g
      
      





泚釈
 #!perl -ln0 #      «x». map { 1 while $, = #       g. # ( $,    ,    #        .) s=$,w=g=s #        . ? '(g|(?=.g|..{9}g)|g.{9})\K' #     ,     , #    . : /g/ > /$, /s && map { #  @+        /x/, # . .     . #     (/x/)     , #  -1  (E-1).     «.»  « », #    . y!.! !; print; redo } /x/ + "@+E-1" #      —     #    . or y&g&b& } "$`x$'" while / /g
      
      





実を蚀うず、この解決策は神秘䞻矩の䞀郚の芁玠を保持しおいたすが、私の泚釈が真実からそれほど遠くないこずを願っおいたす。



さお、正芏衚珟の決定の無敵性に察する広範な信念は完党に正圓化されたす。これは驚くべき結果であり、それを打぀こずは困難です。しかし、行商人の信じられないほどの勇気ず戊いの資質を知っお、私たちは手を詊すこずを申し出たす。珟圚のリヌダヌ127文字よりも優れた぀たり、短い゜リュヌションを提案した人は、最倧6か月間、.ruたたは.ゟヌンおよびVPSのドメむンをREG.RUからギフトずしお受け取りたす。決定はcontest@reg.ruで行われたす。曎新されたテストスむヌトに正垞に合栌した決定のみが枡されたす。がんばれ



All Articles