Алфавит в номер и номер в алфавит

26

Вызов

В этом задании вы должны взять число в качестве ввода и вывести соответствующую букву алфавита, и наоборот. (1 <=> A, 2 <=> B) и т. Д.

1 -> A
2 -> B
...
26 -> Z

A -> 1
B -> 2
...
Z -> 26

правила

  • Это , поэтому выигрывает самый короткий код в байтах.
  • Вход будет состоять только из любых заглавной буквы от Aдо Zили целого числа от 1до 26включительно.
  • Конечные пробелы (пробел и перевод строки) разрешены.
Чад
источник
1
Зачем дублировать? Оо Это не равно.
Чад
3
Добро пожаловать в программирование головоломок и Code Golf! Эта проблема может использовать немного уточнения. Например, вы можете указать, какие входные данные нам нужно будет обработать, поскольку есть недопустимые входные данные. Я рекомендую публиковать будущие испытания в Песочнице, где они могут получить содержательную обратную связь, прежде чем они будут размещены на основном сайте.
Утренняя монахиня
1
Будем ли мы получать 26в виде целого числа или "26"в виде строки, или оба разрешены?
Утренняя монахиня
2
Должен ли он быть в верхнем регистре или вместо него допустим строчный?
Мего
1
Серьезно, еще одна проблема с алфавитом? (͡ ° ͜ʖ ͡ °)
shooqie

Ответы:

6

На самом деле 7 байтов

ú' +ûEí

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

Объяснение:

ú' +ûEí
ú' +     lowercase English alphabet, prepend space
    û    uppercase
     E   element (pushes the nth letter if input is an integer, leaves stack alone otherwise)
      í  index (pushes index of input if input is a string, leaves stack alone otherwise)

Если допустимы строчные буквы, это 6 байтов:

ú' +Eí

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

Mego
источник
1
Вы выигрываете в данный момент, я думаю, что никто не мог сделать программу с меньшим количеством 7 байтов.
Чад
1
Я присоединился только, чтобы спросить это. @ Что это за язык?
Сложенный хроматин
2
@FoldedChromatin выглядит как github.com/Mego/Seriously
Альфред Без
1
@FoldedChromatin На самом деле, это так Actually. Отсюда Actually, 7 bytes. : P
Дан
2
Такие моменты делают меня счастливым из-за названий, которые я выбрал для своих языков :)
Mego
12

Чистый Баш, 51

В большинстве остальных ответов используются условные выражения. Этот полностью исключает условные выражения и вместо этого обрабатывает входные данные как число base-36, которое индексируется в правильно сконструированный массив bash-brace-extension:

