XOROR dizisi


23

Hücresel Otomatlar gerçekten büyüleyici. Genelde konuşulanlar ikili olanlardır, yani bir sayıyla temsil edilebilenlerdir. Ancak, bence, onlar ölümüne yapıldı. Üçlü CA'lar daha ilginç, ancak dikkate alınması gereken tüm ASCII'lere sahibiz! Ne eğlenceli olabilir ki!

Her karakter için bir kural kümesi belirlemek yerine, yakında konuşacağım basit bir karar kuralı kullanacağım. Gelecek nesillere karar vermek için, hücresel otomatlara benzeyen üç "üst" hücreye bakarız. Bir örneğe dikkat edin:

QWERTY
X Y Z

"Top" nin Yolduğunu WERyukarıda ve sağ yukarıda ve yukarıda ve sol hücreleri olmak. Y, tanımlayacağım fonksiyonun sonucu olacak, üç karakterli dizgelerde bir işlev. "Top" Xifadesi QW, varolmayan / eksik hücrede bulunan bir boşluktur .

Şimdi, eğlence işlevi için! Bu diziye bir nedenden dolayı XOROR dizisi diyorum. Izin Asol üst hücre charCode olmak, Byukarıdaki hücre charCode olabilir ve Csağ üst hücre charCode olmak. Daha sonra, ortaya çıkan hücre, charcode olan karakterdir (A XOR B) OR C, yani (A^B)|C. (Elde edilen değer 126'dan büyükse, o zaman ayarlanır (CHARCODE % 127) + 32. Bir değer 32'den küçükse hiçbir şey yapılmaz.) İşte tohumun bir örneği Hello, World!:

S: Hello, World!
0: mmmo/c_ z}~)e
   m = ( )^(H)|(e) = (32^72)|101 = 104|101 = 109 (m)
    m = (H)^(e)|(l) = (72^101)|108 = 45|108 = 109 (m)
    etc.
1: mmo/c_<   +wl
2: mo/c_<c< + |;
3: o/c_<c  ?+  g
4: oc_<c c??4+gg
5: 0_<c c  4+ o 
6: _<c ccc4??ooo
7:  c ccc4 ?o o 
8: ccccc4w? pooo
9: cccc4w h   o 
A: ccc4wc hh ooo
B: cc4wc4kh ooo 
C: c4wc4  #ooo o
D: wwc4w4#ooo oo
E: wc4wwc oo oo 
F: w4wwc4oo oo o
G: wwwc4   oo oo
H: wwc4w4 oo oo 
I: w4wwc4oooo oo
J: wwwc4  oo oo 
K: wwc4w4oo oo o
L: wc4wwo  oo oo
M: w4wwo8ooo oo 
N: wwwo8  o oo o
O: wwo8w8oooo oo

Ve bundan sonra bir süre devam edebiliriz. Dizenin bu modifikasyonuna XOROR dizisi denir.

Amaç Aşağıdaki görevlerden birini yapan bir program ya da işlev yazmalısınız:

  1. Bir dizi göz önüne alındığında, sve bir dizi n >= 0çıkış ntohumu ile XOROR sekansı inci dizisi sile, n = 0dizge ilk dönüşüm olmak.
  2. Bir dize verildiğinde s, çıktı (programlar için) veya tohumla XOROR dizisinin sonsuz bir akışını (işlevler / üreticiler için) oluşturur s. Dizi tekrarlanırsa durmayı seçebilirsiniz, ancak bu gerekli değildir.

s her zaman yalnızca yazdırılabilir ASCII karakterlerinden oluşur, uzaydan tilde artı sekmelere (yeni satır yok).

Bu bir , yani bayt cinsinden en kısa program kazanır.


"Üç karakterli bir dizgede tanımlamak üzere olduğum fonksiyon ne olursa olsun, Y olacak" cümlesini ayrıştırmakta güçlük çekiyorum. Bu yeniden değerlendirilebilir mi: "Y, tanımlayacağım fonksiyonun sonucu, üç karakterli dizgelerin üzerindeki bir fonksiyon olacak."
hYPotenuser

