XORORシーケンス


23

セルオートマトンは本当に魅力的です。通常語られるのはバイナリー、つまり数値で表現できるものです。しかし、私の意見では、それらは死ぬまで行われました。三項CAはより興味深いものですが、考慮すべきASCIIがすべてあります!なんて楽しいのでしょう!

各キャラクターのルールセットを決定する代わりに、すぐに説明する簡単な決定ルールを使用します。次世代を決定するために、セルオートマトンのように3つの「トップ」セルを調べます。例に注目してください。

QWERTY
X Y Z

の「上部」はでYありWER、上下左右のセルです。Yは、3文字の文字列に対する関数である、定義しようとしている関数の結果になります。の「トップ」X QWまたは存在しない/欠落しているセルを埋めるスペースです。

さて、楽しい機能のために!このシーケンスをXORORシーケンスと呼んでいます。をA左上のセルの文字コード、B上のセルの文字コード、C右上のセルの文字コードにします。次に、結果のセルは、文字コードがの文字(A XOR B) OR C、つまりです(A^B)|C。(結果の値が126より大きい(CHARCODE % 127) + 32場合、値は32に設定されます。値が32より小さい場合、何も実行されません。)以下にシードの例を示し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

そして、私たちは今後しばらく続けることができます。この文字列の変更は、XORORシーケンスと呼ばれます。

目的次のタスクのいずれかを実行するプログラムまたは関数を作成します。

  1. ストリング所与s及び数n >= 0、出力nシードとXOROR配列上番目の文字列をs用いて、n = 0文字列の最初の変換です。
  2. 文字列をs指定すると、seedを使用してXORORシーケンスの無限ストリームを出力(プログラムの場合)または生成(関数/ジェネレーターの場合)しsます。シーケンスが繰り返される場合は停止することもできますが、これは必要ありません。

s スペースからチルダとタブまでの印刷可能なASCII文字のみで構成されます(改行はありません)。

これはであるため、バイト単位の最短プログラムが優先されます。


「3文字の文字列で定義しようとしている関数が何であれ、Yになります」という文の解析に問題があります。「Yは、定義しようとしている関数、3文字の文字列に対する関数の結果になります」と言い換えることができますか?
hYPotenuser

3
すべてのosは、それをツェルグラッシュのように見せます。
mbomb007

3
観察:XORとORはビット数を保持し、すべてのASCIIは7ビットであるため、CHARCODEが> 126の場合は127のみです。したがって、それをスペース(32)で置き換えることができます127%127+32==32
CAD97

2
なぜn=0元の文字列ではないのですか?
ニール

3
@FatalSleep最初の苦情については、セルが存在しない場合、結果はスペースであるため、むしろそうであると述べました(d^!)|(space)。2番目の質問については、XORORの実行(CHAR%127)+32 に実行します。
コナーオブライエン

回答:


4

MATL33 31バイト

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

これは、課題より前の言語/コンパイラのリリース13.1.0で機能します。

最初の入力は数値で、2番目の入力は文字列です。

オンラインでお試しください!

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バイト

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

CellularAutomaton[]ソリューションを機能させることは良いことですが、私は短期間で立ち続けました。誰でも?

編集:きれいな写真(クリックして拡大)

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

plotCA["Hello, World!", 60]

「Hello、World!」の60回の繰り返し

plotCA[bXORnotb, 100]

Hamlet独り言の100回の繰り返し

plotCA[raven, 100]

Poeの100回の繰り返し


1
CellularAutomaton更新機能だけを与えることはできませんか?(127の有効な状態を持つ実際のルール番号は正気ではありません。)
マーティンエンダー

@MartinBüttnerできますが、仕様に準拠するために、エッジでの動作を説明しようとするドラッグです。BlockMap []はただ短くなりました。
hYPotenuser

7

Java、193 185バイト

なぜならJava。

再帰ではなくループに切り替えて匿名関数にすることにより、-8バイト

sのXORORのn番目の反復を返します。

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

読み取り可能なバージョン:

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

操作をn回適用するための再帰ループを備えた、仕様のほぼ文字どおりの実装です。いくつかのバイトは> 126句CHARCODEがしか節約に結果CHARCODE == 127、で起こるのだろうという私の観察では、しかし、保存されたSPACE代わりにDEL

arbitrarily意的に選択したいくつかの文字列でコードを実行すると、この素晴らしいサイクルが見つかりました。

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

5
この答えは見えますok
コナーオブライエン


5

CJam、38バイト

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

ここでテストしてください。

説明

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.
  }%
}*

私はあなたといくつかのバイトを保存することができると思うlri){2S*\*3ew{)\:^|}%127c' er}*文字プリモジュロ演算が127を超えたことがないので
ルイスMendo

5

Haskell、123バイト

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)

これは、XORORシーケンスの無限ストリームを返します。使用例(シードの最初の5つの要素を印刷"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"

使い方:

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バイト(n付き)| 177バイト(無限)

無限印刷の方が短いことがわかりました...

// 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でゴルフを解く:

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

無制限の無限:

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
まだたくさんゴルフできます。たとえば、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バイトの長さ(-36バイト)です。
ブラックホール

2

C ++

N番目のシーケンス(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;}}

非ゴルフ

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

これをさらに混乱させるために、配列構文の代わりにポインター構文を使用するN番目のシーケンス:(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;}}

非ゴルフ

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

デバッグ機能(楽しみのために)

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
単に結果を返すのではなく、結果を出力する必要があることを結果が示していることを確認してください。
Mooingダック

1
私はあなたと比較してゼロからC ++バージョンを書き、それらをマージして、158バイトでこれを手に入れました:coliru.stacked-crooked.com/a/838c29e5d496d2a6
Mooing Duck

@MooingDuckいいね!おそらくCに移行することにより、コンパイラによる暗黙のintでさらに減らすことができます
。– FatalSleep

もちろん、どうぞ!あなたはすでにそのコードの半分を書いた
ダックMooing

2

JAVA 240/280バイト

私がこれを書いた当時の人気のあるJavaバージョンは185バイトであると主張していましたが、2つの重要なファッジポイントがあります。第一に、測定はおそらく機能についてのみであり、完全な作業ソースについてではありません。たぶんそのような問題ではありません。第二に、インポートまたは完全修飾名なしでBiFunctionを使用します。そのまま実行するために必要なビットを追加すると(それを最小限に抑えることで)、348バイトになりました。BiFunctionクラスの完全修飾名のみを追加すると、248バイトになります。

対照的に、同じルール(クラスなし、実際の出力なし、肉だけ)でプレイするとき、私は240バイトだと思います。完全な実行可能クラスは280バイトで、次のようになります(縮小されていない)。

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

または、縮小:

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バイト

+2を含む -lp

STDINの入力で実行します。例えば perl -lp xoror.pl <<< "Hello, World!" | head -26

xoror.pl

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

これはそのまま機能しますが、\x7f対応するバイナリ値で置き換えて、指定されたスコアを取得します


1

スイフト:273文字

わあ、SwiftはJavaよりも悪い!(長い名前を持つすべてのAPI!: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)}}

ゴルフをしていない:

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は127の場合に126よりも大きくなる可能性があることに言及してくれた@ CAD97に感謝します。

また、ORの前にXORが行われるため、A ^ B | Cの周りに括弧が必要ないことにも気付きました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.