Заменить числа их соответствующими буквами


23

Создайте функцию или программу, которая принимает число в качестве входных данных и выводит строку, в которой точки ASCII-кода для алфавита нижнего и верхнего регистров заменяются их символьными эквивалентами.

  • В верхнем регистре алфавита используются кодовые точки: 65-90
  • Строчный алфавит использует кодовые точки: 97-122

Если какие-либо соседние цифры на входе равны кодовой точке буквы, то эта буква должна заменить цифры в выходной строке.

Правила:

  • На входе будет положительное целое число от 1 до 99 цифр
  • Вы можете предположить, что дан только верный ввод
  • Вы начинаете замену в начале целого числа ( 976-> a6, не 9L)
  • Ввод может быть в любом подходящем формате (строковое представление в порядке)
  • Вывод может быть в любом подходящем формате
  • Применяются стандартные правила

Примеры:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

Самый короткий код в байтах побеждает!


Leaderboard

Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

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

## Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

## Ruby, <s>104</s> <s>101</s> 96 bytes


2
«Входные данные будут представлять собой положительное целое число от 1 до 99 цифр». Почти на любом языке программирования, который я знаю, это будет строка с 1 до 99 цифрами, поскольку даже 64-разрядное целое число содержит только 19 десятичных знаков. цифры ...
TJ Crowder

3
@TJCrowder Я предполагаю, что он имел в виду целое число в математическом смысле, а не тип данных.
Деннис

1
@TJCrowder верная точка :-) Хотя, если я не ошибаюсь, 1e99 технически все еще целое число. long intне достаточно, вам нужно super long int.
Стьюи Гриффин

1
@StewieGriffin: Ха! :-) Я уверен, что где-то есть язык с такой вещью.
TJ Crowder

Ответы:


2

Джольф, 18 16 байтов

Попробуй это здесь! Я знал, что функция upperLower будет полезна когда-нибудь! Замените óна ΢или просто используйте ссылку переводчика. Это закодировано в ISO 8859-7.

ρiLaΜGpwpuEdóH΅A
      pw           upper and lower
        pu         of the uppercase alphabet
     G    E        split by nothing (E = "")
    Μ      dóH     map each char to its numeric counterpart
  La               regex alternate array (e.g. La[1,2,3] => "1|2|3")
ρi            ΅A   replace input with the character code of the match (΅ is string lambda)

17

Perl, 39 38 байт

(1 байт добавлен для -pфлага.)

$"="|";s/@{[65..90,97..122]}/chr$&/ge
s/                           /          replace...
  @{[                      ]}           this string, treated as a regex:
     join"|",65..90,97..122             65|66|67|68|...|121|122
                                   /ge  ...with this string, eval()'d:
                                 $&     the entirety of the last match
                              chr       convert to char from ASCII code

Правильный инструмент для работы ™.

Объяснение устарело после одной небольшой оптимизации (спасибо dev-null !), Которая делает его на один байт короче (но немного менее элегантным): $"переменная представляет, что нужно joinпри интерполяции массива в строку, поэтому установка $"="|"удаляет необходимость join,

Демо-версия:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf

Я думаю, вы можете сохранить один байт, установив $"="|"вместо объединения?
andlrc

например. $"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc

@ dev-null Это работает, спасибо!
Ручка двери

11

Javascript, 80 байт

s=>s.replace(/6[5-9]|[78]\d|9[0789]|1[01]\d|12[012]/g,x=>String.fromCharCode(x))

Смотрите regex в действии здесь: https://regex101.com/r/iX8bJ2/1

Просто ради любопытства я узнал здесь одну вещь:

Я не могу изменить , x=>String.fromCharCode(x)чтобы String.fromCharCode из - за ...


6

CJam, 22 байта

q{+'[,_el^{_is@\/*}/}*

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

Задний план

Простая замена всех вхождений групп цифр на соответствующие буквы (в любом порядке, который мы можем выбрать) не будет соответствовать правилу слева направо.

Вместо этого мы можем сгенерировать все префиксы входной строки и попытаться сделать все возможные замены во время их генерации. Поскольку ни одна кодовая точка не содержится в другой кодовой точке, порядок этих попыток не важен.

Например:

67466

6     -> 6
67    -> C
 C4   -> C4
 C46  -> C46
 C467 -> C4B

C4B

Как это работает

q                       Read all input from STDIN.
 {                  }*  Fold; push the first character, and for each subsequent
                        character, push it and do the following:
  +                       Append the character to the string on the stack.
   '[,_el^                Push the string of all ASCII letters.
                          See: http://codegolf.stackexchange.com/a/54348
          {       }/      For each ASCII letter:
           _                Push a copy of the letter.
            i               Convert to integer, i.e., compute its code point.
             s              Cast to string.
              @\            Rotate and swap.
                /           Split the modified input characters at occurrences (at
                            most one) of the string repr. of the code point.
                 *          Join, separating by the corresponding letter.

4

PHP, 110 102 101 68 67 байт

Довольно сложная задача. Это лучшее, что я мог придумать. Это совершенно новая версия.

for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);

Запустите так:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • Сохранено 8 байт с использованием ctype_alphaвместо preg_matchthx в manatwork
  • Сохранение 1 байта путем добавления 0к строке вместо проверки непустой строки: когда последний символ ввода равен 0, подстрока, которую я беру, будет иметь значение «0», что неверно, тогда как «00» верно, поэтому он не пропустит печать последних 0.
  • Сохраненные массивные 33 байта, используя strtrпосле создания массива с парами преобразования
  • Сохраненный байт с помощью короткого тега печати

1
Yo придется изменить регулярное выражение на, так #[A-Z]#iкак текущее позволит с радостью преобразовать «92» в «\». Или попробуйте ctype_alpha()вместо preg_match(). Пока что похоже на работу.
manatwork

"0", which is falsy, whereas "00" is truthyХорошо, PHP.
кот

3

Python 3, 211 189 188 байт

def f(c,i=0,n=""):
 while i<len(c):a=1;x=int(c[i:i+2]);a=2 if 64<x<91 or 96<x<100 else a;x=int(c[i:i+3]) if a<2 else x;a=3 if 99<x<123 else a;x=chr(x) if a>1 else c[i];n+=x;i+=a
 return n
  • Сохранено 23 байта путем замены \ n на; благодаря Деннису

Тест

введите описание изображения здесь


1
Если вы используете ;вместо разрывов строки, вы можете поместить весь цикл while в одну строку. Также первая строка может стать def f(c,i=0,n=""):.
Деннис

1
a=1;a=2 if 64<x<91 or 96<x<100 else a-> и a=1+(64<x<91or 96<x<100)т. д.
seequ

2

Pyth, 20 18 байтов

.Uu:G`CHHsrBG1+bZz

Тот же алгоритм, что и у @Dennis. Кодировать в Pyth на моем телефоне намного проще, чем в Jelly.

                implicit: z=input
.U              Reduce the following lambda b, Z over z
                b is the string being built; z is the next char
   u                Reduce the following lambda G,H over +bZ
                    G is the string, H is the next letter to match
     :                  Replace
       G                in G
       ` C H            the char code of H
       H                with H
     s rB            where H takes on values:
          G              the lowercase alphabet (that's the global value of G)
          1              concatenated to its uppercased self.
     +          
       b
       Z
   z

Спасибо @isaacg

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


Вы просто не можете оставаться вне этого сайта на вашем телефоне, не так ли ...?
Конор О'Брайен

1
Особенно, когда у меня есть роскошь кодирования во всех печатных ASCII: D
lirtosiast

1
Это правда, наверное, приятно отдохнуть от всего этого желе ... Знаешь, сбалансированная диета;)
Конор О'Брайен

0

05AB1E , 12 байтов

õsvy«žnvyÇy:

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

õ             # Push an empty string ""
 sv           # Swap to get the (implicit) input-string, and loop over its characters:
   y«         #  Append the current character to the string
     žn       #  Push builtin "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
       v      #  Inner loop over each of these letters:
           :  #   Replace in the string all occurrences (should be either 0 or 1 occurrence)
        yÇ    #   of the ordinal value of the current letter
          y   #   by this letter
              # (after the loops, implicitly output the top of the stack as result)

Альтернатива 12 байтов с использованием сокращения:

Å»«žnvyÇy:]θ

Попробуйте онлайн или проверьте все тестовые случаи или посмотрите пошаговое сокращение только с первыми 10 байтами .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.