3
Tüm os zerg acele gibi görünmesini sağlar .
mbomb007

3
Gözlem: XOR ve OR bit sayısını ve tüm ASCII değerlerini 7 bit olduğundan, bir CHARCODE> 126 olduğunda 127 olan tek durum 127 ise olur. Bunun için, onu yalnızca boşluk (32) ile değiştirebilirsiniz 127%127+32==32.
CAD97

2
Neden n=0orijinal dize değil?
Neil

3
@FatalSleep İlk şikayetinize gelince, eğer hücre yoksa, sonucun bir boşluk olduğunu söylemiştim, bu yüzden daha iyi olurdu (d^!)|(space). İkinci soruya gelince , XOROR (CHAR%127)+32 yapıldıktan sonra gerçekleştirin.
Conor O'Brien,

Yanıtlar:


4

MATL , 33 31 bayt

Q:"32XKhKwh3YCPo2$1Z}Z~Z|127KYX

Bu , mücadeleden önceki dil / derleyicinin 13.1.0 sürümünde çalışır .

İlk girdi sayı, ikincisi dizedir.

Çevrimiçi deneyin!

Q           % take input (number) implicitly and add 1
:"          % repeat that many times
  32XK      %   push 32 (space). Copy to clipboard K.
  h         %   concatenate. Takes input (string) implicitly the first time
  Kwh       %   push space, swap, concatenate
  3YC       %   overlapping blocks of length 3 as columns of 2D array
  P         %   flip upside-down 
  o         %   convert to numbers
  2$1Z}     %   separate the three rows and push them
  Z~        %   bitwise XOR (note the rows are in reverse order)
  Z|        %   bitwise OR
  127KYX    %   replace 127 by space using regexprep, which converts to char
            % end loop
            % implicitly display

21

Mathematica, 133 bayt

FromCharacterCode@Nest[BlockMap[If[#>126,#~Mod~127+32,#]&[BitXor[#,#2]~BitOr~#3]&@@#&,ArrayPad[#,1,32],3,1]&,ToCharacterCode@#,#2+1]&

Bir CellularAutomaton[]çözüm çalışması yapmak iyi olurdu , ama kısa sürdüm. Kimse?

Düzenleme: güzel resimler (büyütmek için tıklayın)

plotCA[str_, n_] := ArrayPlot[NestList[foo[str],n], ColorFunction -> "Rainbow"]

plotCA["Hello, World!", 60]:

60 "merhaba, dünya!"

plotCA[bXORnotb, 100]:

100 tekrarlama Hamlet soliloquy

plotCA[raven, 100]:

100 Poe tekrarı


1
Sadece CellularAutomatongüncelleme fonksiyonunu veremez misin? (127 geçerli devlet ile gerçek kural numarası delilik olurdu.)
Martin Ender

@ MartinBüttner Yapabilirsiniz, ancak bu özellik ile uyumlu olması için kenarlardaki davranışları hesaba katmaya çalışmak bir sürüklenmedir. BlockMap [] sadece kısaydı.
hYPotenuser

7

Java, 193 185 bayt

Çünkü Java

İsimsiz bir işlev yapmak için özyinmek yerine döngüden geçerek -8 bayt

XOROR'un n. Yinelemesini s cinsinden döndürür.

(s,n)->{String o=s;for(;n-->=0;){o="";for(int i=0;i<s.length();i++){char c=(char)((i>1?s.charAt(i-1):' ')^s.charAt(i)|(i<s.length()-1?s.charAt(i+1):' '));o+=c>126?' ':c;}s=o;}return o;}

Okunabilir sürüm:

static BiFunction<String, Integer, String> f = (s,n)->{
    String o=s;
    for(;n-->=0;) {
        o = "";
        for (int i=0;i<s.length();i++) {
            char c=(char)((i>1?s.charAt(i-1):' ')^s.charAt(i)|(i<s.length()-1?s.charAt(i+1):' '));
            o+=c>126?' ':c;
        }
        s=o;
    }
    return o;
};

public static void main(String[]a) {
    System.out.println(f.apply("Hello, World",1));
}

Operasyon n kez uygulamak için özyinelemeli bir döngü ile hemen hemen spec, gerçek bir uygulaması. Bununla birlikte, bazı baytlar, CHARCODE> 126 yan tümcesinin yalnızca CHARCODE == 127 ile olacağını, ancak SPACEbunun yerine tasarrufla sonuçlanacağını gözlemledik DEL.

Kodumu rasgele seçilen birkaç dizginin üzerinden geçirdim ve şu harika döngüyü buldum:

oook$ok$ok$ok$
ook$ok$ok$ok$o
oo$ok$ok$ok$ok
oook$ok$ok$ok$

5
Bu cevap görünüyor ok!
Conor O'Brien,


5

CJam, 38 bayt

lri){2S*\*3ew{)\:^|_'~>{i127%' +}&}%}*

