Разделение ASCII

33

Учитывая 95 печатных символов в ASCII плюс символ новой строки, разбейте его на две равные, 48 групп символов (далее называемые группой A и группой B). Создайте взаимно-однозначное сопоставление по вашему выбору (на ваше усмотрение) между двумя группами. Другими словами, Aможет отображаться aи наоборот, но Aможет также отображаться >и наоборот, если это то, что вам нужно для вашей программы.

Разобрав ASCII на две группы, напишите две программы и / или функции, используя только символы в каждой группе соответственно. Другими словами, напишите одну программу / функцию, которая использует только символы в группе A, и другую программу / функцию, которая использует только символы в группе B.

Эти программы должны быть в состоянии получить один символ в качестве ввода. Программа, написанная с символами в группе A, должна выводить / возвращать один и тот же символ, если ввод был символом группы A, и отображенный символ группы A, если он получил символ группы B; Программа группы А должна всегда выводить символ группы А. Точно так же программа группы B должна выводить один и тот же символ, если это символ группы B, и отображенный символ группы B, если ввод является символом группы A.

Это может быть не так ясно, так что вот пример. Если вы предполагаете, что все заглавные буквы находятся в группе A, а все строчные буквы - в группе B, и вы выбрали однозначное сопоставление этих букв от одного к другому, то: Пример ввода / вывода:

Программа А:

Input    Output
A        A
D        D
a        A
q        Q

Программа Б:

Input    Output
A        a
D        d
a        a
q        q

Другие правила:

  • Две программы не обязательно должны быть на одном языке.
  • Они не должны быть обеими программами или обеими функциями; один может быть программой, другой функцией, это нормально.
  • Им не нужно работать одинаково, иметь одинаковую длину и все такое; они просто должны соответствовать другим правилам выше.
  • Да, только одна из ваших программ может использовать символы новой строки, и только одна может использовать пробелы (это может быть та же самая или другая программа).
  • Вам не нужно использовать все 48 символов в каждой программе.

Стандартные лазейки запрещены, как обычно.Все программы должны быть автономными, без файлов, которые вы выбрали.

Критерии оценки: . В частности, сумма байтов текста двух программ.

Пожалуйста, оставьте свой ответ следующим образом:

Язык - # байт + Язык - # байт = # байт

Однозначное описание вашего отображения. Если это сложно, используйте диаграмму следующим образом:

ABCDEFGHIJKLMNOPQRSTUVWXYZ (etc.)
zyxwvutsrpqonmlkjihgfedcba (etc.)

Или вы можете просто объяснить это (сначала 48 карт, затем последние 48 в последовательности), а затем ваш ответ как обычно.

durron597
источник
Я собираюсь попробовать использовать один и тот же язык для обоих. :)
mbomb007
Честно говоря, я думаю, что вы должны изменить правила, ограничив их «обе программы должны быть на одном языке». В противном случае это, вероятно, слишком легко / широко.
mbomb007
Мне действительно интересно, возможно ли это в самоизменяющемся Brainfuck. Вам просто нужно, чтобы одна программа использовала +и >, а другая - -и <. Затем вы должны попытаться сгенерировать недостающие операторы, такие как ,или .в программе, которые не могут их использовать.
mbomb007
1
@Ruslan Попробуйте использовать SQL. Он не учитывает регистр и использует ключевые слова (начало и конец) для блоков кода. Если вы используете SQL Server 2014, вы можете использовать DBCC Bulk Insert для одной программы и процедуру для другой. В первом вы можете избежать использования скобок. Затем используйте случай выбора, когда оператор для обеих программ. Кроме того, я полагаю, что в Java это возможно, используя трюк \ u для программы, заменяющей каждый символ значениями Юникода, и используя функцию для другого, который не использует букву u, обратную косую черту или цифры.
закладки
4
Сильнее. Вызов. Когда-либо.
Blackhole

Ответы:

6

CJam - 11 байтов + CJam - 25 байтов = 36 байтов

Персонажи выбираются в чередующихся группах по 16 человек:

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

Круто, что несколько отображений можно получить с помощью клавиши Shift :)

Программа А:

lL,H-f&'o+c

Попробуйте онлайн

Программа Б:

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

Попробуйте онлайн

Объяснение:

Программа А:

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

Программа Б:

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
aditsu
источник
Ницца! Рад видеть, что «четный / нечетный» не единственный ответ.
durron597
Еще 1 бит переключения ... Впечатляющие размеры! Вторая программа с вводом 'o', похоже, не выводит ошибку \ n ... в программе или онлайн-cjam?
Брайан Так
@BrianTuck выводит новую строку (не буквальную \n), это просто не легко увидеть без проверки HTML. Вы можете добавить iв конце программы, чтобы вместо этого увидеть код ASCII (или ciтакже иметь дело с вводом новой строки, так как в этом случае он выводит строку новой строки, а не символ)
aditsu
О, или вы / я могли бы изменить _0=на 0=_так, чтобы он всегда
выводил
16

CJam - 46 44 26 11 байт + GolfScript - 142 125 115 93 68 47 40 36 байт = 47 байт

Спасибо Питеру Тейлору за игру в гольф на 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/{))}%++%

объяснение

Программа А

(Устаревший, обновлю завтра.)

Эта программа должна преобразовывать коды нечетных символов в четные, т. Е. Устанавливать младший значащий бит в 0. Очевидный способ сделать это - побитовое И с 126 (или 254 и т. Д.), Но короче установить его на 1 (через побитовое ИЛИ с 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.

Программа Б

(Устаревший, обновлю завтра.)

Эта программа может просто установить младший значащий бит на 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 за помощь в игре 1090 байт из первой программы.

Доказательство того, что это можно сделать на одном языке (и не только на 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

bmarks
источник
Нет ли символов, которые вы можете извлечь из первой программы, для которой не нужно экранировать юникод? Не могли бы вы вытащить некоторые цифры? Что, если вы это сделаете void x(int z), это тоже персонажи из первого набора символов
durron597
Я уверен, что это возможно. Я мог бы переименовать некоторые переменные и заменить все пробелы на новые строки или табуляции. Я сделаю это, когда вернусь домой. Я просто хотел доказать одно языковое решение в первую очередь.
закладки
5

ИСПРАВЛЕНО! Pyth - 23 байта + Pyth - 30 байтов = 53 байта

упс Исправление ошибки --- пожалуйста, будьте терпеливы

тот же ASCII раскол, что и у Мартина:

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
Брайан Так
источник