字母转数字和数字转字母


26

挑战

在此挑战中,您必须将数字作为输入并输出相应的字母,反之亦然。(1 <=> A,2 <=> B)等

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

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

规则

  • 这是,因此以字节为单位的最短代码获胜。
  • 输入将仅由来自任一大写字母的AZ或从整数126包容。
  • 允许尾随空格(空格和换行符)。

1
为什么要重复?哦,这不相等。
乍得

3
欢迎来到编程难题和Code Golf!这个挑战可能需要一些澄清。例如,您可以指定我们需要处理的输入,因为存在无效的输入。我建议将未来的挑战发布到沙盒中,在发布到主站点之前,他们可以获取有意义的反馈。
Leaky Nun

1
我们会26以整数或"26"字符串形式接收还是都允许接收?
Leaky Nun

2
它必须是大写还是小写可以接受?
Mego

1
认真地,另一个字母挑战?(͡°
͜ʖ

Answers:


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í

在线尝试!


1
您现在赢了,我认为没有人可以编写少于7个字节的程序。
乍得

1
我加入只是想问这个。@Mego这是什么语言?
FoldedChromatin

2
@FoldedChromatin看起来像github.com/Mego/Seriously
Alfred Bez

1
@FoldedChromatin其实是Actually。因此Actually, 7 bytes。:P

2
这样的时刻让我对我为自己的语言选择的名字感到高兴:)
Mego


9

Erlang,26个字节

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

Erlang的字符串行为很有用的几次之一。



7

Python 3,43个字节

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

这个解决方案的有趣之处在于,它融合了OR,按位OR |,逻辑OR or,按位XOR ^和逻辑XOR的所有含义!=


6

