Codegolf - Двунаправленный Переводчик

  • Автор темы Edelveis1
  • Обновлено
  • 22, Oct 2024
  • #1

Двунаправленный переводчик

Задача состоит в том, чтобы создать переводчика, который сможет перевести

 
 [a-zA-Z ] 
string into another string according to the mappings below. The translator should also be able to translate translated text back into its normal form (hence двунаправленный). Регистр не обязательно поддерживать, и в выводе он может быть как строчным, так и прописным (или как строчным, так и прописным), однако ваша программа должна иметь возможность обрабатывать строки как в нижнем, так и в верхнем регистре.

Вот спецификация отображений для этой задачи:

> ABS < AB9 or ab9 or Ab9 or aB9 > foo < 1oo or 1OO or ... > FIZZ BUZZ > 1i{N}{N} bu{N}{N} or 1I{N}{N} BU{N}{N} or ... > {n}[:) < ztn or ZTN or ... > bar < bar or BAR or ...

Вот несколько примеров входов/выходов:()

------------------- |Letter | Mapping | ------------------- | S | 9 | | F | 1 | | H | 5 | | X | = | | Z | {N} | | M | --* | | N | :) | | G | ] | | T | [ | -------------------

«или… или…», очевидно, не должно быть в вашем фактическом выводе, это просто демонстрация возможных результатов. [a-zA-Z ] or a "translated" string containing the mapped symbol, other symbols or characters outside wouldn't be inputted.

Входы всегда будут в

Edelveis1


Рег
28 Jun, 2011

Тем
75

Постов
194

Баллов
579
  • 26, Oct 2024
  • #2

Ретина 0.8.2, 70 68 57 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 void f(char*i,char*o,int*a,int*e,char**c){int t=0;int s=0;char*p=0;while(i[0]){char x=e[(uint8_t)i[0]];if(x){int l;s=a[(s*23)+x-1];if((l=a[((s+1)*23)-1]))t=l;if(!p)p=i;if(s){i++;continue;}}s=0;if(t){if(t>9)o+=sprintf(o,c[t-10]);else o+=sprintf(o,c[t+8]);t=0;p=0;continue;}if(p){while(p<i){o[0]=p[0];o++;p++;}p=0;}o[0]=i[0];o++;i++;}}
 

Попробуйте онлайн! Ссылка включает тестовые примеры. Результат записывается в верхний регистр. Объяснение:

from re import* def f(s,m="9 1 5 = --* :\) ] \[ {N}".split()): for t,r in zip(*(m,"SFHXMNGTZ")[::2*bool(search(f"({'|'.join(m)})",s,I))-1]):s=sub(t,r,s,0,I) return sub(r'\\','',s)

Удалите суффиксы из import Data.Char k="S 9 F 1 H 5 X = Z {N} M --* N :) G ] T [ " v=words$k++map toLower k w=v++reverse v _!""="" []!(t:u)=t:w!u (a:b:c)!s|n<-length a,take n s==a=b++w!drop n s|1<2=c!s (w!) , .upper() и [::True or-1] leaving their first character.

for

Все с большой буквы.

if

Переведите первые символы. Строка отображается в свою обратную сторону, так что s=input().upper() b=[*'915=][',':)','--*','{N}'] for k,v in zip(*['SFHXGTNMZ',b][::0>max(map(s.find,b))or-1]):s=s.replace(k,v) print(s) maps to :) и т. д. и наоборот. $_=uc;s/.[}*]|://g;y/-{)SFHXGT915=][ZNM/MZN915=][SFHXGT{:-/;s/{/{N}/g;s/:/:)/g;s/-/--*/g is a special character and needs to be quoted. The -p обычно является специальным символом, но размещение его в начале позволяет избежать этого.

ABCDEIJKLOPQRUVWY

