Преобразование чисел в буквы и наоборот в строке

12

Основываясь на списке чисел и их эквивалентных букв, возьмите строковый ввод, замените символы этой строки эквивалентным числом / буквой и выведите результат.

Список

  • 1 = а
  • 2 = б
  • 3 = с
  • 4 = д
  • 5 = е
  • 6 = f
  • 7 = г
  • 8 = ч
  • 9 = я
  • 0 = j

вход

thisisastring1124

Выход

t89s9s1str9n7aabd

правила

  • Числа эквивалентны только строчным буквам.
  • Любой символ вне списка будет оставлен как есть.
  • Входная строка не должна содержать пробелов.
  • Допускается либо полная программа, либо функция.
  • Так как это код-гольф, побеждает меньше байтов.
Нуар Антарес
источник
2
Добро пожаловать в PPCG. Отличный вызов!
Адам
2
Можем ли мы вместо этого поменять заглавные буквы?
Адам
Только строчные буквы, заглавные буквы будут выходить за рамки списка.
Нуар Антарес
Будет ли ввод содержать только буквы и цифры, или в нем могут быть другие непробельные символы (например, знаки пунктуации)?
sundar - Восстановить Монику
Входная строка может содержать любой другой символ, кроме пробелов, но все, что находится за пределами списка, останется нетронутым в выходной строке.
Нуар Антарес

Ответы:

14

Баш, 18 байт

tr 1-90a-j a-j1-90

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

Дверная ручка
источник
Как это принять вход / дать выход? стандартный и стандартный?
Фонд Моника иск
@NicHartley Да.
Ручка двери
6

Perl 6 , 45 23 байта

tr/1..90a..j/a..j1..90/

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

Просто регулярное выражение транслитерации.

Джо Кинг
источник
1
Использование TR здесь будет короче, также вам не нужно разделять все эти части последовательности: TR/1..90a..j/a..j1..90/ tio.run/##K0gtyjH7n1upoJamYKvwvzokSN9QT8/SIFFPL0sfRIB5@rX/…
Фил Х
@PhilH Ха, я буквально просто искал этого оператора! Благодарность!
Джо Кинг
5

Сетчатка 0.8.2 , 12 байт

T`a-j09-1`Ro

Попробуйте онлайн! Объяснение:

T``

Выполните транслитерацию.

a-j09-1

Список источник письма a-j, затем 0, затем цифры 9-1.

Ro

Список адресатов список источников обратное, т.е. цифры 1-9, а затем 0, затем буквы j-a.

Нил
источник
3

R , 40 байт

function(s)chartr("0-9ja-i","ja-i0-9",s)

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

Удивительно, но R пристойно в этом виде вызова, поскольку он имеет tr-like функцию как в ответе Баш . Не знаю, почему он существует, но я благодарен за это!

Giuseppe
источник
Удивительный! Не знал, что chartr () понимал регулярные выражения.
snoram
@snoram не совсем регулярное выражение; в документации указывается, что «Диапазоны поддерживаются в спецификациях, а классы символов и повторяющиеся символы - нет».
Джузеппе
3

MS-SQL, 71 байт

SELECT TRANSLATE(v,'1234567890abcdefghij','abcdefghij1234567890')FROM t

Новая функция SQL 2017 TRANSLATEвыполняет замену отдельных символов, поэтому идеально подходит для этой цели. Смотрите мой аналогичный ответ в предыдущем вызове .

Ввод осуществляется с уже существующей таблицей т с колонками VARCHAR V , в соответствии с нашими правилами ввода - вывода . Чтобы заменить только строчные буквы, таблица должна быть создана с использованием сортировки с учетом регистра :

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)
BradC
источник
2

Pyth , 13 байт

Xz+jk+0_S9<GT

Попробуй это здесь!

объяснение

Xz+jk+0_S9<GT – Full program.
       _S9    – Yield [9, 8, 7, ..., 1]
     +0       – Prepend a 0.
   jk         – Join to a single string.
  +       <GT – And append the first 10 letters of the alphabet to it.
                Yields 0987654321abcdefghij.
