แยก ASCII


33

กำหนด 95 อักขระที่พิมพ์ได้ใน ASCII บวกบรรทัดใหม่แยกมันออกเป็นสองกลุ่มเท่ากับ 48กลุ่มตัวอักษร (ต่อไปนี้เรียกว่ากลุ่ม A และกลุ่ม B) สร้างการแมปแบบหนึ่งต่อหนึ่งที่คุณเลือก (คุณมีดุลยพินิจโดยรวม) ระหว่างสองกลุ่ม กล่าวอีกนัยหนึ่งคือAอาจแมปไปaและกลับกัน แต่Aอาจแมปไป>และกลับกันหากนั่นคือสิ่งที่คุณต้องการสำหรับโปรแกรมของคุณ

เมื่อคุณแยก ASCII ออกเป็นสองกลุ่มแล้วให้เขียนสองโปรแกรมและ / หรือฟังก์ชั่นโดยใช้เฉพาะอักขระในแต่ละกลุ่มตามลำดับ กล่าวอีกนัยหนึ่งให้เขียนหนึ่งโปรแกรม / ฟังก์ชั่นที่ใช้เฉพาะอักขระในกลุ่ม A และอีกหนึ่งโปรแกรม / ฟังก์ชั่นที่ใช้อักขระในกลุ่ม B เท่านั้น

โปรแกรมเหล่านี้จะต้องสามารถรับอักขระหนึ่งตัวเป็นอินพุตได้ โปรแกรมที่เขียนด้วยอักขระในกลุ่ม A ควรเอาท์พุท / ส่งคืนอักขระเดียวกันหากอินพุตเป็นกลุ่มอักขระ A และกลุ่มอักขระ A ที่แม็พหากได้รับอักขระกลุ่ม B; โปรแกรมกลุ่ม A ควรแสดงอักขระกลุ่ม A เสมอ ในทำนองเดียวกันโปรแกรมกลุ่ม B ควรเอาท์พุทอักขระเดียวกันถ้าเป็นอักขระกลุ่ม B และอักขระกลุ่ม B ที่แมปหากอินพุตเป็นอักขระกลุ่ม A

นั่นอาจไม่ชัดเจนดังนั้นนี่เป็นตัวอย่าง หากคุณสมมติว่าตัวอักษรพิมพ์ใหญ่ทั้งหมดอยู่ในกลุ่ม A และตัวอักษรพิมพ์เล็กทั้งหมดอยู่ในกลุ่ม B และคุณเลือกว่าการทำแผนที่แบบหนึ่งต่อหนึ่งสำหรับตัวอักษรเหล่านี้มาจากตัวอักษรหนึ่งถึงอีกตัวหนึ่งจากนั้น: นี่คือบางส่วน ตัวอย่างอินพุต / เอาต์พุต:

โปรแกรม A:

Input    Output
A        A
D        D
a        A
q        Q

โปรแกรม B:

Input    Output
A        a
D        d
a        a
q        q

กฎอื่น ๆ :

  • ทั้งสองโปรแกรมไม่จำเป็นต้องเป็นภาษาเดียวกัน
  • พวกเขาไม่จำเป็นต้องเป็นทั้งโปรแกรมหรือฟังก์ชั่นทั้งสอง หนึ่งอาจเป็นโปรแกรมอื่น ๆ ฟังก์ชั่นที่ไม่เป็นไร
  • พวกเขาไม่จำเป็นต้องทำงานในลักษณะเดียวกันมีความยาวเท่ากันเช่นนั้น พวกเขาจะต้องเป็นไปตามกฎอื่น ๆ ข้างต้น
  • ใช่มีเพียงหนึ่งในโปรแกรมของคุณเท่านั้นที่สามารถใช้การขึ้นบรรทัดใหม่และมีเพียงรายการเดียวเท่านั้นที่สามารถใช้ช่องว่างได้ (อาจเป็นโปรแกรมเดียวกันหรือเป็นโปรแกรมอื่น)
  • คุณไม่จำเป็นต้องใช้อักขระทั้ง 48 ตัวในแต่ละโปรแกรม

ช่องโหว่มาตรฐานถูกแบนเหมือนปกติ โปรแกรมทั้งหมดจะต้องมีอยู่ในตัวเองไม่มีไฟล์ที่มีการแมปที่คุณเลือก

เกณฑ์การให้คะแนน: รหัสกอล์ฟโดยเฉพาะผลรวมของไบต์ของข้อความของทั้งสองโปรแกรม

กรุณาโพสต์คำตอบของคุณเช่นนี้:

ภาษา - # bytes + ภาษา - # bytes = # bytes

คำอธิบายที่ชัดเจนของแผนที่ของคุณ หากมันซับซ้อนให้ใช้แผนภูมิเช่นนี้:

ABCDEFGHIJKLMNOPQRSTUVWXYZ (etc.)
zyxwvutsrpqonmlkjihgfedcba (etc.)

หรือคุณสามารถอธิบายได้ (48 แผนที่แรกถึง 48 ลำดับสุดท้าย) ตามด้วยคำตอบของคุณตามปกติ


ฉันจะลองใช้ภาษาเดียวกันกับทั้งคู่ :)
mbomb007

ฉันคิดว่าคุณควรเปลี่ยนกฎโดยสุจริต จำกัด ให้เป็น "ทั้งสองโปรแกรมต้องเป็นภาษาเดียวกัน" มิฉะนั้นอาจเป็นวิธีที่ง่าย / กว้างเกินไป
mbomb007

จริง ๆ แล้วฉันสงสัยว่านี่เป็นไปได้ใน Brainfuck แก้ไขด้วยตนเอง คุณเพียงแค่ต้องมีโปรแกรมหนึ่งที่ใช้+และ>และอื่น ๆ ที่ใช้และ- <จากนั้นคุณต้องพยายามสร้างตัวดำเนินการที่หายไปเช่น,หรือ.ในโปรแกรมที่ไม่สามารถใช้งานได้
mbomb007

1
@Ruslan ลองใช้ SQL ไม่คำนึงถึงขนาดตัวพิมพ์และใช้คำหลัก (เริ่มต้นและสิ้นสุด) สำหรับการบล็อกโค้ด ถ้าคุณใช้ SQL Server 2014 คุณสามารถใช้การแทรกจำนวนมากของ DBCC สำหรับโปรแกรมหนึ่งและขั้นตอนสำหรับอีกโปรแกรมหนึ่ง ในอันแรกคุณสามารถหลีกเลี่ยงการใช้วงเล็บ จากนั้นใช้กรณีเลือกเมื่อคำสั่งสำหรับทั้งสองโปรแกรม นอกจากนี้ฉันเชื่อว่าเป็นไปได้ใน Java โดยใช้ \ u เคล็ดลับสำหรับโปรแกรมที่แทนที่อักขระทุกตัวด้วยค่ายูนิโค้ดและใช้ฟังก์ชันสำหรับอักขระอื่นที่ไม่ได้ใช้ตัวอักษร u, backslash หรือตัวเลข
bmarks

4
ที่ยากที่สุด ท้าทาย. เคย
Blackhole

คำตอบ:


6

CJam - 11 ไบต์ + CJam - 25 ไบต์ = 36 ไบต์

ตัวละครถูกเลือกในกลุ่มที่มีการสลับ 16:

 !"#$%&'()*+,-./@ABCDEFGHIJKLMNO`abcdefghijklmno
0123456789:;<=>?PQRSTUVWXYZ[\]^_pqrstuvwxyz{|}~\n

มันยอดเยี่ยมที่สามารถได้รับการแมปสองสามอย่างด้วยปุ่ม Shift :)

โปรแกรม A:

lL,H-f&'o+c

ลองออนไลน์

โปรแกรม B:

q_S<\_0=16|_127<\S0=42^??

ลองออนไลน์

คำอธิบาย:

โปรแกรม A:

l      read a line from the input, this is a 1-character string
        or the empty string if the input was a newline
L,     get the length of an empty string/array (0)
H-     subtract 17, obtaining -17 (~16)
f&     bitwise-"and" each character (based on the ASCII code) with -17
'o+    append the 'o' character
c      convert to (first) character
        the result is the "and"-ed character, or 'o' for newline

โปรแกรม B:

q_       read the whole input and duplicate it
S<\      compare with " " and move the result before the input
_0=      duplicate the input again, and get the first (only) character
16|      bitwise-"or" with 16 (based on the ASCII code)
_127<    duplicate and compare (its ASCII code) with 127
\        move the result before the "or"-ed character
S0=      get the space character (first character of the space string)
42^      xor with 42, obtaining a newline character
          stack: (input<" ") (input) ("or"-ed char<127) ("or"-ed char) (newline)
?        if the "or"-ed character is less than 127, use the "or"-ed character
          else use the newline character
?        if the input was smaller than space (i.e. it was a newline),
          use the input, else use the character from the previous step

ดี! ดีใจที่เห็นว่า "คู่ / คี่" ไม่ใช่คำตอบเดียว
durron597

ยังเป็นสวิตช์ 1 บิต ... ขนาดที่น่าประทับใจ! โปรแกรมที่สองที่มีอินพุต 'o' ดูเหมือนจะไม่ส่งออกข้อผิดพลาด \ n ... ในโปรแกรมหรือ cjam ออนไลน์
Brian Tuck

@BrianTuck มันออกบรรทัดใหม่ (ไม่ใช่ตัวอักษร\n) มันเป็นเรื่องง่ายที่จะเห็นโดยไม่ต้องตรวจสอบ html คุณสามารถต่อiท้ายโปรแกรมเพื่อดูรหัส ASCII แทน (หรือciจัดการกับการขึ้นบรรทัดใหม่เนื่องจากมันส่งออกสายอักขระขึ้นบรรทัดใหม่แทนที่จะเป็นตัวอักษรในกรณีนั้น)
aditsu

โอ้หรือคุณ / ฉันสามารถเปลี่ยน_0=เพื่อ0=_ให้มันออกอักขระเสมอ
aditsu

16

CJam - 46 44 26 11 ไบต์ + GolfScript - 142 125 115 93 68 47 40 36 ไบต์ = 47 ไบต์

ขอบคุณ Peter Taylor สำหรับการเล่นกอล์ฟ 6 ไบต์จากโปรแกรม GolfScript (และปูทางไปสู่สิ่งอื่น ๆ อีกมากมาย)

ขอบคุณเดนนิสสำหรับการเล่นกอล์ฟ 15 ไบต์จากโปรแกรม CJam และ 4 ไบต์จากโปรแกรม GolfScript

กลุ่ม A: ตัวละครทั้งหมดที่มีรหัสตัวอักษรคู่
กลุ่ม B: ตัวละครทั้งหมดที่มีรหัสตัวอักษรแปลก ๆ รวมถึงการขึ้นบรรทัดใหม่

ฉันกำลังใช้การแมปที่ชัดเจนระหว่างสองอย่างนั่นคือจับคู่ตัวละครเหล่านั้นที่แตกต่างกันในบิตที่มีนัยสำคัญน้อยที่สุดเท่านั้น ~\nและ นี่คือแผนที่ที่สมบูรณ์ (คอลัมน์):

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}\n

โปรแกรม A (CJam, ทดสอบที่นี่ ):

lX~f&"~"|X<

โปรแกรม B (GolfScript, ทดสอบที่นี่ ):

{1}'{-'{)}%'115)%11-[9)ie'9/{))}%++%

คำอธิบาย

โปรแกรม A

(ล้าสมัยจะอัปเดตในวันพรุ่งนี้)

โปรแกรมนี้ควรเปลี่ยนรหัสตัวอักษรคี่เป็นคู่เช่นตั้งค่าบิตที่สำคัญน้อยที่สุดเป็น 0 วิธีที่ชัดเจนในการทำเช่นนี้คือ bitwise และด้วย 126 (หรือ 254 เป็นต้น) แต่มันสั้นกว่าที่จะตั้งค่าเป็น 1 (ผ่าน bitwise OR ด้วย 1) แทนแล้วลดผลลัพธ์ สุดท้ายเราต้องแก้ไขบรรทัดใหม่ด้วยตนเอง:

"r"(  e# Push the string "r" and pull out the character.
(~    e# Decrement to q and eval to read input.
(     e# Pull out the character from the input string.
2(|(  e# (input OR (2-1))-1 == input AND 126
0$    e# Copy the result.
N&    e# Set intersection with a string containing a newline.
"~"   e# Push "~".
"@@"( e# Push "@@" and pull out one @.
(|    e# Decrement to ?, set union with the other string to give "@?".
~     e# Eval to select either the computed character or "~" if it was a newline.

โปรแกรม B

(ล้าสมัยจะอัปเดตในวันพรุ่งนี้)

โปรแกรมนี้สามารถตั้งค่าบิตที่มีนัยสำคัญน้อยที่สุดเป็น 1 ผ่านทางค่าบิตหรือด้วย 1 ในขณะนี้ แต่จะต้องตรวจสอบทั้ง\v(รหัสตัวอักษร 0x0B) และ<DEL>(รหัสตัวอักษร 0xFF) ด้วยตนเองและตั้งให้~เป็นแทน ใน GolfScript ฉันไม่มีสิทธิ์เข้าถึง eval แต่คุณสามารถเพิ่มสตริงลงในบล็อก (ซึ่งกลายเป็นส่วนหนึ่งของรหัสในบล็อกนั้น) ซึ่งฉันสามารถแมปเข้ากับอินพุตด้วย%:

{1}    # Push this block without executing it.
'{--'  # Push this string.
{)}%   # Increment each character to get '|..'.
')1)7?=[11=+9)?ie'
       # Push another string...
7/     # Split it into chunks of 7: [')1)7?=[' '11=+9)?' 'ie']
{))}%  # For each chunk, split off the last character and increment it.
+      # Add the array to the string, flattening the array: '|..)1)7?=\11=+9)@if'
+      # Add it to the block: {1|..)1)7?=\11=+9)@if}
%      # Map the block onto the input, i.e. apply it to the single character.

และสำหรับรหัสที่สร้างขึ้นในบล็อก:

1|..   # Bitwise OR with 1, make two copies.
)1)7?= # Check if the result is one less than 2^7 == 128 (i.e. if it's <DEL>).
\11=   # Check with the other copy if it's equal to 11 (i.e. if it's \v).
+      # Add them to get something truthy either way.
9)     # Push a 10 (i.e. \n).
@      # Pull up the original value.
if     # Select the correct result.

15

Java - 1088 ไบต์ + Java - 1144 ไบต์ = 2232 ไบต์

ขอบคุณ @ durron597 ที่ช่วยกอล์ฟ 1,090 ไบต์จากโปรแกรมแรก

พิสูจน์ได้ว่าเป็นไปได้ที่จะทำในภาษาเดียว (และไม่ใช่ esolang ที่)

ใช้เคล็ดลับยูนิโค้ดเพื่อแปลงอักขระแรกเป็นอักขระยูนิโค้ดทั้งหมด อันที่สองใช้การสะท้อนเพื่อเข้าถึง System.out เพื่อพิมพ์ไปยัง std ออก. มันไม่สามารถใช้ u ได้เพราะมันถูกใช้ในโปรแกรมแรก ฉันรู้ว่าสิ่งนี้สามารถเล่นกอล์ฟได้มากกว่านี้ แต่ฉันต้องการโพสต์วิธีแก้ปัญหาที่ถูกต้องก่อน

กลุ่มมีการแมปโดยพลการค่อนข้างเป็นธรรม แต่โดยพื้นฐานแล้วกลุ่มแรกต้องการเฉพาะ u, \, และตัวเลขฐานสิบหก (ไม่ว่าในกรณีใด)

กลุ่ม:

!#7$&89'0123456>fB@UXZ\^AKCDEGH_JL`NOkQRxzVWYu~\n
 "%()*+,-./:;<=?FIMPST[]abcdeghijlmnopqrstvwy{|}

โปรแกรมแรก:

\u0076\u006F\u0069\u0064
k\u0028\u0069\u006E\u0074
x\u0029\u007B\u0069\u006E\u0074\u005B\u005Du\u003D\u007B33\u002C33\u002C35\u002C35\u002C36\u002C55\u002C38\u002C39\u002C36\u002C38\u002C56\u002C57\u002C39\u002C48\u002C49\u002C50\u002C48\u002C49\u002C50\u002C51\u002C52\u002C53\u002C54\u002C55\u002C56\u002C57\u002C51\u002C52\u002C53\u002C54\u002C62\u002C62\u002C64\u002C65\u002C66\u002C67\u002C68\u002C69\u002C102\u002C71\u002C72\u002C66\u002C74\u002C75\u002C76\u002C64\u002C78\u002C79\u002C85\u002C81\u002C82\u002C88\u002C90\u002C85\u002C86\u002C87\u002C88\u002C89\u002C90\u002C92\u002C92\u002C94\u002C94\u002C95\u002C96\u002C65\u002C75\u002C67\u002C68\u002C69\u002C102\u002C71\u002C72\u002C95\u002C74\u002C107\u002C76\u002C96\u002C78\u002C79\u002C107\u002C81\u002C82\u002C120\u002C122\u002C117\u002C86\u002C87\u002C120\u002C89\u002C122\u002C117\u002C126\u002C10\u002C126\u007D\u003B\u0053\u0079\u0073\u0074\u0065\u006D\u002E\u006Fu\u0074\u002E\u0070\u0072\u0069\u006E\u0074\u0028x>10\u003F\u0028\u0063\u0068\u0061\u0072\u0029u\u005Bx\u002D32\u005D\u003A'\u005C\u006E'\u0029\u003B\u007D

เทียบเท่ากับ

void
k(int
x){int[]u={33,33,35,35,36,55,38,39,36,38,56,57,39,48,49,50,48,49,50,51,52,53,54,55,56,57,51,52,53,54,62,62,64,65,66,67,68,69,102,71,72,66,74,75,76,64,78,79,85,81,82,88,90,85,86,87,88,89,90,92,92,94,94,95,96,65,75,67,68,69,102,71,72,95,74,107,76,96,78,79,107,81,82,120,122,117,86,87,120,89,122,117,126,10,126};System.out.print(x>10?(char)u[x-32]:'\n');}

โปรแกรมที่สอง:

void n(int r)throws Throwable{int p=(int)Math.PI;int q=p/p;int t=p*p+q;int w=q+q;int[]g={t*p+w,t*p+w,t*p+q+p,t*p+q+p,t*(q+p),t*p+t-p,t*(q+p)+q,t*(q+p)+q+p,t*(q+p),t*(q+p)+q,t*(q+p)+w,t*(q+p)+p,t*(q+p)+q+p,t*(q+p)+p+w,t*(q+p)+p+p,t*(q+p)+t-p,t*(q+p)+p+w,t*(q+p)+p+p,t*(q+p)+t-p,t*(p+w)+t-w,t*(p+w)+t-q,t*(p+p),t*(p+p)+q,t*p+t-p,t*(q+p)+w,t*(q+p)+p,t*(p+w)+t-w,t*(p+w)+t-q,t*(p+p),t*(p+p)+q,t*(p+p)+p,t*(p+p)+p,t*(t-p)+t-p,t*(t-q)+t-p,t*(t-p)+p,t*(t-q)+t-q,t*t,t*t+q,t*(t-p),t*t+p,t*t+q+p,t*(t-p)+p,t*t+p+p,t*(t-q)+t-w,t*t+t-w,t*(t-p)+t-p,t*(t+q),t*(t+q)+q,t*(t-w),t*(t+q)+p,t*(t+q)+q+p,t*(t-w)+p,t*(t-w)+q+p,t*(t-w),t*(t+q)+t-w,t*(t+q)+t-q,t*(t-w)+p,t*(t+w)+q,t*(t-w)+q+p,t*(t-q)+q,t*(t-q)+q,t*(t-q)+p,t*(t-q)+p,t*t+p+w,t*t+t-q,t*(t-q)+t-p,t*(t-q)+t-w,t*(t-q)+t-q,t*t,t*t+q,t*(t-p),t*t+p,t*t+q+p,t*t+p+w,t*t+p+p,t*(t+q)+w,t*t+t-w,t*t+t-q,t*(t+q),t*(t+q)+q,t*(t+q)+w,t*(t+q)+p,t*(t+q)+q+p,t*(t+q)+p+w,t*(t+q)+p+p,t*(t+w)+p,t*(t+q)+t-w,t*(t+q)+t-q,t*(t+q)+p+w,t*(t+w)+q,t*(t+q)+p+p,t*(t+w)+p,t*(t+w)+q+p,t*(t+w)+p+w,t*(t+w)+q+p};java.io.PrintStream o=(java.io.PrintStream)System.class.getFields()[p/p].get(p);o.print((r<=t)?"}":(char)g[r-t*p-w]);}

ลองใช้งานได้ที่นี่: https://ideone.com/Q3gqmQ


ไม่มีตัวอักษรใดที่คุณสามารถดึงออกมาจากโปรแกรมแรกที่ไม่จำเป็นต้องใช้ Unicode เพื่อหลบหนี? คุณดึงตัวเลขบางส่วนออกมาได้หรือไม่? จะทำอย่างไรถ้าคุณทำvoid x(int z)เช่นนั้นตัวละครในชุดอักขระแรกก็เช่นกัน
durron597

ฉันแน่ใจว่าเป็นไปได้ ฉันสามารถเปลี่ยนชื่อตัวแปรบางตัวและแทนที่ช่องว่างทั้งหมดด้วยบรรทัดหรือแท็บใหม่ ฉันจะทำอย่างนั้นเมื่อฉันกลับถึงบ้าน ฉันแค่ต้องการพิสูจน์วิธีแก้ปัญหาภาษาเดียวก่อน
bmarks

5

ถาวร! Pyth - 23 ไบต์ + Pyth - 30 ไบต์ = 53 ไบต์

oops การแก้ไขข้อผิดพลาดโปรดอดใจรอ

ASCII เดียวกันแบ่งเป็นของ Martin:

1: "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
2:!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}\n

Prog # 1: ทดสอบออนไลน์

.xhft<zT.Dr\¡b:Z140 2\~

Prog # 2: ทดสอบออนไลน์

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