a=(_ {A..I} {1..26} {J..Z} {A..Z})
echo ${a[36#$1]}

Ideone.

Цифровая травма
источник
9

Эрланг, 26 байт

f([X])->X-64;f(X)->[X+64].

Один из немногих случаев, когда поведение строки Эрланга полезно.

спагетто
источник
7

Python 2, 38 байт

lambda x:x>''and 64^ord(x)or chr(64^x)

Проверьте это на Ideone .

Деннис
источник
7

Python 3, 43 байта

lambda x:x!=str(x)and chr(64|x)or ord(x)^64

Интересно то, что это решение включает в себя все значения ИЛИ, побитового ИЛИ |, логического ИЛИ or, побитового XOR ^и логического XOR !=...

cdlane
источник
6

2sable , 9 8 байт

Код:

.bAu¹kr,

Объяснение:

.b        # Convert 1 -> A, 2 -> B, etc.
  A       # Push the alphabet.
   u      # Convert it to uppercase.
    ¹k    # Find the index of the letter in the alphabet.
      r   # Reverse the stack.
       ,  # Pop and print with a newline.

Использует кодировку CP-1252 . Попробуйте онлайн! ,

Аднан
источник
1
Вы не можете удалить,? Какие байты без,? Вам не нужно печатать новую строку.
Чад
@Chad Нет, это не будет работать для числовых входов :(
Аднан
6

Ruby, 47 39 + nфлаг = 40 байт 33 34 31 байт

Анонимная функция. Использует прием обработки исключений, как в Python-решении @ KarlNapf .

-3 байта от @manatwork

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

->i{(64+i).chr rescue i.ord-64}

Оригинальная полная версия программы с nфлагом на 40 байтов и читает из STDIN:

puts$_!~/\d/?$_.ord-64:(64+$_.to_i).chr
Значение чернил
источник
Я получаю синтаксическую ошибку при попытке запустить на ideone , можете ли вы сказать, как проверить?
Лейбруг
@ Leibrug, ой! Теперь это исправлено
Value Ink
Вы можете уменьшить его больше, бесстыдно применение Карла NAPF трюка «S от его решения Python : ->i{(64+i).chr rescue i.ord-64}.
manatwork
5

Чеддер, 34 32 байта

Сохранено 2 байта благодаря @LeakyNun

n->"%s"%n==n?n.ord()-64:@"(n+64)

Я хотел бы, чтобы был более короткий способ проверить, если строка или номер.

Попробуйте онлайн! или тестовый набор

объяснение

n ->                // func with arg `n`
    "%s"%n==n ?     // if n is string... (see below)
       n.ord() - 64  // return code point - 64
    :               // else...
    @"(n+64)         // chr(n+64)

"%s"%n==nпроверяет, является ли это строка простым способом. "%s"формат строки, я могу отформатировать, %например "a %s c" % "b", равно "a b c". %sуказывает, что это строка, если передана цифра, она останется как %s.

Downgoat
источник
"%s"%n==nсохраняет 2 байта
Leaky Nun
@ LeakyNun о, это умно! Я пытался сделать, "%d"%n==nно это не сработало: /
Downgoat
5

Mathematica 54 41 байт

С абсолютно умным предложением от LegionMammal978, которое экономит 13 байтов.

If[#>0,FromLetterNumber,,LetterNumber]@#&

If[#>0,FromLetterNumber,,LetterNumber]служит единственной цели принятия решения - применять FromLetterNumberили LetterNumberвводить.

#>0будет удовлетворен, если на входе, #будет число, в этом случае FromLetterNumberбудет выбран.

Однако #>0не будет ни истинным, ни ложным, если #это буква, и LetterNumberбудет выбран вместо.


If[#>0,FromLetterNumber,,LetterNumber]@#&["d"]

4


If[#>0,FromLetterNumber,,LetterNumber]@#&[4]

d


В Mathematica, FromLetterNumberа LetterNumberтакже будет работать с другими алфавитами. Для этого требуется всего несколько байтов.

If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[4, "Greek"]
If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[4, "Russian"]
If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[4, "Romanian"]

δ
г
б

If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[δ, "Greek"]
If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[г, "Russian"]
If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[b, "Romanian"]

4
4
4

DavidC
источник
1
Немного игры в гольф, доведя ее до 41 байта:If[#>0,FromLetterNumber,,LetterNumber]@#&
LegionMammal978
Я расцениваю ваше предложение , как: If[#>0,FromLetterNumber[#],LetterNumber@#]‌&. Хотя If[#>0,FromLetterNumber[#],LetterNumber@#]‌&[4]работает, If[#>0,FromLetterNumber[#],LetterNumber@#]‌&["c"]нет. Это, видимо, не может решить "c">0. Я неправильно понял?
DavidC
Двойник ,,намерен, как и внешность @#; он оценивается как If[# > 0, FromLetterNumber, Null, LetterNumber][#]&, который использует форму с 4 аргументами If(посмотрите на это).
LegionMammal978
Удивительно, как Ifработает форма с 4 аргументами .
DavidC
4

Haskell, 54 байта

f s|s<"A"=[['@'..]!!read s]|1<2=show$fromEnum(s!!0)-64

Пример использования: map f ["1","26","A","Z"]-> ["A","Z","1","26"].

Строгая система типов Хаскелла - настоящая боль здесь. Кроме того, все короткие функции char <-> int любят chrи ordнуждаются в импорте, поэтому я должен сделать это вручную. Для буквы -> Int, например, мне нужно преобразовать String-> Char(через !!0) -> Integer(через fromEnum) -> String(через show).

Ними
источник
4

C, 55 байтов

i;f(char*s){i=atol(s);printf(i?"%c":"%d",64^(i?i:*s));}
orlp
источник
4

Perl 6 , 25 байт

{+$_??chr $_+64!!.ord-64}

Объяснение:

# bare block lambda with implicit parameter of 「$_」
{
    +$_         # is the input numeric
  ??
    chr $_ + 64 # if it is add 64 and get the character
  !!
    $_.ord - 64 # otherwise get the ordinal and subtract 64
}

Пример:

say ('A'..'Z').map: {+$_??chr $_+64!!.ord-64}
# (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26)

say (1..26).map: {+$_??chr $_+64!!.ord-64}
# (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
Брэд Гилберт b2gills
источник
2
Несмотря на то, что синтаксис такой разный, тот же механизм имеет такое же количество байтов в Perl 5 perl -pe '$_=/\d/?chr$_+64:-64+ord':!
Дом Гастингс
3

C #, 32 байта

n=>(n^=64)>26?(object)(char)n:n;

Приводит к Func<int, object>.

Ввод: charкосвенно преобразуется в intтак, что может быть вызвано с int(1-26) или char('A'-Z').

Вывод: либо a, charлибо int.

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

PHP, 49 41 40 байт

<?=+($i=$argv[1])?chr($i+64):ord($i)-64;

Я не думаю, что есть хорошая альтернатива is_numericправильно?

Это выполняется из командной строки ( $argv[1]указана первая переменная)

Благодаря:

@insertusernamehere: Гольф 8 байтов. Замена is_numeric($i=$argv[1])на. 0<($i=$argv[1])Это работает, потому что (int)"randomLetter" == 0.

@manatwork: уменьшается на 1 байт. Заменить 0<на +. В этом случае происходит то, что сигнал + приводит «Z» (или любую другую букву) к 0. Это приводит к значению false. Поэтому любая буква всегда ложна, а число всегда верно.

Йерун
источник
2
Использование 0<($i=$argv[1])вместо is_numeric($i=$argv[1])экономит 8 байт .
insertusername здесь
1
Продолжая эту идею: 0<+.
manatwork
2

Python 2, 61 байт

i=raw_input()
try:o=chr(int(i)+64)
except:o=ord(i)-64
print o

Да, я мог бы перейти на Python 3 для input

Карл Напф
источник
Используйте input()все же и измените int(i)на i.
Утренняя монахиня
Тогда ввод символов не работает.
Карл Напф
2
Возьмите вход как"A"
Leaky Nun
3
Это глупо. Aили ничего.
Карл Напф
Вы можете отбросить несколько байтов, переформулировав его как функцию: строка 1:, def f(i):строка 2: <пробел> try:o=chr(i+64), строка 3 <пробел>, в противном случае без изменений, строка 4: <пробел> return o В этой форме это будет работать в любом Python 2. или Python 3
CDlane
2

PowerShell v2 +, 42 байта

param($n)([char](64+$n),(+$n-64))[$n-ge65]

Принимает входные данные $n(в виде целого числа или явного символа) и использует псевдотернарный код для выбора между двумя элементами массива. Условным является $n-ge65(т. Е. Является входом ASCII Aили выше). Если это так, мы просто приводим входные данные как целые и вычитаем 64. В противном случае мы добавляем 64к входному целому числу и приводим его как [char]. В любом случае результат остается на конвейере, и печать неявна.

Примеры

PS C:\Tools\Scripts\golfing> ([char[]](65..90)|%{.\alphabet-to-number.ps1 $_})-join','
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26

PS C:\Tools\Scripts\golfing> (1..26|%{.\alphabet-to-number.ps1 $_})-join','
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
AdmBorkBork
источник
2

Befunge-98 *, 19 байт

&:39*\`'@\j;+,@;-.@

Поскольку в вопросе говорилось, что вы получите 1-26или, A-Zя предположил, что это означает число 26 или символ AZ. Большинство интерпретаций борются с вводом alt-кодов, поэтому проще использовать &и вводить такие значения, как 26 для 26 или 90 для «Z», в отличие от~ .

Псевдо-код

int c = get stdin
push the value of 27
bool is_number =  27 > c
push the value of `@` (64)
if is_number == 1
   jump to adding 64 to c //putting it the ASCII range
   print as ASCII
   end
else
   jump to subtracting 64 from c //putting it in the numerical range
   print as number
   end

Проверьте это (на Windows) здесь!

* Технически это Unefunge-98, потому что он использует только 1 измерение, но это имя может быть незнакомым.

tngreene
источник
2

Befunge 93 , 144 90 66 54 36 19 байт

Не уверен на 100%, разрешено ли это, но если вам разрешено набирать A как 65, B как 66 и т. Д., То (для [моего] удобства):

&:"@"`"@"\#. #-_+,@

Иначе, в 36 байтах:

~:0\"A"-`#v_88*-.@
**~28*++,@>68*-52

(Спасибо Tngreene за предложения!)

~:0\567+*-`#v_88*-.>$28*+,@
52**\28*++,@>~:0`!#^_\68*-

(Спасибо Sp3000 за сохранение 12 байтов путем перестановки!)

~:0\567+*-`#v_88*-.>$82*+,@
            >~:0`!#^_\68*-52**\28*++,@


v                   >$28*+,@
             >~:0`!#^_\68*-52**\28*++,@
>~:0\567+*-`#^_88*-.@


v                    >$28*+,@
~           >11g~:0`!|
1                    >\68*-52**\28*++,@
1
p           
>011g567+*-`|
            >11g88*-.@

Ungolfed:

v                       >$ 28* + , @
                 >~:0 `!|
                        >\ 68* - 52* * \ 28* + + , @
>~:0\ 5 67+ * - `|
                 >88* - . @

Это моя первая рабочая программа Befunge за всю историю, и я чувствую необходимость в гольфе. Любая помощь будет принята с благодарностью.

Вы можете проверить код Befunge здесь .

Даниил
источник
1
Передача быстрого взгляда на комментарий: Befunge оборачивается, поэтому вы можете переместить последние 12 символов второй строки вперед и получить52**\28*++,@>~:0`!#^_\68*-
Sp3000
@ Sp3000, о, я этого не заметил. Благодарность!
Даниэль
Поздравляем с первой в истории программой! Одна вещь, которую следует учитывать, - генерировать большие числа, помещая значения ASCII в строку. Сравните 567+*с "A". Кроме того, не забывайте gи pинструкции по повторному использованию значения вместо того, чтобы создавать его повторно. Кроме того, я не смог найти никаких входных данных, которые бы перенесли IP в ветку >$ 28* + , @. Для чего это? Вы уверены, что это нужно?
tngreene
Наконец, я восхищаюсь вашей преданностью разбору «26» или «08». Ваш метод, как я читал, включает в себя математические преобразования чисел с большим числом символов <->, как в (от «2» до 2 обратно к «2»). Наличие вашего первого и второго входов в виде чисел, прежде чем вы начнете сравнивать их, может уменьшить количество ASCII-арифметики, которую вы делаете. В качестве альтернативы, возможно, есть способ эффективно обрабатывать входные данные в виде символов («2», как в «2»), преобразование в числа не требуется!
tngreene
@tngreene, Целочисленные входы <10 идут в ветвь, $28*+,@тогда как те> = 10 идут в другую. Это было сделано в конечном итоге, потому что вы не можете прочитать входные данные более одного раза, насколько я знаю.
Даниэль
2

Brainfuck, 445 персонажей

Больше доказательство концепции, чем гольф-код. Требуется Без подписи, Brainfuck без упаковки.

,[>+>+<<-]>[<+>-]>>++[->++++++<]>[-<<<+++++>>>]<<<<[->-<]>[,<++++[->------------<]++++[->>------------<<][-<<++++++++++>>]>[-<+>]>[-<<++++++++++>>]>++[->++++++<]>+[-<+++++>]<-[-<<<+>>>]<<<.>]>[[-<+<+>>]>++[->++++++<]>+[-<+++++>]<-[-<<->>]<<[->+>+<<]>>>++++++++++<+[>[->+>+<<]>[-<<-[>]>>>[<[-<->]<[>]>>[[-]>>+<]>-<]<<]>>>+<<[-<<+>>]<<<]>>>>>[-<<<<<+>>>>>]<<<<<-[->+>+<<]>[-<++++++++++>]<[-<->]++++[-<++++++++++++>]++++[->>++++++++++++<<]>>.<<<.>]

С комментариями

,[>+>+<<-] Firstly Duplicate it across two buffers
>[<+>-] Move the second buffer back to the first buffer
>>++[->++++++<]>[-<<<+++++>>>] Establish 60 in the second buffer
<<<<
Compare Buffers 1 and 2
[->-<]
>
[ If there's still data in buffer 2
, Write the value in the units column to buffer two
<
++++
[->------------<] Subtract 12 from the units buffer
++++
[->>------------<<] Subtract 12 from the tens buffer
[-<<++++++++++>>] Multiply buffer three by ten into buffer 1
>
[-<+>] Add the units
>
[-<<++++++++++>>] Add the tens
>++ Add 65 to the buffer
[->++++++<]>+
[-<+++++>]
<- Actually we need 64 because A is 1
[-<<<+>>>] Add 64 to the first buffer
<<<
. Print the new letter
> Move to blank buffer
]
>
[ Otherwise we're a letter
[-<+<+>>] Copy it back over the first two buffers
>++ Write 64 to the buffer
[->++++++<]>+
[-<+++++>]
<-
[-<<->>] Subtract 64 from the letter
<<[->+>+<<]
>>>++++++++++< Copy pasted Division step x = current buffer y = 10 rest of the buffers are conveniently blank

+
[>[->+>+<<]>[-<<-[>]>>>[<[-<->]<[>]>>[[-]>>+<]>-<]<<]>>>+<<[-<<+>>]<<<]>>>>>[-<<<<<+>>>>>]<<<<<
-
[->+>+<<]
>[-<++++++++++>]
<[-<->]
++++
[-<++++++++++++>]
++++
[->>++++++++++++<<]
>>.<<<.>
] 
Ataco
источник
2

Java, 104 98 97 83 54 53 51 50 30 байт

x->(x^=64)>64?(char)x+"":x+"";

Тестовая программа :

IntFunction<String> f = x -> (x ^= 64) > 64 ? (char) x + "" : x + "";
out.println(f.apply('A')); // 1
out.println(f.apply('Z')); // 26
out.println((f.apply(1))); // A
out.println((f.apply(26))); //Z
Шон Уайлд
источник
1
Вы можете сбросить около 20 байтов, используя троичный оператор, например, так:return(s.matches("\\d+")?(char)(Integer.parseInt(s)+64)+"":(s.charAt(0)-64)+"");
yitzih
Вы также можете удалить приведение к int, что позволит вам уменьшить размер на 7 байт.
user902383
Программа не принимает никаких входных данных. Программа не дает никакого вывода. Там даже нет программы!
Николас Барбулеско
@NicolasBarbulesco Вы не обязаны писать полную программу, если не указано иное.
Шон Уайлд,
1

R, 73 байта

f=function(x){L=LETTERS;if(is.numeric(x)){i=L[(x)]}else{i=which(L==x)};i}
Мейми
источник
Нет необходимости f=, и вы пытаетесь использовать эту ifelseфункцию, чтобы, возможно, сыграть несколько байтов!
Фредерик
1

Python 3, 49 48 53 50 байт

Каким-то образом я неправильно подсчитал число байтов; _; спасибо, дахугленный

isalpha короче чем isnumeric

lambda x:x.isalpha()and ord(x)-64or chr(int(x)+64)

принимает входные данные в виде строки, которая может быть буквой или цифрой

Разрушаемый Лимон
источник
1
Вы можете удалить пробел между x.isnumeric()и elseсохранить один байт.
Акролит
1

Java, 61 байт

int f(char c){return c^64;}char f(int i){return(char)(i^64);}

Ungolf'd:

int f(char c) {
    return c^64;
}

char f(int i) {
    return (char) (i^64);
}

Вызов f('A')вызывает первую функцию, возвращая int1; Вызов f(1)вызывает вторую функцию, возвращая char«А».

AJNeufeld
источник
`Вы должны взять число в качестве ввода и вывести соответствующую букву алфавита, и наоборот. (1 <=> A, 2 <=> B) и т. Д. Я не думаю, что набор функций подходит для этого.
Шон Уайлд,
1
@SeanBean это перегрузка функции.
NoOneIsHere
1
Это не требует ввода. Это не дает никакого выхода. Там нет программы!
Николас Барбулеско
Вы должны предположить, что вводом является «A» .. «Z» или «0» .. «9». Поскольку строка является единственным примитивом, который может содержать либо (вы не знаете, каким будет ввод), ваша функция должна ожидать строковый аргумент.
RobIII
1

Javascript 86 77 66 60 байт

i=>typeof i<'s'?String.fromCharCode(i+64):i.charCodeAt(0)-64
  • сохранено 7 байт после комментариев об использовании функций стрелок
  • сохранил еще 11 байтов, удалив возврат / скобки, как отмечено @manatwork
  • сэкономили еще 6 байтов благодаря @manatwork
Дилан Миус
источник
1
Используйте функции стрелок
Лысая банта
@BaldBantha ура, изменил его :-)
Дилан Мееус
Нет необходимости в returnутверждении i=>typeof i=='number'?String.fromCharCode(i+64):i.charCodeAt(0)-64.
manatwork
@ Manatwork Приветствия!
Дилан Мееус
1
В соответствии с описанием задачи typeofвход может быть только «число» или «строка». Так что не нужно проверять =='number', <'s'тоже сделаю это.
manatwork
1

ASM: 10 байт

3C 40 77 04 2C 40 EB 02 04 40

Объяснение: Это собранное представление программы, которая делает именно то, что запрашивается. Он не полностью функционален, потому что ему нужны некоторые директивы, но если он добавлен в сегмент кода программы сборки, он должен работать. Он получает входные данные в регистр AL и, если это буква, вычитает 40h из значения кода ASCII, оставляя только число (т. Е. B = 42h, 42h-40h = 2h). Если ввод является числом, он делает противоположную процедуру, добавляя 40h. Оставляет результат в регистре AL. Ниже приведен исходный код сборки

cmp al,40h
ja letter_to_number
sub al,40h
jmp continue
letter_to_number: add ax,40h
continue:

Кроме того, если вы преобразуете все остальные ответы в машинный код, я уверен, что мой будет наименьшим.

6a75616e
источник
Я думаю, что есть несколько вопросов: 77 02 2Cдолжно быть 77 **04** 2C; subи addявляются в обратном направлении.
floorcat
Я применил вышеуказанные исправления и создал «функцию», которую можно вызывать из программы на C на компьютере x86_64. #define F(x) ((int(*)(int))"\x89\xf8\x3c\x40\x76\4\x2c\x40\xeb\2\4\x40\xc3")(x)
floorcat
Что это за сборка?
mbomb007
Турбо Ассемблер
6a75616e
1

Excel, 33 байта

=IFERROR(CHAR(A1+64),CODE(A1)-64)
Wernisch
источник
1

Japt , 11 байт

;BbU Ī´UgB

Попытайся

;BbU Ī´UgB     :Implicit input of integer or string U
;B              :Uppercase alphabet
  bU            :0-based index of U (-1 if not found)
     Ä          :Add 1
      ª         :Logical OR with
       ´U       :Decrement U
         gB     :Index into the uppercase alphabet
мохнатый
источник