'X'in evrimi


15

Verilen, maksimum 5 kat 5 alan büyüklüğünde değişken büyüklükte bir tahtadır. Her alan bir 'x' ile doldurulur. Eğer 'x' ile doldurulmazsa, 'o' ile doldurulur.

Her tahtanın başlangıç ​​durumu verilmiştir (aşağıya bakınız). Her tahtada 10 tur oynanmalıdır (maksimumda, koşullar: aşağıya bakınız) ve x'in evrimi izlenmelidir.

Bir tur aşağıdaki şekilde çalışır:

  1. her 'x' dik kenarlı alanlara yayılır, fakat kendini yok eder
  2. bir alanda iki 'x' olduğunda, birbirlerini nötralize ederler

Her turdaki tüm 'x'lerin evrimi aynı anda gerçekleşmelidir. Misal:

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

Her evrim turunda, kurulun 'x' boşaltılıp boşaltılmadığını görmelisiniz. Boş değilse, yinelenen bir desen olabilir. Eğer durum böyle değilse, evrimin analizinden vazgeçeriz. Ayrıca, her başlangıç ​​kartı için maksimum x alanı yüzdesini yazdırmanız gerekir (tam sayılara yuvarlanır).

Giriş:

Giriş verilerini burada bulabilirsiniz (Pastebin) Bu veriler 100 başlangıç ​​durumu içerir. Daha önce de belirtildiği gibi, levhaların boyutu değişir. Satır sayısı, 1'den 5'e kadar n sayısıyla belirtilir, ardından yalnızca 'x' ve 'o' içeren n satır, başlangıç ​​düzenini temsil eder. Bir tahtanın her satırında 1 ila 5 alan bulunur.

Çıktı:

Sonuçların her biri, her başlangıç ​​panosu için bir baskı satırı aşağıdaki biçimde yazdırılmalıdır:

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

Örnekler:

Örnek 1:

    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

Örnek 2:

    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

Sekiz günden sonra çalışma cevabını kazanan olarak en az karakterle işaretleyeceğim. Ek olarak 100 başlangıç ​​kartı (giriş) için doğru çıkışı gönderirim.

Tercih ettiğiniz (programlama / kodlama / her neyse) dilinizi kullanabilirsiniz.

İyi eğlenceler!

Not: Sorularınız varsa, sormaktan çekinmeyin.

PPS: Orijinal içerik oluşturucularla ilgili olarak: Almanca konuşabilen insanlar için, burada SPOILER İSTEMİYORSANIZ, TIKLAYINIZ sorusu alınmıştır . Zorluğu tamamlamak için resmi zaman sona erdiğinden, birinin kısa ve zarif bir çözüm bulup bulamayacağını görmek istedim.

2014/04/22:

Görev Tamamlandı! Kazanan kabul edildi olarak işaretlendi. Doğru çıktı:

    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

Lütfen code-golf veya code-challenge olarak etiketleyin, ancak her ikisini birden kullanmayın. (Bu durumda kod golfü olmalıdır).
user80551

1
Birisi bunu iyi tanımlanmış bir hücresel otomasyona dönüştürmelidir. :-)
Justin

Yanıtlar:


4

Perl, 308, 304, 305, 293, 264 , 262

Düzenleme: Son hatalardan biri sonra boş panoları için yanlış çıktı neden test hata sürdü (test paketi çıktı Tamam oldu). Dan beriRound 0 verilen çıkış biçimi (none test paketi olsa) girişteki boş panoları olabilir ancak anlamına gelebilir, hata düzeltilmesi gerekiyordu. Hızlı düzeltme, bayt sayımı artışı anlamına geliyordu (aslında 1 olarak) - elbette bir seçenek değil. Bu nedenle, biraz daha golf oynamak zorunda kaldı.

İle çalıştırın -p(saymak eklendi +1), STDIN'den okur. rİkame değiştirici nedeniyle 5.014 gerektirir .

(@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}

yani

# '-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
}

Vay, çok hızlı bir çözüm. Şaşırmış durumdayım. PERL (Ben yüklü olsa da) aşina olmadığım için, komut dosyası girdi verilerimle nasıl başlatabilirim?
plocks

2
@DevanLoper, örneğin perl -p x.pl < input.txtveriler bir dosyadaysa veya perl -p x.pltek girişi test etmek için satır satır besleyin ( ctrl-D( ctrl-Z) ile sonlandırın ). Perl'inizin daha 5.014yeni olup olmadığını kontrol etmeyi unutmayın .
user2846289

Teşekkürler VadimR, şimdi çalışıyor. Ancak yazdırılan dolgu yüzdesi ile ilgili olarak iki satırda farklı sonuçlar elde ediyorum. Ama bu yuvarlama hataları olabilir.
plocks

1
@DevanLoper, üzgünüm, bu benim hatam, yüzde önceki yinelemeden alınmıştır. Yakında tamir edeceğim.
user2846289

1
Hata düzeltildi, + bazı bayt atıldı. Test sonuçları, bağlantılı sitedeki sonuçlarla eşleşir. Teknik olarak, 11 mermi yapılır, ancak son turun durumu kontrol edilmez veya kullanılmaz. Hepsi kısalık için. 1 \n oGirdi yakalamak için başlangıçta döngü kırma koşulları yerleştirdim .
user2846289

3

1164 karakter

Bu benim kod-golf'e ilk katılımım, bu yüzden lütfen hoşgörülü olun ;-)

Biliyorum, en iyi sonuçlardan uzaktayım - bu arada gerçekten şaşırtıcı!

Ama yine de benim çözüm C # paylaşmak istiyorum düşündüm.

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;}}}

Sadece kullanma direktifleri zaten 97 karakter sayıyor - bu yüzden geri kalanını 200 karakterden az bir sürede elde etmek oldukça zor olacak.

Birçok yerde LINQ kullanan oldukça yinelemeli bir yaklaşımdır. Ayrıca girdi dosyasının indirilmesini ve çıktı dosyasının koda yazılmasını da dahil ettim.

İşte biraz daha okunabilir versiyon:

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
Kısa, daha kısa Ben'in Çözümü. C # terimleriyle böyle bir çözüm düşüncesini
yarattınız

2

J - 275 karakter

Oh, tüm bu I / O özellikleri! Sonunda J için utanç verici derecede büyük bir puan. Sondaki satırsonu ile STDIN girdisi alır ve girdide satır başı ( \r) olmadığını varsayar . Sorunun örnek girdi dosyasına uygulanmasının sonucu aşağıdadır.

stdout;,&LF&.>}:(".@{~&0(('Round ',":@(#->/@t),': ',(empty`repetition`giveup{::~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: (Daha sonra J-newbie dostu bir açıklama ekleyebilirim.)

input   =: ];._2 [ 1!:1]3
convert =: 'ox'&i. ^ _:               NB. 'x'=>1  'o'=>0  else=>infinity
spread  =: ((,-)(,:|.)0 1) |.!.0 =&1  NB. x spreading outwards
cover   =: (_*_&=) + [: ~:/ spread    NB. collecting x`s 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  =: empty`repetition`giveup {::~ 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

$:Parçası uygulanması, girişi üzerinden ana gövdesi recurse (J ayrıştırmak için son derece rahatsız edici bir şekilde) yapan @her bölüm üzerinde papatya zinciri. nlinessonraki pano için satır sayısını bulur.

Her tahtadaki ( evolvex) eylem düzgün: iterate( agolf olarak adlandırılır ), daha önce görülen bir şeye veya çok fazla adım atana kadar simülasyonun her yinelemesinin bir listesini oluşturur. Sonra percent@,.her bir sonucun doldurulan meydanda yüzdesini hesaplar ve format(bazı istatistikler çalıştırır stat, denilent simülasyonun nasıl bittiğini, tüm bunların bir dizgide biçimlendirilmesinden önce en büyük yüzdeyi ve benzeri şeyleri anlamak için golf olarak ) .

Son olarak, tüm ayrı pano çıktılarını bir satırsonu ayrılmış dize halinde birleştirmeden }:önce bazı çöplerle ilgilenir ; joinln.


Merhaba algoritma, giriş parametresi olarak bir .txt dosyasıyla komut dosyanızı komut satırından nasıl başlatacağınıza ilişkin talimatları verebilir misiniz? Teşekkürler!
2014'te

1
@DevanLoper Bu hatırlatıyor, stdout çıktı vermeyi unuttum; bu düzeltmeyi ekledi. Artık standart bir yol çalışması gerekir: jconsole golf.ijs < input.txt.
algorithmmshark

Bilgi için teşekkürler, ancak kodunuz değişse bile benim için herhangi bir çıktı yazdırmıyor.
2014'te

@DevanLoper Sorun v, komut dosyalarında herhangi bir nedenle izin verilmeyen bir isim olarak kullanımım gibi görünüyor . (Snippet'i REPL'de çalıştırıyordum.) Bunu değiştirmek aişe yarıyor gibi görünüyor.
algorithmmshark

@algoshark Ben olabilirim, ama yine de bana bir şey yazdırmak için alamıyorum.
2014'te
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.