Burada test et.

açıklama

l                e# Read string.
ri               e# Read n.
){               e# Run this block n+1 times...
  2S*\*          e#   Wrap in two spaces.
  3ew            e#   Get all (overlapping) substrings of length 3.
  {              e#   Map this block over all those substrings...
    )\           e#     Pull off the third character and put it below the other two.
    :^           e#     Take XOR of the other two.
    |            e#     OR with the third one.
    _'~>         e#     Duplicate and check if it's greater than '~'.
    {i127%' +}&  e#     If so, mod 127, add to space.
  }%
}*

Sanırım birkaç bayttan tasarruf edersiniz lri){2S*\*3ew{)\:^|}%127c' er}*çünkü modülatör öncesi chars işlemi asla 127'yi geçmez
Luis Mendo

5

Haskell, 123 bayt

import Data.Bits
f s=toEnum.a<$>zipWith3(((.|.).).xor)(32:s)s(tail s++[32])
a x|x>126=32|1<2=x
tail.iterate(f.map fromEnum)

Bu, XOROR dizisinin sonsuz bir akışını döndürür. Kullanım örneği (tohumun ilk 5 öğesini yazdırın "Hello, World!"):

*Main> mapM_ print $ take 5 $ (tail.iterate(f.map fromEnum)) "Hello, World!"
"mmmo/c_ z}~)e"
"mmo/c_<   +wl"
"mo/c_<c< + |;"
"o/c_<c  ?+  g"
"oc_<c c??4+gg"

Nasıl çalışır:

tail.iterate(f.map fromEnum)               -- repeat forever: convert to ASCII
                                           -- value and call f, discard the first
                                           -- element (the seed).

                                           -- one iteration is:
  zipWith3(   )(32:s) s (tail s++[32])     -- zip the elements from the three lists
                                           -- (space:s), s and tail of s ++ space,
                                           -- e.g. s = "Hello!":
                                           --   | Hello|
                                           --   |Hello!|
                                           --   |ello! |
                                           -- (shortest list cuts off)

         ((.|.).).xor                      -- the function to zip with is a
                                           -- point-free version of (x xor y) or z

toEnum.a<$>                                -- adjust every element >126 and convert
                                           -- back to characters

4

PHP, 186 bayt (n ile) | 177 bayt (sonsuz)

Sonsuz baskının daha kısa olduğu ortaya çıktı ...

// With n
function x($s,$n){while($n-->=0){for($i=0,$r='';$i<strlen($s);$i++){$b=ord($s[$i-1])or$b=32;$a=ord($s[$i+1])or$a=32;$t=($b^ord($s[$i]))|$a;$r.=chr($t>126?($t%127)+32:$t);}$s=$r;}echo$s;}

// Infinite
function i($s){while(true){for($i=0,$r='';$i<strlen($s);$i++){$b=ord($s[$i-1])or$b=32;$a=ord($s[$i+1])or$a=32;$t=($b^ord($s[$i]))|$a;$r.=chr($t>126?($t%127)+32:$t);}echo$s=$r;}}

N ile affetmemiş:

function x($s, $n) { // $s - string to process; $n - which string to output
  while ($n-- >= 0) {
    for ($i = 0, $r = ''; $i < strlen($s); $i++) {
      $b = ord($s[$i - 1]) or $b = 32;
      $a = ord($s[$i + 1]) or $a = 32;
      $t = ($b ^ ord($s[$i])) | $a;
      $r .= chr($t > 126 ? ($t % 127) + 32 : $t);
    }
  $s = $r;
  }
  echo $s;
}

