Answers:
ú' +û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í
Actually
。因此Actually, 7 bytes
。:P
其余大多数答案使用某种条件的。这个完全放弃了条件,而是将输入视为以36为底的数字,该数字索引到适当构造的bash-brace-expansion数组中:
a=(_ {A..I} {1..26} {J..Z} {A..Z})
echo ${a[36#$1]}
#
办?
码:
.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编码。在线尝试!。
n
标志= 40字节匿名函数。使用类似@KarlNapf的Python解决方案中的异常处理技巧。
@manatwork的-3个字节
->i{(64+i).chr rescue i.ord-64}
原始完整程序版本,带有n
40字节的标志,并从STDIN中读取:
puts$_!~/\d/?$_.ord-64:(64+$_.to_i).chr
@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个字节
"%d"%n==n
但是没用:/
与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
If[#>0,FromLetterNumber,,LetterNumber]@#&
If[#>0,FromLetterNumber[#],LetterNumber@#]&
。虽然If[#>0,FromLetterNumber[#],LetterNumber@#]&[4]
有效,If[#>0,FromLetterNumber[#],LetterNumber@#]&["c"]
但无效。它显然无法解决"c">0
。我误会了吗
,,
是有意的,外部也是有意的@#
;它的计算结果为If[# > 0, FromLetterNumber, Null, LetterNumber][#]&
,它使用4参数形式的If
(查找)。
If
工作原理令人惊讶。
{+$_??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)
perl -pe '$_=/\d/?chr$_+64:-64+ord'
!
<?=+($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。这将导致错误。因此,任何字母始终为假,数字始终为真。
0<($i=$argv[1])
代替is_numeric($i=$argv[1])
可以节省8个字节。
0<
→ +
。
i=raw_input()
try:o=chr(int(i)+64)
except:o=ord(i)-64
print o
是的,我可以切换到Python 3 input
input()
不过请使用并更改int(i)
为i
。
"A"
A
或者什么都没有。
def f(i):
,第2行:<space> try:o=chr(i+64)
,第3行<space>否则未更改,第4行:<space> return o
在这种形式下,它可以在Python 2中使用或Python 3
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
&: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
*从技术上讲这是Unefunge-98,因为它仅使用1维,但是该名称可能不熟悉。
不能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代码。
52**\28*++,@>~:0`!#^_\68*-
567+*
到"A"
。另外,不要忘记重用值的指示g
和p
指示,而不必重复建立它。另外,我找不到将IP带到分支的任何输入>$ 28* + , @
。这个是来做什么的?您确定需要它吗?
$28*+,@
而那些> = 10则转到另一分支。最终这样做是因为据我所知,您不能多次读取输入内容。
比打高尔夫球的代码更能证明概念。需要未签名,不可包装的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
+
[>[->+>+<<]>[-<<-[>]>>>[<[-<->]<[>]>>[[-]>>+<]>-<]<<]>>>+<<[-<<+>>]<<<]>>>>>[-<<<<<+>>>>>]<<<<<
-
[->+>+<<]
>[-<++++++++++>]
<[-<->]
++++
[-<++++++++++++>]
++++
[->>++++++++++++<<]
>>.<<<.>
]
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
return(s.matches("\\d+")?(char)(Integer.parseInt(s)+64)+"":(s.charAt(0)-64)+"");
不知何故我弄错了字节数; _; 谢谢dahuglenny
isalpha
短于 isnumeric
lambda x:x.isalpha()and ord(x)-64or chr(int(x)+64)
将输入作为字符串,可以是字母或数字
x.isnumeric()
并else
保存一个字节。
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')
调用第一个函数,并重新调整int
1;调用将f(1)
调用第二个函数,并返回char
“ A”。
i=>typeof i<'s'?String.fromCharCode(i+64):i.charCodeAt(0)-64
return
声明:i=>typeof i=='number'?String.fromCharCode(i+64):i.charCodeAt(0)-64
。
typeof
输入只能是“数字”或“字符串”。因此,无需检查=='number'
,<'s'
也可以这样做。
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
;在sub
和add
朝后。
#define F(x) ((int(*)(int))"\x89\xf8\x3c\x40\x76\4\x2c\x40\xeb\2\4\x40\xc3")(x)