# 'x'的演变

15

1. 每个“ x”扩展到正交边界的字段，但自身消失
2. 每当两个“ x”在一个场上时，它们彼此抵消

    o o o            o x o
o x o     ->     x o x
o o o            o x o


    Round {0-10}: {repetition/empty/giveup}, {0-100} percent maximum-fill


    Input: 2       Starting state: x o x
xox                     x x
xx

Round 1: x x o
o x

Round 2: x o x
o x

Round 3: o x o
o o

Round 4: x o x   -> The pattern repeats:
o x        It is the same as in round 2,
therefore we stop. Maximum fill was
in the starting state with four times 'x'
of 5 fields altogether,
so we have 4/5 = 80 %.

Output: Round 4: repetition, 80 percent maximum-fill


    Input: 1       Starting state: x x
xx

Round 1: x x    ->  We already have a repetition, because
the pattern is the same as in the starting
state. The board is always filled 100 %.

Output: Round 1: repetition, 100 percent maximum-fill


PS：如果您有任何疑问，请随时提问。

PPS：对于原始创作者：对于那些会说德语的人，这个问题来自于“如果您不想在这里扰流者”，请不要点击 。由于完成挑战的正式时间已经结束，所以我想看看是否有人可以提出一个简短而优雅的解决方案。

2014年4月22日：

    Round 10: giveup, 50 percent maximum-fill
Round 5: empty, 66 percent maximum-fill
Round 1: repetition, 100 percent maximum-fill
Round 1: empty, 100 percent maximum-fill
Round 4: repetition, 100 percent maximum-fill
Round 4: repetition, 70 percent maximum-fill
Round 2: repetition, 60 percent maximum-fill
Round 4: empty, 88 percent maximum-fill
Round 10: giveup, 50 percent maximum-fill
Round 5: repetition, 80 percent maximum-fill
Round 10: repetition, 80 percent maximum-fill
Round 1: empty, 80 percent maximum-fill
Round 3: repetition, 60 percent maximum-fill
Round 4: repetition, 48 percent maximum-fill
Round 9: empty, 41 percent maximum-fill
Round 10: giveup, 92 percent maximum-fill
Round 10: giveup, 53 percent maximum-fill
Round 10: giveup, 66 percent maximum-fill
Round 6: repetition, 50 percent maximum-fill
Round 10: giveup, 88 percent maximum-fill
Round 10: giveup, 76 percent maximum-fill
Round 10: giveup, 68 percent maximum-fill
Round 10: giveup, 40 percent maximum-fill
Round 10: giveup, 100 percent maximum-fill
Round 10: giveup, 71 percent maximum-fill
Round 2: empty, 81 percent maximum-fill
Round 6: repetition, 36 percent maximum-fill
Round 10: giveup, 61 percent maximum-fill
Round 10: giveup, 60 percent maximum-fill
Round 4: repetition, 66 percent maximum-fill
Round 10: giveup, 72 percent maximum-fill
Round 3: empty, 80 percent maximum-fill
Round 10: giveup, 50 percent maximum-fill
Round 10: giveup, 83 percent maximum-fill
Round 7: repetition, 37 percent maximum-fill
Round 9: repetition, 85 percent maximum-fill
Round 5: repetition, 40 percent maximum-fill
Round 5: repetition, 60 percent maximum-fill
Round 4: empty, 80 percent maximum-fill
Round 10: giveup, 60 percent maximum-fill
Round 4: repetition, 46 percent maximum-fill
Round 6: repetition, 42 percent maximum-fill
Round 10: giveup, 72 percent maximum-fill
Round 4: repetition, 70 percent maximum-fill
Round 4: repetition, 80 percent maximum-fill
Round 6: repetition, 50 percent maximum-fill
Round 4: repetition, 56 percent maximum-fill
Round 10: giveup, 60 percent maximum-fill
Round 10: giveup, 54 percent maximum-fill
Round 10: giveup, 66 percent maximum-fill
Round 2: repetition, 40 percent maximum-fill
Round 2: repetition, 40 percent maximum-fill
Round 6: repetition, 75 percent maximum-fill
Round 7: empty, 85 percent maximum-fill
Round 10: giveup, 50 percent maximum-fill
Round 6: repetition, 70 percent maximum-fill
Round 2: empty, 66 percent maximum-fill
Round 1: empty, 66 percent maximum-fill
Round 3: empty, 100 percent maximum-fill
Round 3: empty, 66 percent maximum-fill
Round 8: repetition, 42 percent maximum-fill
Round 1: empty, 60 percent maximum-fill
Round 2: repetition, 100 percent maximum-fill
Round 2: repetition, 83 percent maximum-fill
Round 4: repetition, 66 percent maximum-fill
Round 6: repetition, 75 percent maximum-fill
Round 4: empty, 66 percent maximum-fill
Round 10: giveup, 61 percent maximum-fill
Round 10: giveup, 56 percent maximum-fill
Round 4: empty, 66 percent maximum-fill
Round 6: repetition, 33 percent maximum-fill
Round 3: empty, 57 percent maximum-fill
Round 3: repetition, 100 percent maximum-fill
Round 6: repetition, 73 percent maximum-fill
Round 10: giveup, 50 percent maximum-fill
Round 6: repetition, 50 percent maximum-fill
Round 10: giveup, 73 percent maximum-fill
Round 5: empty, 80 percent maximum-fill
Round 10: giveup, 61 percent maximum-fill
Round 3: repetition, 53 percent maximum-fill
Round 10: giveup, 33 percent maximum-fill
Round 10: giveup, 80 percent maximum-fill
Round 10: giveup, 63 percent maximum-fill
Round 10: giveup, 70 percent maximum-fill
Round 10: giveup, 84 percent maximum-fill
Round 7: repetition, 70 percent maximum-fill
Round 10: repetition, 57 percent maximum-fill
Round 10: giveup, 55 percent maximum-fill
Round 6: repetition, 36 percent maximum-fill
Round 4: repetition, 75 percent maximum-fill
Round 10: giveup, 72 percent maximum-fill
Round 10: giveup, 64 percent maximum-fill
Round 10: giveup, 84 percent maximum-fill
Round 10: giveup, 58 percent maximum-fill
Round 10: giveup, 60 percent maximum-fill
Round 10: giveup, 53 percent maximum-fill
Round 4: repetition, 40 percent maximum-fill
Round 4: empty, 40 percent maximum-fill
Round 10: giveup, 50 percent maximum-fill
Round 10: giveup, 68 percent maximum-fill


user80551

1

4

## Perl中，308，304，305，293，264，262

-p从STDIN读取（加+1计数）运行。由于r替换修饰符，因此需要5.014 。

(@a,%h,$m)=('',map<>=~y/ox\n/\0!/rd,1..$_);for$n(0..10){$_="Round $n: ".($h{$_="@a"}++?repetition:(($.=100*y/!///y/ //c)<$m?$.:$m=$.)?giveup:empty).", $m percent maximum-fill\n";@a=/g/?map{$_=$a[$i=$_];y//!/cr&(s/.//r.P^P.s/.$//r^$a[$i+1]^$a[$i-1])}0..$#a:last}  # '-p' switch wraps code into the 'while(<>){....}continue{print}' loop, # which reads a line from STDIN into$_, executes '....' and prints contents
# of $_. We use it to read board height and print current board's result. # First line reads board's state into @a array, a line per element, at the same # time replacing 'o' with 'x00', 'x' with '!' and chomping trailing newlines. # '!' was chosen because it's just like 'x01' except 5th bit (which is not important) # but saves several characters in source code. # Note: array is prepended with an empty line, which automatically remains in this # state during evolution, but saves us trouble of checking if actual (any non-empty) # line has neighboring line below. # %h hash and$m hold seen states and maximum fill percentage for current board,
# they are initialized to undef i.e empty and 0.

(@a,%h,$m)=('',map<>=~y/ox\n/\0!/rd,1..$_);

# /
# Then do required number of evolutions:

for$n(0..10){ # Stringify board state, i.e. concatenate lines with spaces ($") as separators.
# Calculate fill percentage - divide number of '!' by number of non-spaces.
# Note: using $. magick variable automatically takes care of rounding. # Construct output string. It's not used if loop gets to next iteration. # Check if current state was already seen (at the same time add it to %h) # and if fill percentage is 0.$_="Round $n: " .($h{$_="@a"}++?repetition:(($.=100*y/!///y/ //c)<$m?$.:$m=$.)?giveup:empty)
.", $m percent maximum-fill\n"; # / # Next is funny: if output string contains 'g' (of 'giveup' word), then evolve # further, otherwise break-out of the loop. @a=/g/ ?map{ # Do evolution round. Act of evolution for a given line is none other than # XOR-ing 4 strings: itself shifted right, itself shifted left, line above, line # below. Result of this operation is truncated to original length using bitwise '&'. # Note, when shifting string right or left we prepend (append) not an ascii-0, # but 'P' character. It's shorter, and 4th and 6th bits will be annihilated anyway.$_=$a[$i=$_]; y//!/cr &(s/.//r.P ^P.s/.$//r
^$a[$i+1]
^$a[$i-1])
}0..$#a :last } 哇，这么快就解决了。我很惊讶 由于我不熟悉PERL（虽然已经安装了它），如何使用输入数据启动脚本？ 2014年 2 @DevanLoper，例如，perl -p x.pl < input.txt如果数据在文件中，或者perl -p x.pl逐行输入以测试单个条目（以ctrl-Dctrl-Z）终止）。切记检查一下您的perl 5.014或更高版本。 user2846289 感谢VadimR，现在它可以运行了。但是关于打印填充百分比，我在两行中有不同的结果。但这可能是舍入错误。 2014年 1 @DevanLoper，对不起，这是我的错误，百分比取自先前的迭代。我会尽快修复。 user2846289 1 错误已修复，+丢弃了一些字节。测试结果与链接站点的结果匹配。从技术上讲，运行11轮，但不检查也不使用最后一轮的状态。简洁起见。我在开始时就放置了循环中断条件以捕获1 \n o输入。 user2846289 3 # C＃-1164个字符 这是我第一次参加代码高尔夫，所以请放纵;-) 我知道，我距离最佳结果还差得很远-顺便说一句，真是太神奇了！ 但是我以为我还是会用C＃分享我的解决方案。 using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Net;class Program{static void Main(string[] args){new WebClient().DownloadFile("http://mc.capgemini.de/challenge/in.txt",@"D:\in.txt");var a=File.ReadAllLines(@"D:\in.txt");int l=0;while(l<a.Length){int n=Int32.Parse(a[l]);var b=a.Skip(l+1).Take(n).ToArray();var f=new List<string[]>{b};var d=0;string g=null;while(d<10){var s=f.Last();if(s.All(e=>e.All(c=>c=='o'))){g="empty";break;}var h=new string[n];for(int r=0;r<n;r++){var k="";for(int c=0;c<b[r].Length;c++){int x=0;try{if(s[r][c-1]=='x')x++;}catch{}try{if(s[r][c+1]=='x')x++;}catch{}try{if(s[r-1][c]=='x')x++;}catch{}try{if(s[r+1][c]=='x')x++;}catch{}k+=((x%2)==1)?'x':'o';}h[r]=k;}d++;f.Add(h);var w=false;for(int i=0;i<f.Count-1;i++){var m=f[i];if (!h.Where((t,y)=>t!=m[y]).Any())w=true;}if(w){g="repetition";break;}}if(d==10&&g==null)g="giveup";File.AppendAllLines(@"D:\out.txt",new[]{string.Format("Round {0}: {1}, {2} percent maximum-fill",d,g,f.Select(z=>{int t=0;int x=0;foreach(var c in z.SelectMany(s=>s)){t++;if(c=='x')x++;}return(int)Math.Floor((double)x/t*100);}).Concat(new[]{0}).Max())});l=l+n+1;}}} 仅using指令已包含97个字符-因此，我认为要在200个字符以内实现其余字符将非常困难。 这是一个相当迭代的方法，在许多地方都使用了LINQ。我还包括下载输入文件并将输出文件写入代码中。 这是一个更具可读性的版本： using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; class Program { static void Main(string[] args) { // Download the file new WebClient().DownloadFile("http://mc.capgemini.de/challenge/in.txt", @"D:\in.txt"); // Read of lines of downloaded file var a = File.ReadAllLines(@"D:\in.txt"); // Line index in input file int l = 0; while (l < a.Length) { // Parse number of rows to take int n = Int32.Parse(a[l]); // Take the n rows var b = a.Skip(l + 1).Take(n).ToArray(); var f = new List<string[]> { b }; var d = 0; string g = null; while (d < 10) { // Last state consists only of o's? -> var s = f.Last(); if (s.All(e => e.All(c => c == 'o'))) { g = "empty"; break; } // In h we will build up the new state var h = new string[n]; // Loop through all rows of initial state for (int r = 0; r < n; r++) { // This is our new row we will build up for the current state var k = ""; // Count number of orthogonal adjacent x's // And catch potential OutOfRangeExceptions for (int c = 0; c < b[r].Length; c++) { int x = 0; try { if (s[r][c - 1] == 'x') x++; } catch { } try { if (s[r][c + 1] == 'x') x++; } catch { } try { if (s[r - 1][c] == 'x') x++; } catch { } try { if (s[r + 1][c] == 'x') x++; } catch { } // Is number of adjacent x's odd? -> character will be 'x' // otherwise -> 'o' k += ((x % 2) == 1) ? 'x' : 'o'; } // Add the new row to the current state h[r] = k; } // Increase round count d++; // Add the new state to our state collection f.Add(h); // Now check, whether it is a repetition by comparing the last state (h) with all other states bool w = false; for (int i = 0; i < f.Count - 1; i++) { var m = f[i]; if (!h.Where((t, y) => t != m[y]).Any()) w = true; } if (w) { g = "repetition"; break; } } // Check whether we reached maximum AND the last round wasn't a repetition if (d == 10 && g == null) g = "giveup"; // Now we append the final output row to our text file File.AppendAllLines(@"D:\out.txt", new[] { string.Format("Round {0}: {1}, {2} percent maximum-fill", d, g, // Here we select all rates of x's per state // and then grab the maximum of those rates f.Select(z => { int t=0; int x=0; foreach (char c in z.SelectMany(s => s)) { t++; if(c=='x') x++; } return (int) Math.Floor((double) x / t *100); }).Concat(new[] {0}).Max()) }); // finally we shift our index to the next (expected) number n in the input file l = l + n + 1; } } } 1 简而言之，本的解决方案。您已经用C＃术语创建了这样一个解决方案的 缩影 2 # J-275字符 哦，所有这些I / O规范！最终，J的得分如此可耻。在STDIN后面加上换行符，并假设\r输入中没有任何回车符（）。这是将其应用于问题中的样本输入文件的结果。 stdout;,&LF&.>}:(".@{~&0(('Round ',":@(#->/@t),': ',(emptyrepetitiongiveup{::~2<.#.@t=.11&=@#,0={:),', ',' percent maximum-fill',~0":>./)@(100*1&=%&(+/"1)_&~:)@,.@(a=:(a@,[@.(e.~+.10<#@[)(_*_&=)+[:~:/((,-)(,:|.)0 1)|.!.0=&1){:)@,:@('ox'&i.^_:)@{.;$: ::]@}.)}.)];._2[1!:1]3


Ungolfed ：（稍后我可能会添加更详尽且对J-newbie友好的解释。）

input   =: ];._2 [ 1!:1]3
convert =: 'ox'&i. ^ _:               NB. 'x'=>1  'o'=>0  else=>infinity
cover   =: (_*_&=) + [: ~:/ spread    NB. collecting xs and removing tiles not on board
iterate =: (iterate@,  [ @. (e.~ +. 10<#@[) cover) {:
percent =: 100 * 1&= %&(+/"1) _&~:    NB. percentage of x at each step
max     =: 0 ": >./
stat    =: 11&=@# , 0={:              NB. information about the simulation
ending  =: emptyrepetitiongiveup {::~ 2 <. #.@stat   NB. how simulation ended
round   =: ": @ (# - >/@stat)         NB. round number
format  =: 'Round ', round, ': ', ending, ', ', ' percent maximum-fill',~ max
evolvex =: format @ percent@,. @ iterate@,: @ convert
joinln  =: ,&LF &.>
nlines  =: ". @ {~&0
remain  =: }.
stdout ; joinln }: (nlines (evolvex@{. ; $: ::]@}.) remain) input  $:部分使主体在输入上递归（J解析时非常不方便的形式），并@在每个部分上应用了菊花链。nlines查找下一板的行数。

2014年

1
@DevanLoper提醒我，我忘记了将其输出到stdout；添加了更正。现在应该可以使用标准方式了：jconsole golf.ijs < input.txt
algorithmhark

2014年

@DevanLoper问题似乎是我使用的v名称，无论出于何种原因，脚本均不允许使用该名称。（我一直在REPL中运行该代码段。）将其更改为a`似乎可行。
algorithmhark

@algoshark可能是我，但仍然无法打印出任何内容。
2014年