Перетворити числа в літери та навпаки в рядку


12

На основі списку чисел та їх еквівалентних букв візьміть рядок, замініть символи цього рядка на еквівалентне число / букву та виведіть результат.

Список

  • 1 = а
  • 2 = b
  • 3 = c
  • 4 = d
  • 5 = е
  • 6 = f
  • 7 = g
  • 8 = год
  • 9 = i
  • 0 = j

Вхідні дані

thisisastring1124

Вихідні дані

t89s9s1str9n7aabd

Правила

  • Цифри прирівнюються лише до малих літер.
  • Будь-який символ поза списком залишиться таким, як є.
  • Рядок введення не повинен містити пробілів.
  • Дозволена або повна програма, або функція.
  • Оскільки це код-гольф, виграє найменше байтів.

2
Ласкаво просимо до PPCG. Приємний виклик!
Адам

2
Можемо замість цього замінити великі літери?
Адам

Лише малі літери, великі літери будуть поза межами списку.
Нуар Антарес

Чи буде вхід містити лише букви та цифри, чи можуть бути в ньому інші символи без пробілу (наприклад, пунктуація)?
sundar

Рядок введення може містити будь-який інший символ, крім пробілів, але все, що знаходиться поза списком, залишиться недоторканим у вихідному рядку.
Нуар Антарес

Відповіді:






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/…
Phil H

@PhilH Ha, я буквально просто шукав цього оператора! Дякую!
Джо Кінг

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-подібну, як у відповіді Баша . Поняття не маю, чому воно існує, але я за це вдячний!


Дивовижний! Не знав charr () зрозумів регулярний вираз.
снорам

@snoram не зовсім регулярний вираз; він вказує в документації , що «Діапазони підтримуються в специфікаціях, але класи символів і повторювані символи не є.»
Джузеппе

3

MS-SQL, 71 байт

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

Нова функція SQL 2017 TRANSLATEвиконує індивідуальну заміну символів, тому ідеально підходить для цієї мети. Дивіться мою подібну відповідь у попередньому виклику .

Введення здійснюється через попередньо існуючу таблицю t із стовпчиком varchar v , згідно з нашими правилами вводу- виводу . Щоб замінити лише малі літери, таблицю потрібно створити за допомогою порівняння з великим регістром :

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)


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.



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;);}

Спробуйте в Інтернеті!


Ви можете видалити 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

Хороший трюк з -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)}

Спробуйте в Інтернеті!

Перша спроба, безумовно, неймовірна ...


chartrваш друг тут, я думаю.
Джузеппе


1
@Giuseppe: приголомшливо! Я не знав функції графіка. Будь ласка, опублікуйте це як свою відповідь, підхід зовсім інший;)
digEmAll


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}@'



0

sed, 44 байт

y/1234567890abcdefghij/abcdefghij1234567890/

Трохи нудно, визнаю.

Тестування:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.