2sable9 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 Nope,不适用于数字输入:(
Adnan

6

Ruby,47 39 + n标志= 40字节 33 34 31字节

匿名函数。使用类似@KarlNapf的Python解决方案中的异常处理技巧。

@manatwork的-3个字节

在线尝试

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

原始完整程序版本,带有n40字节的标志,并从STDIN中读取:

puts$_!~/\d/?$_.ord-64:(64+$_.to_i).chr

尝试在ideone运行时出现语法错误,您能告诉我如何测试吗?
Leibrug '16

@Leibrug哎呀!它现在是固定的
价值油墨

您可以通过耍赖采用更酌减卡尔NAPF从他的把戏Python的解决方案->i{(64+i).chr rescue i.ord-64}
manatwork '16

5

切达(Cheddar),34 32字节

@LeakyNun节省了2个字节

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


"%s"%n==n保存2个字节
Leaky Nun

@LeakyNun哦,这很聪明!我在做tryomg,"%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


在数学,FromLetterNumber并且LetterNumber还将与其他字母工作。这仅需要几个字节。

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

δ
г
b

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

4
4
4


1
打高尔夫球,使其达到41个字节:If[#>0,FromLetterNumber,,LetterNumber]@#&
LegionMammal978 '16

我将您的建议解释为: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 '16

4参数形式的If工作原理令人惊讶。
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"]

Haskell的严格类型系统在这里确实很痛苦。另外,所有短char <-> int函数都喜欢chr并且ord需要导入,因此我必须手工完成。对于字母-> int的情况,例如,我需要转换String-> Char(via !!0)-> Integer(via fromEnum)-> String(via show)。


4

C,55个字节

i;f(char*s){i=atol(s);printf(i?"%c":"%d",64^(i?i:*s));}

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)

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 charint


3

PHP,49 41 40字节

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

我认为没有很好的替代方法了is_numeric吗?

这是从命令行执行的($argv[1]是给定的第一个变量)

谢谢:

@insertusername此处:保留8个字节。更换is_numeric($i=$argv[1])0<($i=$argv[1])。这工作,因为(int)"randomLetter" == 0

@manatwork:减少1个字节。替换0<+。在这种情况下,发生的是+信号会将“ Z”(或任何字母)强制转换为0。这将导致错误。因此,任何字母始终为假,数字始终为真。


2
使用0<($i=$argv[1])代替is_numeric($i=$argv[1])可以节省8个字节
此处插入用户名,2016年

1
继续这个想法:0<+
manatwork '16

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
Leaky Nun

然后,字符输入不起作用。
Karl Napf '16

2
输入为"A"
Leaky Nun

3
la子 A或者什么都没有。
Karl Napf '16

您可以通过将其重新格式化为函数来删除一些字节:第1行def f(i):,第2行:<space> try:o=chr(i+64),第3行<space>否则未更改,第4行:<space> return o 在这种形式下,它可以在Python 2中使用或Python 3
cdlane

2

PowerShell v2 +,42个字节

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

接受输入$n(作为整数或显式char),并使用伪三元数在数组的两个元素之间进行选择。条件是$n-ge65(即输入的ASCII A或更大)。如果是这样,我们只需将输入转换为int并减去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

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维,但是该名称可能不熟悉。


2

Befunge 93144 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*-.@

取消高尔夫:

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

这是我有史以来第一个在职的Befunge计划,我觉得有必要进一步打高尔夫球。任何帮助将不胜感激。

您可以在此处测试Befunge代码。


1
快速浏览一下评论:Befunge环绕,因此您可以将第二行的最后12个字符移到最前面并获得52**\28*++,@>~:0`!#^_\68*-
Sp3000,2016年

@ Sp3000,哦,我没有注意到。谢谢!
丹尼尔(Daniel)

恭喜您有史以来第一个程序!要考虑的一件事是通过在字符串中推送ASCII值来生成大数。比较567+*"A"。另外,不要忘记重用值的指示gp指示,而不必重复建立它。另外,我找不到将IP带到分支的任何输入>$ 28* + , @。这个是来做什么的?您确定需要它吗?
tngreene

最后,我很欣赏您对解析“ 26”或“ 08”的投入。如我所读,您的方法涉及很多符号<->数字转换数学,如(“ 2”到2再回到“ 2”)。在开始比较它们之前,将第一个和第二个输入作为数字,可能会减少正在执行的ASCII算术运算量。另外,也许有一种方法可以有效地将输入作为符号处理(如“ 2”中的“ 2”),而无需转换为数字!
tngreene

@tngreene,整数输入<10转到分支,$28*+,@而那些> = 10则转到另一分支。最终这样做是因为据我所知,您不能多次读取输入内容。
丹尼尔(Daniel)

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

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

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 '16

该程序不接受任何输入。该程序不提供任何输出。甚至没有程序!
Nicolas Barbulesco,2016年

@NicolasBarbulesco除非另有说明,否则您无需编写完整的程序。
肖恩·怀德(Shaun Wild)


1

R,73个字节

f=function(x){L=LETTERS;if(is.numeric(x)){i=L[(x)]}else{i=which(L==x)};i}

无需f=,您尝试使用该ifelse功能来获取一些字节!
弗雷德里克

1

MATL,10个字节

6WZ~t42>?c

说明:

6W              % 2**6 = 64, but golfier looking
  Z~            % bit-wise XOR with input
    t42>?       % if result is greater than 42
         c      % convert it to a character 
                % else, don't

在线尝试!与数字输入。
在线尝试!与字母输入。


1

Python 3,49 48 53 50字节

不知何故我弄错了字节数; _; 谢谢dahuglenny

isalpha 短于 isnumeric

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

将输入作为字符串,可以是字母或数字


1
您可以删除空间之间x.isnumeric()else保存一个字节。
acrolith '16

1

Java,61个字节

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

取消高尔夫:

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

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

调用将f('A')调用第一个函数,并重新调整int1;调用将f(1)调用第二个函数,并返回char“ A”。


`您必须以数字作为输入并输出相应的字母,反之亦然。(1 <=> A,2 <=> B)等。我认为没有一组函数可以满足此要求。
肖恩·

1
@SeanBean是函数重载。
NoOneIsHere

1
这不需要任何输入。那没有输出。没有程序!
Nicolas Barbulesco,2016年

您应该假设输入是“ A” ..“ Z”或“ 0” ..“ 9”。由于字符串是唯一可以容纳其中任何一个的原语(您不知道输入的内容),因此函数应使用字符串参数。
RobIII

1

Javascript 86 77 66 60字节

i=>typeof i<'s'?String.fromCharCode(i+64):i.charCodeAt(0)-64
  • 关于使用箭头功能的注释后节省了7个字节
  • 如@manatwork所述,通过删除返回/括号又节省了11个字节
  • 通过@manatwork节省了另外6个字节

1
使用箭头功能
Bald Bantha

@BaldBantha欢呼,将其更改:-)
Dylan Meeus

无需return声明:i=>typeof i=='number'?String.fromCharCode(i+64):i.charCodeAt(0)-64
manatwork

@manatwork干杯!
Dylan Meeus

1
根据任务描述,typeof输入只能是“数字”或“字符串”。因此,无需检查=='number'<'s'也可以这样做。
manatwork '16

1

ASM:10个字节

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

说明:这是程序的组装表示形式,它完全按照要求进行操作。它不能完全正常运行,因为它需要一些指令,但是如果将其添加到汇编程序的代码段中,它将可以正常工作。它在AL寄存器中接收输入,如果是字母,则从ASCII码值中减去40h,仅保留数字(即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:

另外,如果您将所有其他答案转换为机器代码,我肯定我的将是最小的。


我认为有几个问题:77 02 2C应该是77 **04** 2C;在subadd朝后。
ceilingcat '16

我应用了上述更正,并创建了一个“函数”,您可以从x86_64机器上的C程序调用该函数。#define F(x) ((int(*)(int))"\x89\xf8\x3c\x40\x76\4\x2c\x40\xeb\2\4\x40\xc3")(x)
ceilingcat '16

这是什么类型的装配?
mbomb007 '16

涡轮组装器
6a75616e



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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.