ลำดับ XOROR


23

เซลลูล่าร์ออโตมาน่าหลงใหลอย่างแท้จริง สิ่งที่มักถูกพูดถึงคือเลขฐานสองคือเลขที่แทนด้วยตัวเลข อย่างไรก็ตามในความคิดของฉันได้ทำไปสู่ความตาย Ternary CA นั้นน่าสนใจกว่านี้ แต่เรามี ASCII ทั้งหมดที่ต้องพิจารณา! สนุกจังเลย!

แทนที่จะเลือกชุดกฎสำหรับตัวละครแต่ละตัวฉันจะใช้กฎการตัดสินใจง่าย ๆ ที่จะพูดถึงในไม่ช้า ในการตัดสินใจเลือกคนรุ่นต่อไปเราจะพิจารณาเซลล์ "สามอันดับแรก" เหมือนเซลล์ออโตมาตา สังเกตตัวอย่าง:

QWERTY
X Y Z

"ด้านบน" ของYคือWERการเป็นเซลล์ด้านบนและขวาด้านบนและด้านบนและด้านซ้าย Y จะเป็นผลมาจากฟังก์ชั่นที่ฉันกำลังจะกำหนดซึ่งเป็นฟังก์ชั่นในสามสายอักขระ "top" ของXเป็น QW, หรือบรรจุในพื้นที่ที่ไม่มีอยู่จริง / มือถือที่หายไป

ตอนนี้สำหรับฟังก์ชั่นความสนุก ! ฉันเรียกลำดับนี้ว่าลำดับ XOROR ด้วยเหตุผล อนุญาตให้Aเป็นรหัสอักขระเซลล์ด้านบนซ้ายเป็นรหัสอักขระBของเซลล์ด้านบนและCเป็นรหัสอักขระของเซลล์ด้านบนขวา จากนั้นเซลล์ที่เกิดเป็นตัวละครที่มี charcode เป็น(A XOR B) OR C, (A^B)|Cที่อยู่, (หากค่าผลลัพธ์มากกว่า 126 จะมีการตั้งค่าเป็น(CHARCODE % 127) + 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สตริง th บนลำดับ XOROR ด้วย seed sโดยn = 0เป็นการแปลงแรกของสตริง
  2. กำหนดสตริงsเอาท์พุท (สำหรับโปรแกรม) หรือสร้าง (สำหรับฟังก์ชั่น / เครื่องกำเนิดไฟฟ้า) กระแสที่ไม่มีที่สิ้นสุดของลำดับ XOROR sที่มีเมล็ด คุณอาจเลือกที่จะหยุดถ้าลำดับซ้ำ แต่ไม่จำเป็น

s จะประกอบด้วยอักขระ ASCII ที่พิมพ์ได้เท่านั้นจากเว้นวรรคไปจนถึงแท็บตัวหนอนและแท็บ (ไม่มีบรรทัดใหม่)

นี่คือดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ


ฉันมีปัญหาในการแยกวิเคราะห์ประโยค "ดังนั้นสิ่งที่ฟังก์ชั่นอะไรฉันจะกำหนดบนสตริงสามถ่าน Y จะกลายเป็น" นี่อาจเป็นถ้อยคำใหม่: "Y จะเป็นผลมาจากฟังก์ชั่นที่ฉันกำลังจะกำหนดฟังก์ชั่นในสตริงสามตัว"?
hYPotenuser

3
ทั้งหมดของos ทำให้มันมีลักษณะเหมือนการวิ่ง Zerg
mbomb007

3
การสังเกต: เนื่องจาก XOR และ OR รักษาจำนวนบิตและ ASCII ทั้งหมดคือ 7 บิตกรณีเดียวเมื่อ CHARCODE คือ> 126 คือถ้ามันเป็น 127 ดังนั้นคุณสามารถแทนที่มันด้วยช่องว่าง (32) ตั้งแต่127%127+32==32นั้นมา
CAD97

2
ทำไมn=0ไม่ใช่สายดั้งเดิม?
Neil

3
@FatalSleep (d^!)|(space)สำหรับคุณร้องเรียนแรกที่ฉันกล่าวว่าถ้าเซลล์ไม่เป็นปัจจุบันผลที่ได้คือพื้นที่จึงค่อนข้างจะ สำหรับคำถามที่สองคุณจะดำเนินการ(CHAR%127)+32 หลังจาก XOROR ถูกดำเนินการ
Conor O'Brien

คำตอบ:


4

MATL , 33 31 ไบต์

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

การทำงานในรุ่น 13.1.0ของภาษา / คอมไพเลอร์ซึ่งมาก่อนความท้าทาย

อินพุตแรกคือตัวเลขส่วนที่สองคือสตริง

ลองออนไลน์!

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]:

60 คำซ้ำของ "Hello, World!"

plotCA[bXORnotb, 100]:

100 การทำซ้ำของแฮมเล็ตเดี่ยว

plotCA[raven, 100]:

100 การทำซ้ำของโพ


1
คุณไม่เพียงแค่ให้CellularAutomatonฟังก์ชั่นการอัพเดทของคุณ? (หมายเลขกฎจริงที่มี 127 รัฐที่ถูกต้องจะเป็นบ้า)
Martin Ender

@ MartinBüttnerคุณสามารถทำได้ แต่มันเป็นการพยายามที่จะอธิบายพฤติกรรมที่ขอบเพื่อให้สอดคล้องกับข้อมูลจำเพาะ BlockMap [] สั้นกว่า
hYPotenuser

7

Java, 193 185 ไบต์

เพราะจาวา

-8 ไบต์โดยเปลี่ยนเป็นการวนซ้ำมากกว่าการเรียกซ้ำเพื่อให้เป็นฟังก์ชันที่ไม่ระบุตัวตน

ส่งคืนการวนซ้ำที่ไม่เท่ากันของ XOROR ใน s

(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 ครั้ง ไบต์บางคนได้รับการบันทึกอย่างไรกับการสังเกตของฉันที่ CHARCODE> 126 ประโยคเท่านั้นที่เคยจะเกิดขึ้นกับ CHARCODE == 127 ซึ่งผลในการประหยัดแทนSPACEDEL

ฉันรันโค้ดของฉันผ่านสายที่เลือกมาไม่กี่ตัวและพบว่าวงจรที่ยอดเยี่ยมนี้:

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

5
คำตอบนี้มีลักษณะok!
Conor O'Brien


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}*เนื่องจากการดำเนินการ pre-modulo chars ไม่เกิน 127
Luis 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;}}

Ungolfed กับ 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 ไบต์)
Blackhole

2

C ++

ลำดับที่ (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;
    }
}

ลำดับที่ Nth โดยใช้ไวยากรณ์ของตัวชี้แทนที่จะใช้ไวยากรณ์ของอาเรย์เพื่อทำให้เกิดความสับสนมากขึ้น: (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 Duck

1
ฉันเขียนเวอร์ชัน C ++ ตั้งแต่เริ่มต้นเมื่อเปรียบเทียบกับของคุณแล้วรวมเข้าด้วยกันและได้สิ่งนี้ที่ 158 ไบต์: coliru.stacked-crooked.com/a/838c29e5d496d2a6
Mooing Duck

@MooingDuck ดี! อาจลดลงได้อีกโดยนัย int โดยคอมไพเลอร์ผ่านการย้ายไปยัง C
FatalSleep

แน่นอนไปข้างหน้า! คุณได้เขียนโค้ดครึ่งหนึ่งแล้ว
Mooing Duck

2

JAVA 240/280 ไบต์

เวอร์ชัน Java ที่เป็นที่นิยมในขณะที่ฉันเขียนอ้างว่าเป็น 185 ไบต์ แต่มีจุดเหลวไหลที่สำคัญสอง ขั้นแรกการวัดนั้นน่าจะเป็นเพียงฟังก์ชั่นเท่านั้นไม่ใช่สำหรับแหล่งการทำงานที่สมบูรณ์ อาจไม่ใช่ปัญหาดังกล่าว ประการที่สองมันใช้ 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

Swift: 273 ตัวละคร

ว้าวสวิฟท์แย่กว่า 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)}}

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

ขอบคุณ@ CAD97 ที่กล่าวถึงว่า (A ^ B) | C สามารถมากกว่า 126 ได้เมื่อ 127 เท่านั้น

ฉันยังตระหนักว่าคุณไม่จำเป็นต้องใช้วงเล็บใน A ^ B | C เพราะ XORing ทำเสร็จก่อนที่จะ ORing ดังนั้นจึงช่วยฉันสองสามไบต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.