ASCII 분할


33

ASCII와 개행 문자로 인쇄 가능한 95 개의 문자가 주어지면 48 개의 문자 그룹 (이하 그룹 A와 그룹 B) 으로 나눕니다 . 두 그룹간에 일대일 매핑 을 선택합니다 (완전한 재량). 즉, A매핑 할 수 a및 반대 반대하지만, A또한에 매핑 할 수 >그건 당신이 프로그램을 위해 필요하다면, 반대 및 부사장.

ASCII를 두 그룹으로 나눈 후에는 각 그룹의 문자 만 사용하여 두 개의 프로그램 및 / 또는 기능을 작성하십시오. 즉, 그룹 A의 문자 만 사용하는 하나의 프로그램 / 기능과 그룹 B의 문자 만 사용하는 다른 프로그램 / 기능을 작성하십시오.

이러한 프로그램은 하나의 문자를 입력으로받을 수 있어야합니다. 그룹 A의 문자로 작성된 프로그램은 입력이 그룹 A 문자 인 경우 동일한 문자를 출력 / 반환하고 그룹 B 문자를 수신 한 경우 맵핑 된 그룹 A 문자를 리턴해야합니다. 그룹 A 프로그램은 항상 그룹 A 문자를 출력해야합니다. 마찬가지로 그룹 B 프로그램은 그룹 B 문자 인 경우 동일한 문자를, 입력이 그룹 A 문자 인 경우 맵핑 된 그룹 B 문자를 출력해야합니다.

명확하지 않을 수 있으므로 여기에 예가 있습니다. 모든 대문자가 그룹 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자를 모두 사용할 필요는 없습니다.

표준 허점은 정상적으로 금지되어 있습니다. 모든 프로그램은 독립적이어야하며 선택한 매핑이 포함 된 파일은 없어야합니다.

스코어링 기준 : . 특히 두 프로그램의 텍스트 바이트의 합계입니다.

다음과 같이 답변을 게시하십시오.

언어-# 바이트 + 언어-# 바이트 = # 바이트

매핑에 대한 명확한 설명. 복잡한 경우 다음과 같은 차트를 사용하십시오.

ABCDEFGHIJKLMNOPQRSTUVWXYZ (etc.)
zyxwvutsrpqonmlkjihgfedcba (etc.)

또는 설명 만하고 (처음 48 개는 마지막 48 개를 순서대로 마지막 48 개로 매핑) 그 다음에는 평상시처럼 대답 할 수 있습니다.


둘 다에 동일한 언어를 사용하려고합니다. :)
mbomb007

솔직히 당신은 규칙을 바꾸어야한다고 생각합니다. "두 프로그램 모두 같은 언어 여야합니다." 그렇지 않으면 아마도 너무 쉬운 / 광범위한 방법 일 것입니다.
mbomb007

나는 이것이 자기 수정 Brainfuck에서 이것이 가능한지 궁금합니다. 당신은 하나 개의 프로그램 사용이 있어야 +하고 >, 다른 사용 -하고 <. 그런 다음 ,또는 연산자를 .사용할 수없는 프로그램 과 같이 누락 된 연산자를 생성 해야합니다.
mbomb007

1
@Ruslan SQL을 사용해보십시오. 대소 문자를 구분하지 않으며 코드 블록에 키워드 (시작 및 끝)를 사용합니다. SQL Server 2014를 사용하는 경우 한 프로그램에는 DBCC 대량 삽입을 사용하고 다른 프로그램에는 DBCC 대량 삽입을 사용할 수 있습니다. 첫 번째에서는 괄호 사용을 피할 수 있습니다. 그런 다음 두 프로그램 모두에 대해 case case를 사용하십시오. 또한 모든 문자를 유니 코드 값으로 바꾸고 문자 u, 백 슬래시 또는 숫자를 사용하지 않는 다른 함수를 사용하는 프로그램에는 \ u 트릭을 사용하여 Java에서 가능하다고 생각합니다.
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 ... 버그를 출력하지 않는 것 같습니다.
Brian Tuck