Ungolfed sonsuz:

function x($s) { // $s - string to process
  while (true) {
    for ($i = 0, $r = ''; $i < strlen($s); $i++) {
      $b = ord($s[$i - 1]) or $b = 32;
      $a = ord($s[$i + 1]) or $a = 32;
      $t = ($b ^ ord($s[$i])) | $a;
      $r .= chr($t > 126 ? ($t % 127) + 32 : $t);
    }
    echo $s = $r;
  }
}

1
Hala çok golf oynayabilir. Örneğin function i($s){for(;;$i=0,print$s=$r)for($r='';$i<strlen($s);$r.=chr($t>126?32:$t))$t=((ord($s[$i-1])?:32)^ord($s[$i]))|(ord($s[++$i])?:32);}, 141 bayt uzunluğundadır (-36 bayt).
Karadelik

2

C ++

Dokuzuncu Sıra (212)

void x(char*s,int l,int n){for (;n-->0;) {char*t=new char[l-1](),w;for(int i=0;i<l-1;i++)t[i]=((w=(((i-1>= 0)?s[i-1]:32)^s[i])|((i+1<l-1)?s[i+1]:32))>126)?((w%127)+32):w;for(int i=0;i<l-1;i++)s[i]=t[i];delete[]t;}}

Un-golfed

void x(char*s, int l, int n){
    for (;n-- > 0;) {
        char*t=new char[l-1](),w;
        for(int i = 0;i < l-1; i++)
            t[i] = ((w = (((i-1>= 0) ? s[i-1] : 32)^s[i]) | ((i+1 < l-1) ? s[i+1] : 32)) > 126) ? ((w % 127) + 32) : w;

        for(int i = 0; i < l-1; i++)
            s[i] = t[i];
        delete[]t;
    }
}

Bunu daha da kafa karıştırıcı hale getirmek için, dizi sözdizimi yerine işaretçi sözdizimini kullanan Nth-Sequence: (231)

void x(char*s,int l,int n){for(int x=0;x++<n;) {char*t=new char[l-1](),w;for(int i=0;i<l-1; i++)*(t+i)=((w=(((i-1>= 0)?*(s+i-1):32)^*(s+i))|((i+1<l-1)?*(s+i+1):32))>126)?((w%127)+32):w;for(int i=0;i<l-1;i++)*(s+i)=*(t+i);delete[]t;}}

Un-golfed

void x(char* s, int l, int n){
    for (;n-- > 0;) {
        char*t = new char[l-1](),w;
        for(int i = 0; i < l-1; i++)
            *(t+i) = ((w = (((i-1>= 0) ? *(s+i-1) : 32)^ *(s+i)) | ((i+1<l-1) ? *(s+i+1) : 32)) > 126) ? ((w%127)+32) : w;

        for(int i = 0;i < l-1; i++)
            s[i] = t[i];
        delete[]t;
    }
}

Hata Ayıklama İşlevi (Eğlence İçin)

void d(char* seed, int len, int nth) {
    for (int n = 0; n++ < nth;) {
        char* tout = new char[len - 1]();
        for (int i = 0; i < len - 1; i++) {
            char x, y, z;
            x = ((--i >= 0) ? seed[i] : 32);
            y = seed[++i];
            z = ((++i < len - 1) ? seed[i] : 32);
            char w = (x ^ y) | z;
            tout[--i] = (w > 126) ? ((w % 127) + 32) : w;

            cout << "[" << x << " " << y << " " << z << "] " << w << endl;
        }

        for (int i = 0; i < len - 1; i++)
            seed[i] = tout[i];
        delete[] tout;
        cout << endl;
    }
}

1
Oldukça emin sonuçları yapmanız gerekir ki çıkış sonucunu, sadece bunu döndürmez.
Mooing Duck

1
Sıfırdan bir C ++ sürümünü kendinize kıyasla yazdım ve birleştirdim ve 158 baytta
Mooing Duck

@MooingDuck Güzel! Muhtemelen C'ye geçerek derleyici tarafından int
intitit

tabii ki ileri git! Zaten bu kodun yarısını yazdın
Mooing Duck

2

JAVA 240/280 Bayt

Bunu yazdığım sırada popüler Java sürümünün 185 bayt olduğunu iddia etti, ancak iki önemli geçiştirme noktası var. İlk olarak, ölçüm muhtemelen tüm çalışma kaynağı için değil, sadece işlev içindir. Belki de böyle bir sorun değil. İkincisi, bir içe aktarma veya tam nitelikli bir ad olmadan BiFunction kullanır. Olduğu gibi çalıştırmak için gereken bitleri eklemek (sonra onu en aza indirgemek, adil bir şekilde) 348 byte'a getirdi. BiFunction sınıfının sadece tam isminin adını eklemek, onu 248 bayta getirir.

Buna karşılık, aynı kurallarla (benim sınıfım yok, gerçek çıktı yok, sadece et) oynayarak benimki 240 byte olduğuna inanıyorum. Tam çalıştırılabilir sınıf 280 bayttır ve şöyle görünür (küçültülmüş):

class z{
  public static void main(String[] s){
    int L=s[0].length();
    for(int G=Integer.valueOf(s[1]);G-->0;){
      s[1]="";
      for(int N=0;N<L;N++){
        char C=(char)((N>0?s[0].charAt(N-1):' ')^(s[0].charAt(N))|(N<L-1?s[0].charAt(N+1):' '));
        s[1]+=C>126?' ':C;
      }
      System.out.println(s[1]);
      s[0] =s[1];
    }
  }
}

Veya küçültülmüş:

void m(String[] s){int L=s[0].length();for(int G=Integer.valueOf(s[1]);G-->0;){s[1]="";for(int N=0;N<L;N++){char C=(char)((N>0?s[0].charAt(N-1):' ')^(s[0].charAt(N))|(N<L-1?s[0].charAt(N+1):' '));s[1]+=C>126?' ':C;}s[0]=s[1];}return s[0];}

2

Perl, 47 bayt

İçin +2 içerir -lp

STDIN'deki giriş ile çalıştırın, örn. perl -lp xoror.pl <<< "Hello, World!" | head -26

xoror.pl:

/./s;$_=$_.chop^" $_"|"$' ";y/\x7f/ /;print;redo

Bu şekilde çalışır, ancak \x7fverilen puanı almak için karşılık gelen ikili değerle değiştirin


1

Swift: 273 Karakterler

Vay, Swift, Java'dan daha kötü! (Uzun adlara sahip tüm API'ler!: P)

func c(s:String,n:Int=0-1){var a=[UInt8](s.utf8);for i in 0...(n>=0 ?n:Int.max-1){var z="";for i in 0..<a.count{let A=i-1<0 ?32:a[i-1],B=a[i],C=i+1<a.count ?a[i+1]:32;var r=A^B|C;r=r<32 ?32:r>126 ?32:r;z+=String(UnicodeScalar(r))};if n<0||i==n{print(z)};a=[UInt8](z.utf8)}}

Ungolfed:

func cellularAutoma(s: String,n: Int = -1)
{
    var array = [UInt8](s.utf8)
    for i in 0...(n >= 0 ? n : Int.max - 1)
    {
        var iteration = ""
        for i in 0..<array.count
        {
            let A = i - 1 < 0 ? 32 : array[i - 1], B = array[i], C = i + 1 < array.count ? array[i + 1] : 32
            var r = A ^ B | C
            r = r < 32 ? 32 : r > 126 ? 32 : r
            iteration += String(UnicodeScalar(r))
        }
        if n < 0 || i == n
        {
            print(iteration)
        }
        array=[UInt8](iteration.utf8)
    }
}

(A ^ B) | C’nin 127 iken 126’dan büyük olabileceğini belirttiği için @ CAD97’ye teşekkürler .

Ayrıca, A ^ B | C etrafında parantez gerekmediğini de farkettim, çünkü XORing, ORing'den önce yapıldı, bu yüzden bana birkaç bayt kazandırdı.

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.