Tách ASCII


33

Cho 95 ký tự có thể in trong ASCII cộng với dòng mới, chia nó thành hai nhóm 48 ký tự bằng nhau (sau đây gọi là nhóm A và nhóm B). Tạo ánh xạ một-một cho lựa chọn của bạn (bạn có toàn quyền quyết định) giữa hai nhóm. Nói cách khác, Acó thể ánh xạ tới avà ngược lại, nhưng Acũng có thể ánh xạ tới >và ngược lại, nếu đó là những gì bạn cần cho chương trình của mình.

Khi bạn chia ASCII thành hai nhóm, hãy viết hai chương trình và / hoặc hàm, chỉ sử dụng các ký tự trong mỗi nhóm, tương ứng. Nói cách khác, viết một chương trình / chức năng chỉ sử dụng các ký tự trong nhóm A và một chương trình / chức năng khác chỉ sử dụng các ký tự trong nhóm B.

Các chương trình này phải có khả năng nhận một ký tự làm đầu vào. Chương trình được viết với các ký tự trong nhóm A sẽ xuất / trả lại cùng một ký tự nếu đầu vào là một ký tự nhóm A và ký tự nhóm A được ánh xạ nếu nó nhận được một ký tự nhóm B; chương trình nhóm A phải luôn xuất ra một ký tự nhóm A. Tương tự, chương trình nhóm B sẽ xuất ra cùng một ký tự nếu đó là ký tự nhóm B và ký tự nhóm B được ánh xạ nếu đầu vào là ký tự nhóm A.

Điều đó có thể không rõ ràng, vì vậy đây là một ví dụ. Nếu bạn cho rằng tất cả các chữ in hoa đều thuộc nhóm A và tất cả các chữ cái viết thường đều thuộc nhóm B và bạn đã chọn rằng ánh xạ một-một của bạn cho các chữ cái này là từ chữ này sang chữ khác, thì đây là một số đầu vào / đầu ra mẫu:

Chương trình A:

Input    Output
A        A
D        D
a        A
q        Q

Chương trình B:

Input    Output
A        a
D        d
a        a
q        q

Các quy tắc khác:

  • Hai chương trình không cần phải ở cùng một ngôn ngữ.
  • Chúng không cần phải là cả hai chương trình hoặc cả hai chức năng; một cái có thể là một chương trình, cái kia là một chức năng, điều đó là tốt.
  • Họ không cần phải làm việc theo cùng một cách, có độ dài tương tự, bất cứ điều gì tương tự; họ chỉ đơn giản là phải đáp ứng các quy tắc khác ở trên.
  • Có, chỉ một trong số các chương trình của bạn có thể sử dụng dòng mới và chỉ một chương trình có thể sử dụng khoảng trắng (điều này có thể giống nhau hoặc chương trình khác).
  • Bạn không cần sử dụng tất cả 48 ký tự trong mỗi chương trình.

Sơ hở tiêu chuẩn bị cấm, như bình thường. Tất cả các chương trình phải được khép kín, không có tệp nào chứa ánh xạ bạn chọn.

Tiêu chí chấm điểm: . Cụ thể, tổng số byte của văn bản của hai chương trình.

Xin vui lòng gửi câu trả lời của bạn như thế này:

Ngôn ngữ - # byte + Ngôn ngữ - # byte = # byte

Một mô tả rõ ràng về bản đồ của bạn. Nếu nó phức tạp, hãy sử dụng biểu đồ như thế này:

ABCDEFGHIJKLMNOPQRSTUVWXYZ (etc.)
zyxwvutsrpqonmlkjihgfedcba (etc.)

Hoặc, bạn chỉ có thể giải thích nó (48 bản đồ đầu tiên đến 48 bản cuối cùng), theo sau là câu trả lời của bạn như bình thường.


Tôi sẽ thử sử dụng cùng một ngôn ngữ cho cả hai. :)
mbomb007

Tôi thành thật nghĩ rằng bạn nên thay đổi các quy tắc, hạn chế nó thành "cả hai chương trình phải cùng một ngôn ngữ." Nếu không, nó có thể là CÁCH quá dễ dàng / rộng.
mbomb007

Tôi thực sự tự hỏi nếu điều này là có thể trong Brainfuck tự sửa đổi. Bạn chỉ cần có một chương trình sử dụng +>, chương trình kia sử dụng -<. Sau đó, bạn phải cố gắng tạo các toán tử bị thiếu, chẳng hạn như một ,hoặc .trong chương trình không thể sử dụng chúng.
mbomb007

1
@Ruslan Hãy thử sử dụng SQL. Nó không phân biệt chữ hoa chữ thường và sử dụng từ khóa (bắt đầu và kết thúc) cho các khối mã. Nếu bạn sử dụng SQL Server 2014, bạn có thể sử dụng Chèn hàng loạt DBCC cho một chương trình và quy trình cho chương trình kia. Trong phần đầu tiên, bạn có thể tránh sử dụng dấu ngoặc đơn. Sau đó sử dụng một trường hợp chọn khi tuyên bố cho cả hai chương trình. Ngoài ra, tôi tin rằng Java có thể sử dụng thủ thuật \ u cho một chương trình thay thế mọi ký tự bằng các giá trị unicode và sử dụng hàm cho cái khác không sử dụng chữ u, dấu gạch chéo ngược hoặc số.
đánh dấu

4
Khó nhất. Thử thách. Không bao giờ.
Hố đen

Câu trả lời:


6

CJam - 11 byte + CJam - 25 byte = 36 byte

Các ký tự được chọn trong các nhóm 16 xen kẽ:

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

Thật tuyệt khi một vài ánh xạ có thể thu được bằng phím shift :)

Chương trình A:

lL,H-f&'o+c

Dùng thử trực tuyến

Chương trình B:

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

Dùng thử trực tuyến

Giải trình:

Chương trình 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

Chương trình 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

Tốt đẹp! Vui mừng khi thấy rằng "chẵn / lẻ" không phải là câu trả lời duy nhất.
durron597

Vẫn là 1 bit để chuyển đổi ... Kích thước ấn tượng! Chương trình thứ 2 w / đầu vào của 'o' dường như không xuất ra lỗi \ n ... trong chương trình hoặc cjam trực tuyến?
Brian Tuck

@BrianTuck nó tạo ra một dòng mới (không phải bằng chữ \n), thật không dễ nhìn nếu không kiểm tra html. iThay vào đó, bạn có thể nối thêm phần cuối của chương trình để xem mã ASCII (hoặc cicũng xử lý đầu vào dòng mới, vì nó tạo ra một chuỗi dòng mới thay vì một ký tự trong trường hợp đó)
aditsu

Ồ, hoặc bạn / tôi có thể thay đổi _0=để 0=_nó luôn xuất ra một ký tự
aditsu

16

CJam - 46 44 26 11 byte + GolfScript - 142 125 115 93 68 47 40 36 byte = 47 byte

Cảm ơn Peter Taylor đã chơi golf 6 byte khỏi chương trình GolfScript (và mở đường cho nhiều thứ khác.)

Cảm ơn Dennis vì đã chơi golf 15 byte khỏi chương trình CJam và 4 byte khỏi chương trình GolfScript.

Nhóm A: tất cả các ký tự có mã ký tự chẵn.
Nhóm B: tất cả các ký tự có mã ký tự lẻ, cộng với dòng mới.

Tôi đang sử dụng ánh xạ rõ ràng giữa hai, tức là ghép các ký tự chỉ khác nhau ở bit ít quan trọng nhất, cũng như ~\n. Đây là bản đồ hoàn chỉnh (các cột):

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

Chương trình A (CJam, kiểm tra nó ở đây ):

lX~f&"~"|X<

Chương trình B (GolfScript, kiểm tra nó ở đây ):

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

Giải trình

Chương trình A

(Đã lỗi thời, sẽ cập nhật vào ngày mai.)

Chương trình này sẽ biến mã ký tự lẻ thành số chẵn, tức là đặt bit có ý nghĩa nhỏ nhất thành 0. Cách rõ ràng để làm điều này là bitwise AND với 126 (hoặc 254, v.v.), nhưng ngắn hơn để đặt nó thành 1 (thông qua bit HOẶC với 1) thay vào đó và sau đó giảm kết quả. Cuối cùng, chúng ta cần sửa các dòng mới bằng tay:

"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.

Chương trình B

(Đã lỗi thời, sẽ cập nhật vào ngày mai.)

Chương trình này có thể chỉ cần đặt bit có ý nghĩa nhỏ nhất thành 1 thông qua bitwise HOẶC với 1 ngay bây giờ. Nhưng nó phải kiểm tra cả hai \v(mã ký tự 0x0B) và <DEL>(mã ký tự 0xFF) và đặt chúng ~thay thế. Trong GolfScript tôi không có quyền truy cập vào eval, nhưng thay vào đó bạn có thể thêm một chuỗi vào một khối (sau đó trở thành một phần của mã trong khối đó), mà tôi có thể ánh xạ vào đầu vào bằng %:

{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.

Và đối với mã được tạo trong khối:

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 byte + Java - 1144 byte = 2232 byte

Cảm ơn @ durron597 vì đã giúp chơi golf 1090 byte từ chương trình đầu tiên.

Bằng chứng là có thể thực hiện bằng một ngôn ngữ (và không phải là esolang tại đó).

Sử dụng thủ thuật unicode để chuyển đổi cái đầu tiên thành tất cả các ký tự unicode. Cái thứ hai sử dụng sự phản chiếu để có quyền truy cập vào System.out để in ra std. ngoài. Nó không thể sử dụng u vì nó đã được sử dụng trong chương trình đầu tiên. Tôi biết điều này có thể được đánh gôn nhiều hơn, nhưng tôi muốn đăng một giải pháp hợp lệ trước tiên.

Các nhóm được ánh xạ khá tùy ý, nhưng về cơ bản, nhóm đầu tiên chỉ yêu cầu u, \ và các chữ số thập lục phân (trong mọi trường hợp).

Nhóm:

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

Chương trình đầu tiên:

\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

Tương đương với

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

Chương trình thứ hai:

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

Hãy thử chúng tại đây: https://ideone.com/Q3gqmQ


Không có nhân vật nào bạn có thể rút ra khỏi chương trình đầu tiên mà không cần phải thoát unicode? Bạn có thể rút ra một số con số không? Điều gì sẽ xảy ra nếu bạn đã làm void x(int z), đó cũng là những nhân vật trong bộ ký tự đầu tiên
durron597

Tôi chắc chắn rằng nó có thể. Tôi có thể đổi tên một số biến và thay thế tất cả các khoảng trắng bằng các dòng hoặc tab mới. Tôi sẽ làm điều đó khi tôi về nhà. Tôi chỉ muốn chứng minh một giải pháp ngôn ngữ duy nhất trước tiên.
đánh dấu

5

ĐÃ SỬA! Pyth - 23 byte + Pyth - 30 byte = 53 byte

Rất tiếc, đã sửa lỗi --- hãy kiên nhẫn

cùng phân chia ASCII như của Martin:

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

Prog # 1: Kiểm tra trực tuyến

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

Prog # 2: Kiểm tra trực tuyến

C?%KCwy1K?qy5Ky5?qy+1y31Ky5+1K
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.