Развернуть A[] , /[{-]..|:?./g [{-].. // either "{" or "-" followed by 2 other characters // -> to match "{N}" or "--*" :?. // or any character, preceded by an optional ":" // -> to match ":)" or any single character и [a-zA-Z] to the full strings again.

 

Tarapashka


Рег
23 Jun, 2011

Тем
71

Постов
198

Баллов
563
  • 26, Oct 2024
  • #3

05AB1E, 65 63 байта

s=>s.toUpperCase(A=[':)',...'NF1G]H5S9T[X=Z','{N}','M','--*']).replace(/[{-]..|:?./g,c=>A[A.indexOf(c)^1]||c)

Использует тот же подход, что и Ответ Нила. Вероятно, я не буду слишком конкурентоспособен среди ответов на вопросы по гольфу, но здесь определенно есть улучшения (я все еще новичок в 05AB1E, особенно в манипуляциях со струнами).

Объяснение:

u uppercase the input "{N}" push '{N}' ¬ extract and push head ('{') .: replace all {N} => { "--*" push '--*' ¬ extract and push head ('-') .: replace all --* => - ":)" push ':)' ¬ extract and push head (':') .: replace all :) => : "SFH...519" push lookup string  bifurcate (push a, reversed(a)) ‡ transliterate input with lookup set up stack for reverse process to do { -> {N} ... etc "{-:N-)}*" push literal string 3ι uninterleave by 3 D duplicate € apply single function map н extract first element s swap ‡ transliterate

Двунаправленный бит достигается путем транслитерации с помощью раздвоенной строки поиска; каждый символ, который следует поменять местами, находится в позиции, противоположной той, на которую он должен быть заменен в строке поиска. Основная проблема (и потенциальная экономия) заключается в том, что я повторяю много логики для части "{N}" -> "{"... в начале, как и в части "{" -> "N"... в конце. Первоначально я думал, что транслитерация может работать в обе стороны, поэтому я собирался с самого начала тщательно настроить стек, но я не думаю, что транслитерации нравится, когда в списке есть многосимвольная строка (вероятно, она идет по символам, вместо того, чтобы заменять все?).

 

Samsungfn


Рег
05 Oct, 2007

Тем
73

Постов
183

Баллов
588
  • 26, Oct 2024
  • #4

JavaScript (ES6), 118 113 109 байт

u"{N}"¬.:"--*"¬.:":)"¬.:"SFHXZMNGT[]:-{=519"‡"{-:N-)}*"3ιD€нs‡

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

Как?

Поскольку входные данные гарантированно будут содержать исключительно : and/or the special patterns, we can use the following minimal regular expression to match them all:

-

Работая с версией ввода в верхнем регистре, мы ищем позицию каждого совпавшего шаблона в массиве поиска. { and replace it with its counterpart, or leave it unchanged if it is not found (which may only happen for { {N} - --* : :) ).

 

Nemohomo


Рег
25 Feb, 2014

Тем
64

Постов
192

Баллов
582
  • 26, Oct 2024
  • #6

Питон 3, 189 147 127 135 байт

-

Попробуйте онлайн! Если бы это был не кодгольф T`-{=519[]:NGTSF\HXZM`Ro should obviously be outside of the T`l`L . Чего бы мы только не сделали ради нескольких байтов...

  • сэкономил 42 байта, заменив dict двумя списками;
  • сэкономил 20 байт благодаря ovs'у :) dark magic.
  • добавлено 8 байт из-за отсутствия --*
 

DimitreriaLib84


Рег
20 Jan, 2006

Тем
101

Постов
212

Баллов
777
  • 26, Oct 2024
  • #8

Питон 3, 226 189 181 байт

Сэкономлено колоссальные 37 байт благодаря овс!!!
Сэкономлено 6 байт благодаря Стеф!!!

.[}*]|\)

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

Отмените перевод, если какое-либо из сопоставлений присутствует во входных данных.

 

Ralkkkfdfd


Рег
06 Jan, 2007

Тем
77

Постов
184

Баллов
579
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно