Розщеплення ASCII


33

З огляду на 95 символів для друку в ASCII плюс новий рядок, розділіть його на дві рівні, 48 символьних груп (надалі називаються групами A і група B). Створіть індивідуальне відображення на свій вибір (ви маєте повний розсуд) між двома групами. Іншими словами, Aможе відображатись a, і навпаки, але Aможе також відображатись> і навпаки, якщо це те, що вам потрібно для вашої програми.

Після розбиття ASCII на дві групи напишіть дві програми та / або функції, використовуючи відповідно лише символи в кожній групі. Іншими словами, запишіть одну програму / функцію, яка використовує лише символи групи A, та іншу програму / функцію, яка використовує лише символи групи B.

Ці програми повинні мати можливість приймати один символ як вхід. Програма, написана з символами групи A, повинна виводити / повертати один і той же символ, якщо вхід був символом групи А, і відображений символ групи А, якщо він отримав символ групи В; програма групи А завжди повинна виводити символ групи А. Аналогічно, програма групи B повинна виводити один і той же символ, якщо це символ групи B, а відображений символ групи 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 послідовно), після чого відповідь як звичайна.


Я спробую використовувати однакову мову для обох. :)
mbomb007

Я чесно думаю, що ви повинні змінити правила, обмеживши їх "обидві програми повинні бути однією мовою". Інакше це, ймовірно, НАЙЧОГО занадто просто / широко.
mbomb007

Я насправді цікавлюсь, чи це можливо в самомодифікуючому Brainfuck. Ви просто повинні мати одну програму за допомогою +і >, а іншу за допомогою -і <. Тоді вам доведеться спробувати згенерувати відсутні оператори, наприклад, ,або .в програмі, які не можуть їх використовувати.
mbomb007

1
@Ruslan Спробуйте використовувати SQL. Він не враховує регістри і використовує ключові слова (початок і кінець) для кодових блоків. Якщо ви використовуєте SQL Server 2014, ви можете використовувати DBCC Bulk Insert для однієї програми, а процедуру - для іншої. У першому ви можете уникнути використання дужок. Потім використовуйте вибірковий випадок, коли заява для обох програм. Крім того, я вважаю, що це можливо в Java, використовуючи трюк \ u для програми, що замінює кожен символ на значення unicode та використовує функцію для іншого, який не використовує літеру u, зворотній косу рису або цифри.
позначки

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 біт перемикання ... Вражаючі розміри! 2-я програма з введенням 'o' не видає \ n ... помилку в програмі чи онлайн-cjam?
Брайан Тук

@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 байт

Дякуємо Пітеру Тейлору за те, що виграли 6 байт від програми GolfScript (і проклали шлях для багатьох інших.)

Завдяки Деннісу за гольф 15 байт від програми CJam та 4 байти від програми GolfScript.

Група А: всі символи з парним кодом символів.
Група 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 байт у першій програмі.

Доказ того, що це можна зробити однією мовою (і не є езолангом на цій).

Використовуйте трюк unicode, щоб перетворити перший на всі символи unicode. Другий використовує відображення для отримання доступу до 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


Немає жодних символів, яких можна витягнути з першої програми, які не потребують уникнення юнікоду? Ви не можете витягнути деякі цифри? Що робити, якщо ви це зробили void x(int z), це теж персонажі в першій
графіці

Я впевнений, що це можливо. Я міг би перейменувати деякі змінні та замінити всі пробіли новими рядками чи вкладками. Я зроблю це, коли повернусь додому. Я просто спершу хотів довести єдине мовне рішення.
позначки

5

ФІКСОВАНО! Pyth - 23 байти + Pyth - 30 байт = 53 байти

oops Помилка виправлення --- будьте терплячі

такий же розкол ASCII, як і у Мартіна:

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

Прог. №1: Тестування в Інтернеті

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

Прог. №2: Тестування в Інтернеті

C?%KCwy1K?qy5Ky5?qy+1y31Ky5+1K
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.