Xz            – Transliterates the input from the above to the above reversed.
Мистер Xcoder
источник
1

REXX, 57 байт

#=1234567890
a='abcdefghij'
say translate(arg(1),a #,# a)
idrougge
источник
1

C (gcc) , 81 72 байта

Спасибо Джакомо Гарабелло за предложения.

f(char*s){for(;*s++=*s-97U<11?(*s-6)%10+48:*s-48U<11?(*s-9)%10+97:*s;);}

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

ErikF
источник
Вы можете удалить 6 символов, изменив входную строку вместо распечатки putchar(...)-> *s=...и другие 4, заменив *s-48U<11на *s<59 Попробовать онлайн!
Джакомо Гарабелло
@GiacomoGarabello *s<59прерывается, если $во входных данных присутствуют такие символы, как я. *s-48U([0..47] становится [-48 ..- 1], что становится большим значением без знака.) Поскольку в вопросе не указано, не - Алюминий был действительным, я пошел с более консервативной интерпретацией.
ErikF
Справедливо. ФП недавно прокомментировал, что любой другой символ действителен, но не пробел. Но вы все еще можете использовать мое первое предложение
Джакомо Гарабелло
1

Powershell, 94 байта

-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})

Тестовый скрипт:

$f = {
-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})
}

&$f "thisisastring1124"

объяснение

  • $args - аргументные строки
  • $args|% t*y- расширяется до |ForEach-Object -Method ToCharArrayэквивалента"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)- найти символ в строке, возвращает позицию или -1, если не найден. Пусть $ s хранит строку, которая содержит парный символ в соседних позициях, которые отличаются последним битом: 0 + 1, 2 + 3, 4 + 5 ....
  • if(1+($p=...)) - если позиция была найдена
  • $p-bxor1 - бит положения xor 1
Mazzy
источник
Хороший трюк с -bxor1.
AdmBorkBork
0

R , 107 байт

function(s){a=utf8ToInt(s);l=a>96&a<107;n=a>47&a<58;a[n]=(a[n]-9)%%10+97;a[l]=(a[l]+4)%%10+48;intToUtf8(a)}

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

Первая попытка, безусловно, улучшенная ...

digEmAll
источник
chartrЯ думаю, твой друг здесь.
Джузеппе
2
tio.run/##FYgxCsAgDAD3PiOLBhS0dOnQx0jBGgcLSXx/… вот так
Джузеппе
1
@ Джузеппе: потрясающе! Я не знал о функции чартра. Пожалуйста,
опубликуйте
0

К4 , 38 байт

Решение:

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'

Объяснение:

Поиск каждого символа в списке, "abcdefghij1234567890"а затем индексировать в список, "1234567890abcdefghijX"где Xнаходится оригинальный символ.

Нужно найти более короткий способ построения струн ...

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'
{                                  }@' / apply (@) lambda {} to each (')
                                 ?x    / lookup x in
         (                      )      / do this together
                          .Q`a`n       / index into .Q with a (gives a-z) and n (gives 0-9)
                   10 11#'             / take 10 from first list and 11 from second list
              0 1_'                    / drop 0 from first list and 1 from second list
            a:                         / save as a
          ,/                           / flatten
 (      )                              / do this together
     x,a                               / prepend x to a
    |                                  / reverse it
  ,/                                   / flatten

Бонус:

Другое решение для 38 байтов :

{(a,b,x)?[(b:1_11#.Q.n),a:10#.Q.a]x}@'
streetster
источник
0

Ябасич , 135 байт

Принимает ввод с консоли и выводит на консоль.

Input""s$
For i=1To Len(s$)
c$=Mid$(s$,i,1)
n=asc(c$)-96
If-38>n Then?chr$(143+n+11^(n=-48));ElsIf n<11Then?n*(10>n),"";Else?c$;Fi
Next

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

Тейлор Скотт
источник
0

sed, 44 байта

y/1234567890abcdefghij/abcdefghij1234567890/

Немного скучно, я признаю.

Тестирование:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
Kusalananda
источник