Algorithm 高尔夫:兄弟

Algorithm 高尔夫:兄弟,algorithm,console-application,Algorithm,Console Application,我刚刚参加完2009年ACM ICPC编程大会的拉丁美洲决赛。这些问题是针对巴西、玻利维亚、智利等的 我和我的团队只能完成11个问题中的两个(我认为第一次尝试还算不错) 这是我们可以完成的。我很想看到代码的任何变化。问题全文:ps:这些问题也可以在ICPC官方网站上找到,每个人都可以访问 在ACM的土地上,一位贪婪的国王开始沉迷于秩序。王国呈长方形,国王将领土划分为长方形的小郡。国王临死前把郡分给了他的儿子们 国王没有意识到儿子之间的竞争:第一个继承人恨第二个,但不恨其他继承人;第二个继承人恨

我刚刚参加完2009年ACM ICPC编程大会的拉丁美洲决赛。这些问题是针对巴西、玻利维亚、智利等的

我和我的团队只能完成11个问题中的两个(我认为第一次尝试还算不错)

这是我们可以完成的。我很想看到代码的任何变化。问题全文:ps:这些问题也可以在ICPC官方网站上找到,每个人都可以访问


在ACM的土地上,一位贪婪的国王开始沉迷于秩序。王国呈长方形,国王将领土划分为长方形的小郡。国王临死前把郡分给了他的儿子们

国王没有意识到儿子之间的竞争:第一个继承人恨第二个,但不恨其他继承人;第二个继承人恨第三个,但不恨其他继承人,等等……最后,最后一个继承人恨第一个继承人,但不恨其他继承人

国王一死,国王的儿子们之间奇怪的竞争就在王国引发了一场全面的战争。袭击只发生在两个相邻县之间(相邻县是共享一条垂直或水平边界的县)。每当X恨Y时,一个县X就会攻击相邻的县Y。被攻击的县总是被征服。所有同时进行的攻击和一系列同时进行的攻击称为战斗。经过若干次战斗后,幸存的儿子们休战,再也没有战斗过

例如,如果国王有三个儿子,分别命名为0、1和2,下图显示了在给定初始土地分配的第一场战斗中发生的情况:


输入

输入包含几个测试用例。测试用例的第一行包含四个整数,N、R、C和K

  • N-继承人的数量(2个F#,675个字符) 输出:

    2220
    2101
    2220
    0200
    103
    212
    
    Python 2.6376个字符 此代码的灵感来自:

    Python(420个字符) 我已经有一段时间没有玩代码高尔夫谜题了,所以我肯定我错过了一些东西:

    import sys
    H,R,C,B=map(int,raw_input().split())
    M=(1,0), (0,1),(-1, 0),(0,-1)
    l=[map(int,r.split())for r in sys.stdin]
    n=[r[:]for r in l[:]]
    def D(r,c):
     x=l[r][c]
     a=[l[r+mr][c+mc]for mr,mc in M if 0<=r+mr<R and 0<=c+mc<C]
     if x==0and H-1in a:n[r][c]=H-1
     elif x-1in a:n[r][c]=x-1
     else:n[r][c]=x
    G=range
    for i in G(B):
     for r in G(R):
      for c in G(C):D(r,c)
     l=[r[:] for r in n[:]]
    for r in l:print' '.join(map(str,r))
    
    导入系统 H、 R,C,B=map(int,raw_input().split()) M=(1,0),(0,1),(-1,0),(0,-1) l=[sys.stdin中r的映射(int,r.split())] n=[r[:]表示l[:]中的r def D(r,c): x=l[r][c] a=[l[r+mr][c+mc]表示mr,mc单位为M,如果0Lua,291个字符 g=loadstring(“return io.read('*n')”)重复n=g()r=g()c=g()k=g()l={}c=c+1 i=0,k do w={}对于x=1,r*c do a=l[x]和(l[x]+n-1)%n w[x]=i==0和x%c~=0和 或(l[x-1]==a或l[x+1]==a或l[x+c]==a或l[x-c]==a)和或 l[x]io.write(i~=k和“”或x%c==0和“\n”或w[x]..”)结束l=w结束,直到n==0为止 Perl,233字符
    {$\=;($~,$R,$C,$K)=拆分;如果($~){@A=map{$\=;拆分}1..$R;$x=0,
    @A=map{$r=0;对于$d($C,$C,1,-1){$r}=($y=$x+$d)>=0&$y1 | 1-$d-2*$p}$x++;($-$r)%$~}@A
    而$K--;打印“@a\n”while@a=splice@A,0,$C;重做}
    
    地图被保存在一维数组中。这没有二维解决方案优雅,但它也更短。包含成语
    @a=map{…}@a
    ,所有战斗都在括号内进行。

    AWK-245 虽然有点晚了,但是…数据在1-D数组中。使用2-D数组,解决方案大约长30个字符

    NR<2{N=$1;R=$2;C=$3;K=$4;M=0}NR>1{for(i=0;i++<NF;)X[M++]=$i}END{for(k=0;k++<K;){
    for(i=0;i<M;){Y[i++]=X[i-(i%C>0)]-(b=(N-1+X[i])%N)&&X[i+((i+1)%C>0)]-b&&X[i-C]-b
    &&[i+C]-b?X[i]:b}for(i in Y)X[i]=Y[i]}for(i=0;i<M;)printf"%s%d",i%C?" ":"\n",
    X[i++]}
    

    NR1{for(i=0;i++为什么投票关闭?这对你来说是冒犯吗?我不明白为什么stackoverflowers会对code golf的问题是否合法大惊小怪。我建议把这个问题留给社区成员来解决。由此产生的解决方案对我这样的人来说是很有教育意义的。没有任何东西能展示编程语言的能力比code golf更简洁的年代…我真的很震惊于那些高傲的用户如此多的负面评论。FFS,这是一个任何想尝试一下的人的问题。就像我说的,我们用Java解决了它,我希望看到其他的解决方案。我是否应该把这个问题重新命名为code Volleyball,这样人们就不会觉得code golf的名字被偷了?长大吧。Ev每次发布代码高尔夫问题时,我都会看到人们抱怨,我想知道:“在你被忽略的标签列表中添加‘代码高尔夫’真的有那么难吗?”关于代码高尔夫的适当性的元讨论(到目前为止,裁决是肯定的)以及关于什么是“好”代码高尔夫问题的元讨论:(这可能需要更多的输入…).从后面开始,我们看到一个混合的代码黄金问题关闭和打开,所以YMMV。当我执行此操作时,代码还输出NRCK值,从第二个测试用例开始(所以,
    4 2 3 4
    0 0
    )@Stephan202:这对我来说绝对不行……我不知道这怎么会发生,读代码。@Steve:我按照Brian的帖子中指定的方式输入。我以
    python2.6 Steve.py
    的方式运行代码。然后输出应该由6行组成(同样,请参见Brian的帖子)。然而,由于某些原因,输出是8行。很奇怪,你没有观察到相同的行为…@Steve:我看了你的代码。它只处理一个测试用例,而不是所有的。啊,好吧,我现在明白了——我没有仔细阅读原文,认为每次运行一个测试用例。这个解决方案一次只处理一个测试用例。@Stephan202,如果您将Python和Haskell分成两个单独的答案,这将允许人们分别投票给他们。
    3 4 4 3
    0 1 2 0
    1 0 2 0
    0 1 2 0
    0 1 2 2
    4 2 3 4
    1 0 3
    2 1 2
    0 0 0 0
    
    2220
    2101
    2220
    0200
    103
    212
    
    import sys
    A=range
    l=lambda:map(int,raw_input().split())
    def x(N,R,C,K):
     if not N:return
     m=[l()for _ in A(R)];n=[r[:]for r in m]
     def u(r,c):z=m[r][c];n[r][c]=(z-((z-1)%N in[m[r+s][c+d]for s,d in(-1,0),(1,0),(0,-1),(0,1)if 0<=r+s<R and 0<=c+d<C]))%N
     for i in A(K):[u(r,c)for r in A(R)for c in A(C)];m=[r[:]for r in n]
     for r in m:print' '.join(map(str,r))
     x(*l())
    x(*l())
    
    import Monad
    import Array
    import List
    f=map
    d=getLine>>=return.f read.words
    h m k=k//(f(\(a@(i,j),e)->(a,maybe e id(find(==mod(e-1)m)$f(k!)$filter(inRange$bounds k)[(i-1,j),(i+1,j),(i,j-1),(i,j+1)])))$assocs k)
    main=do[n,r,c,k]<-d;when(n>0)$do g<-mapM(const d)[1..r];mapM_(\i->putStrLn$unwords$take c$drop(i*c)$f show$elems$(iterate(h n)$listArray((1,1),(r,c))$concat g)!!k)[0..r-1];main
    
    import Control.Monad
    import Data.Array.IArray
    import Data.List
    
    type Index = (Int, Int)
    type Heir = Int
    type Kingdom = Array Index Heir
    
    -- Given the dimensions of a kingdom and a county, return its neighbors.
    neighbors :: (Index, Index) -> Index -> [Index]
    neighbors dim (i, j) =
      filter (inRange dim) [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]
    
    -- Given the first non-Heir and a Kingdom, calculate the next iteration.
    iter :: Heir -> Kingdom -> Kingdom
    iter m k = k // (
      map (\(i, e) -> (i, maybe e id (find (== mod (e - 1) m) $
                                        map (k !) $ neighbors (bounds k) i))) $
      assocs k)
    
    -- Read a line integers from stdin.
    readLine :: IO [Int]
    readLine = getLine >>= return . map read . words
    
    -- Print the given kingdom, assuming the specified number of rows and columns.
    printKingdom :: Int -> Int -> Kingdom -> IO ()
    printKingdom r c k =
      mapM_ (\i -> putStrLn $ unwords $ take c $ drop (i * c) $ map show $ elems k)
            [0..r-1]
    
    main :: IO ()
    main = do
      [n, r, c, k] <- readLine     -- read number of heirs, rows, columns and iters
      when (n > 0) $ do                -- observe that 0 heirs implies [0, 0, 0, 0]
        g <- sequence $ replicate r readLine   -- read initial state of the kingdom
        printKingdom r c $                      -- print kingdom after k iterations
          (iterate (iter n) $ listArray ((1, 1), (r, c)) $ concat g) !! k
        main                                               -- handle next test case
    
    import sys
    H,R,C,B=map(int,raw_input().split())
    M=(1,0), (0,1),(-1, 0),(0,-1)
    l=[map(int,r.split())for r in sys.stdin]
    n=[r[:]for r in l[:]]
    def D(r,c):
     x=l[r][c]
     a=[l[r+mr][c+mc]for mr,mc in M if 0<=r+mr<R and 0<=c+mc<C]
     if x==0and H-1in a:n[r][c]=H-1
     elif x-1in a:n[r][c]=x-1
     else:n[r][c]=x
    G=range
    for i in G(B):
     for r in G(R):
      for c in G(C):D(r,c)
     l=[r[:] for r in n[:]]
    for r in l:print' '.join(map(str,r))
    
    g=loadstring("return io.read('*n')")repeat n=g()r=g()c=g()k=g()l={}c=c+1 for i=0,k do w={}for x=1,r*c do a=l[x]and(l[x]+n-1)%n w[x]=i==0 and x%c~=0 and g()or(l[x-1]==a or l[x+1]==a or l[x+c]==a or l[x-c]==a)and a or l[x]io.write(i~=k and""or x%c==0 and"\n"or w[x].." ")end l=w end until n==0
    {$_=<>;($~,$R,$C,$K)=split;if($~){@A=map{$_=<>;split}1..$R;$x=0,
    @A=map{$r=0;for$d(-$C,$C,1,-1){$r|=($y=$x+$d)>=0&$y<@A&1==($_-$A[$y])%$~
    if($p=(1+$x)%$C)>1||1-$d-2*$p}$x++;($_-$r)%$~}@A
    while$K--;print"@a\n"while@a=splice@A,0,$C;redo}}
    
    NR<2{N=$1;R=$2;C=$3;K=$4;M=0}NR>1{for(i=0;i++<NF;)X[M++]=$i}END{for(k=0;k++<K;){
    for(i=0;i<M;){Y[i++]=X[i-(i%C>0)]-(b=(N-1+X[i])%N)&&X[i+((i+1)%C>0)]-b&&X[i-C]-b
    &&[i+C]-b?X[i]:b}for(i in Y)X[i]=Y[i]}for(i=0;i<M;)printf"%s%d",i%C?" ":"\n",
    X[i++]}