Замініть номери відповідною буквою


23

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

  • У верхньому регістрі алфавіту використовуються кодові точки: 65-90
  • Нижній алфавіт використовує кодові точки: 97-122

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

Правила:

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

Приклади:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

Найкоротший код виграти в байтах!


Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## 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

Правильний інструмент для Job ™.

Пояснення застаріло після однієї невеликої оптимізації (спасибі 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))

Дивіться регекс у дії тут: 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_match, thx для управління
  • Збережено 1 байт, попередньо додавши 0до рядка замість перевірки непорожнього рядка: коли останнім символом введення є 0, підряд, який я беру, буде "0", що є помилковим, тоді як "00" - неправдивий, тому не буде пропускати друк останніх 0.
  • Збережено масивні 33 байти за допомогою використання strtrпісля побудови масиву з парами перетворення
  • Збережено байт за допомогою тегу короткого друку

1
Йо доведеться змінити регулярний вираз, #[A-Z]#iоскільки поточний з радістю дозволить "92" перетворитися на "\". Або спробуйте ctype_alpha()замість preg_match(). Поки, здається, працює.
манатура

"0", which is falsy, whereas "00" is truthyДобре, PHP.
кіт

3

Пітон 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

Спробуйте тут .


Ви просто не можете залишитись на цьому веб-сайті на своєму телефоні, ви можете ...?
Conor O'Brien

1
Особливо, коли у мене розкіш кодування у всіх друкованих ASCII: D
ліртосія

1
Це правда, напевно, приємно відпочити від усього цього желе ... Ви знаєте, збалансоване харчування;)
Conor O'Brien

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.