@BrianTuck은 개행 문자 (리터럴 \n아님)를 출력 하므로 HTML을 검사하지 않고는 쉽게 볼 수 없습니다. 당신은 추가 할 수 있습니다i프로그램의 끝에 a를 하여 ASCII 코드를 대신 볼 (또는 ci문자 대신 개행 문자열을 출력하므로 개행 입력도 처리 할 수 ​​있음)
aditsu

오, 또는 당신은 / 내가 바꿀 수 _0=0=_항상 문자 출력되도록
aditsu

16

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

GolfScript 프로그램에서 6 바이트를 골라 낸 피터 테일러에게 감사드립니다.

CJam 프로그램에서 15 바이트를, GolfScript 프로그램에서 4 바이트를 골프로 한 Dennis에게 감사합니다.

그룹 A : 문자 코드가 짝수 인 모든 문자.
그룹 B : 홀수 문자 코드와 개행 문자가있는 모든 문자

나는 두 가지 사이의 명확한 매핑을 사용하고 있습니다. 즉 가장 중요하지 않은 비트 만 다른 문자 ~와 and를 쌍으로 묶습니다 \n. 다음은 완전한 맵 (열)입니다.

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

프로그램 A (CJam, 여기서 테스트하십시오 ) :

lX~f&"~"|X<

프로그램 B (GolfScript, 여기서 테스트하십시오 ) :

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

설명

프로그램 A

(오래된, 내일 업데이트됩니다.)

이 프로그램은 홀수 문자 코드를 짝수로 바꿔야합니다. 즉, 최하위 비트를 0으로 설정하십시오.이 작업을 수행하는 확실한 방법은 비트 AND이고 126 (또는 254 등)이지만 1 (비트 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

(오래된, 내일 업데이트됩니다.)

이 프로그램은 이제 비트 단위 OR을 통해 최소 유효 비트를 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 바이트

첫 번째 프로그램에서 1090 바이트의 골프를 치는 데 도움을 주신 @ durron597에게 감사드립니다.

한 언어로 할 수 있다는 것을 증명하십시오 (그리고 그 언어에서 비 esolang).

유니 코드 트릭을 사용하여 첫 번째 트릭을 모든 유니 코드 문자로 변환하십시오. 두 번째는 리플렉션을 사용하여 std로 인쇄하기 위해 System.out에 액세스합니다. 아웃. 첫 번째 프로그램에서 사용 되었기 때문에 u를 사용할 수 없습니다. 골프를 더 많이 할 수 있다는 것을 알고 있지만 유효한 솔루션을 먼저 게시하고 싶었습니다.

그룹은 임의로 임의로 매핑되지만 기본적으로 첫 번째 그룹에는 u, \ 및 16 진 숫자 만 필요합니다 (어쨌든).

그룹 :

!#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 에서 사용해보십시오.


유니 코드 이스케이프 할 필요가없는 첫 번째 프로그램에서 빼낼 수있는 문자가 없습니까? 숫자를 뽑을 수 없습니까? 만약 당신이 그랬다면 void x(int z), 이것들은 첫 번째 문자셋의 캐릭터들입니다
durron597

가능하다고 확신합니다. 일부 변수의 이름을 바꾸고 모든 공백을 새 줄이나 탭으로 바꿀 수 있습니다. 집에 도착하면 할게요 방금 단일 언어 솔루션을 증명하고 싶었습니다.
bmarks

5

결정된! Pyth-23 바이트 + Pyth-30 바이트 = 53 바이트

죄송합니다 오류 수정 --- 기다려주십시오

Martin과 동일한 ASCII 분할 :

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

프로그램 # 1 : 온라인 테스트

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

프로그램 # 2 : 온라인 테스트

C?%KCwy1K?qy5Ky5?qy+1y31Ky5+1K
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.