输出字母,字母或仅一个字符


49

挑战很简单:

编写一个接受输入的函数或程序,x如果x是小写字母的一部分,则输出小写字母;如果x是大写字母的一部分,则输出大写字母,并输出x不属于大写字母的一部分。

规则:

  • 输入可以是函数参数或来自STDIN
  • 输入将是从32到126(空格到波浪号)的任何可打印ASCII字符。
  • 输入的内容可以在引号'x'或内"x",但请记住'"是有效的输入,应予以支持。
  • 输入的内容可以是字母中的任何字母,即您不能假定它是aA
  • 输出应仅是字母之一或单个符号,但结尾的换行符可以。
  • 字母表中的字母不应由空格,逗号或其他任何字符分隔。

一些例子:

F
ABCDEFGHIJKLMNOPQRSTUVWXYZ

z
abcdefghijklmnopqrstuvwxyz

"
"

    <- Input:  Space
    <- Output: Space

以字节为单位的最短代码获胜。


可选,但不胜感激:如果您的语言有在线口译员,请同时发布链接,以便其他人可以轻松对其进行测试。


排行榜

这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

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

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

## Perl, 43 + 2 (-p flag) = 45 bytes

您还可以将语言名称设置为链接,然后该链接将显示在代码段中:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


我们是否允许导入类似Python的包:import Random然后使用Random.randint(显然不是为了这个挑战,但是仍然)?
丹尼尔(Daniel)

是的,您可以导入软件包。但是例如要写入的字节import string数已计算在内,因此通常最好采取解决方法。请注意,发布挑战之前,该程序包必须存在。许多挑战都有类似的内容:“不允许使用执行此操作的程序包”,但事实并非如此。
Stewie Griffin

我假设“引号是有效的输入,必须得到支持”,您的意思是,如果您的输入方法需要引号,则引号作为输入将被转义
Cyoce 2015年

我们可以假设一个REPL环境吗?

Answers:


22

TeaScript,5个字节

xN(0)

TeaScript具有(几乎)内置的:D

在线尝试(注意:在线解释器已更新为TeaScript v3,因此在其中N0

尝试所有测试用例


TeaScript 3,2个字节[无竞争]

使用TeaScript 3,这可以变成2个字节。这是非竞争性的,因为TeaScript 3是在挑战之后制作的

N0

1字节替代

如果我们可以输出0123456789数字,则可能是:

°

TeaScript 3 有效的。因此,您可以使用它!
user75200 '11

27

Pyth,10个字节

h/#z[GrG1z

测试套件

我们首先构造一个包含3个元素的列表:小写字母,大写字母和输入。([GrG1z)然后,我们根据元素中非零输入的出现次数来过滤此列表。(/#z)最后,我们获取过滤列表的第一个元素。


6
严重的是,有几个字节的Pyth无法解决什么问题?我真的需要学习这种语言
。– Hexaholic

25
了解哪种语言?...您提到了两种语言。:P
quintopia

2
@quintopia好吧,为什么不都呢?:)
Hexaholic 2015年

15

LabVIEW,23个LabVIEW原语

选择器(cse结构上的?)连接到称为词法类的vi。根据输入输出从1-6的数字,5为小写,4为大写。

for循环执行26次以创建字母,或者循环一次以使符号通过。


4
多年前,有人(曾有特权?不幸?由您决定)在LabVIEW中工作,您的回答给我带来了微笑。=)
corsiKa

12

Haskell,48个字节

f c=filter(elem c)[['a'..'z'],['A'..'Z'],[c]]!!0

用法示例:

*Main> f 'g'
"abcdefghijklmnopqrstuvwxyz"
*Main> f 'H'
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
*Main> f '\''
"'"

接受['a'..'z'],['A'..'Z']的所有列表以及带有输入char的单例列表,c其中where c是元素。对于字母,我们总是有两个匹配项,因此我们选择第一个。


11

JavaScript(ES6),79个字节

x=>(a="abcdefghijklmnopqrstuvwxyz",x>"`"&x<"{"?a:x>"@"&x<"["?a.toUpperCase():x)

说明

JavaScript在比较字符串时会按字母顺序比较每个字符的代码,因此,比较中使用的字符代码在所需字符范围的上方和下方都是1。

x=>(
  a="abcdefghijklmnopqrstuvwxyz", // a = lower-case alphabet
  x>"`"&x<"{"?a:                  // if x is a lower-case letter, output alphabet
  x>"@"&x<"["?a.toUpperCase():    // if x is an upper-case letter, output upper-case
  x                               // else just output x
)

测试


这实际上是用Javascript生成带有整个字母的字符串的最短方法吗?如果您想要整个可打印的ASCII范围,是否需要键入每个字符?
Stewie Griffin

1
@StewieGriffin可悲的是。唯一的其他方法是:for(a="",i=64;++i<91;)a+=String.fromCharCode(i)String.fromCharCode非常不适合打高尔夫球,但有时这是唯一的方法!
user81655

4
在这种情况下,余额介于String.fromCharCode.toUpperCase(Dumb和Dumber)之间,但是toUpperCase获胜者
edc65

真好!我已经尝试了几种其他的打高尔夫球方式,但是还没有找到一种可行的方法。x=>x.replace(/[A-Z]/i,c=>c>"`"?a:a.toUpperCase(),a="abcdefghijklmnopqrstuvwxyz")可以,但是要长一个字节。更改[A-Z]\w作品除了一切_。您的解决方案似乎是最短的。
ETHproductions 2015年

这是在ABC...abc...?没有实际for循环的情况下最短的生成方式之一:(一些填充)[for(_ of[...Array(i=64)])if(i++%32<26)String.fromCharCode(i)].join``+x
ETHproductions 2015年

8

R,90 75字节

a=scan(,'');l=letters;L=LETTERS;cat("if"(a%in%l,l,"if"(a%in%L,L,a)),sep="")

感谢朱塞佩

旧版本(90字节):

a=scan(,'');l=letters;L=LETTERS;if(a%in%l)cat(l,sep="")else if(a%in%L)cat(L,sep="")else a

看起来很丑,但是这些cat不能外包给函数,恕我直言。



73个字节:的第二个参数scan可以是任何字符类型的对象,因此可以letters代替''
罗宾·赖德

7

Python 3,92 84 82 74字节

当前版本:74,感谢isaacg和wnnmaw!

lambda c:(c,''.join(chr(x+(67,97)[c>'Z'])for x in range(25)))[c.isalpha()]

空球:(对于空球的一些定义

lambda c:
    (
        c,
        ''.join([chr(x + (67,97)[c > 'Z']) for x in range(25)])
    )
    [c.isalpha()]

第一版:92

def f(c):print(''.join([chr(x+(97if c>'Z'else 65)) for x in range(25)])if c.isalpha()else c)

第二版:82,感谢isaacg!:)

lambda c:''.join(chr(x+(97if c>'Z'else 65))for x in range(25))if c.isalpha()else c

嗨,欢迎来到PPCG!好答案。这是一个打高尔夫球的建议:您可以使用lambda表达式(lambda c:)代替显式定义(def f(c):print(),并保存一些字节。另外,您无需在for。之前留空格。
isaacg 2015年

啊,我以为“输出”是指打印,而不仅仅是返回:)整洁,如果真是这样,它会降到84 lambda c:''.join([chr(x+(97if c>'Z'else 65))for x in range(25)])if c.isalpha()else c。谢谢!
Koneke 2015年

是的,站点上输出的标准定义允许从函数返回,因此您可以将新版本编辑为答案。另一种高尔夫是不需要括号的-没有生成器,函数的功能完全相同,它是生成器理解而不是列表理解。
isaacg 2015年

啊,以前从未真正使用过生成器理解功能,而是学习新知识!再次感谢:)
Koneke

请注意,输入"功能时,您需要\"
丹尼尔(Daniel)

6

Python 3,118 105 98 97 83字节

简单的解决方案。编辑:感谢高尔夫球手埃里克(Erik)的建议打高尔夫球。

lambda s,a='ABCDEFGHIJKLMNOPQRSTUVWXYZ':(s,(a,a.lower())[s.islower()])[s.isalpha()]

取消高尔夫:

def f(s):
 a='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
 if s.isalpha():
  if s.islower():return a.lower()
  else:return a
 return s

1
您可以使用三元运算符来保存一些字节吗?有点像return a.lower() if s.islower() else a
David Robertson

@DavidRobertson我不确定您是否在正确阅读我的解决方案,这是代码的第一行,但这正是我在做的事情。
Sherlock15年

啊! 我正在阅读非高尔夫版本。对于那个很抱歉!
大卫·罗伯逊

@DavidRobertson没问题
Sherlock9

高尔夫:lambda s,a='abcdefghijklmnopqrstuvwxyz':(s,(a,a.upper())[s.isupper()])[s.isalpha()]
埃里克

5

PHP,62 76 82字节

PHP现在运行正常:

<?=ctype_alpha($x=$argv[1])?join(range(Z<$x?a:A,Z<$x?z:Z)):$x;

从命令行获取输入,例如:

$ php alphabet.php A
$ php alphabet.php "a"
$ php alphabet.php " "
$ php alphabet.php _

编辑

  • 替换为,节省了6个字节。思想方式复杂。感谢manatwork91>ord($x)Z<$x
  • 通过直接删除并构建所需范围,节省了14个字节strtoupper

ord()看起来利空出现。尝试Z<$x?$a:strtoupper($a)
manatwork 2015年

@manatwork哈哈,在第二部分中,我已经想到了复杂的方法。感谢指出。
插入用户名

尝试' '&$x^A使a和z大写和小写。也就是说,您的代码成为<?=ctype_alpha($x=$argv[1])?join(range(' '&$x^A,' '&$x^Z)):$x;
Ismael Miguel

@IsmaelMiguel这将具有完全相同的字节数。
2015年

1
别担心-这仍然是混淆的好方法。;)
insertusername此处,2015年

5

Perl,46 34 33字节

包括+2 -nE

say/[a-z]/?a..z:/[A-Z]/?A..Z:$_

运行为

perl -nE 'say/[a-z]/?a..z:/[A-Z]/?A..Z:$_'

  • for由于@Dom Hastings更新34通过省略和使用裸字节省了12个字节。
  • 更新33使用-Esay代替保存1个字节print

@DomHastings谢谢!应该有已知的裸词被允许在那里-我应该已经看到了for:-/。尝试了一堆方法,(-p使用$"='';$_="@_",即使$a='/[a-z]/?a..z:';print eval$a.uc$a.'$_'一切都更长……
Kenney 2015年

对此有一个想法,如果您设置$_=而不是printing并使用-p标志来代替,则-n可以保存另外两个...到目前为止,我仍然想不出任何其他方法来保存更多...
Dom Hastings

@DomHastings我尝试过,但是我无法设置$_一个列表(我知道)。它必须进行插值($_="@_"),但是它使用空格作为分隔符,所以我也必须这样做$"='',(或使用join'',)会使它更长。这个没有太大的回旋余地!
肯尼2015年

嗯,当然!您甚至说过(当我不在酒吧后重新阅读评论时...),我会继续考虑,但是如果不使用say而不是,您可能会是最短的print
Dom Hastings 2015年

5

Ruby,41 +1 = 42

带开关-p,运行

([*?A..?z]*'').scan(/\w+/){$&[$_]&&$_=$&}

这将生成字符串

ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

并检查每个连续的“单词字符”块,它们恰好是小写和大写字母以及下划线字符。如果Z和a之间有多个连续的单词字符,此技巧将不起作用。

根据要求进行编辑以添加说明:

-p标志本质上确实

while( $_ = STDIN.gets )
  #execute code
  print $_
end

[*?A..?z]是大写字母A和小写字母Z之间的字符数组,按ASCII顺序排列。那是大写字母,一些非字母字符和小写字母。*''将数组连接成字符串,以便我们可以对其进行调用.scanscan将找到正则表达式的每个匹配项,并用它/\w+/填充magic变量$&,然后调用该块。每次迭代该块时,它都会检查匹配的字符串是否包含$_,并将输出设置为该字符串。因此,如果$ _包含在大写或小写字母中,则会对其进行相应的修改,否则它将保持不变。

非高尔夫版本看起来像

while ($_ = STDIN.gets )
 %w[ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz].each do |alphabet|
  $_ = alphabet if alphabet.include?($_)
 end
 print $_
end

您可以发布非高尔夫版本吗?我仍然不完全了解它是如何工作的。
Shelvacu 2015年

当然可以,张贴一个。
histocrat

4

CJam,18个字节

'[,65>_elr:R]{R&}=

'[,65>推送大写字母,_el小写字母和r:R一个从STDIN读取并分配给variable的单字符字符串R。它们被包装在一个数组(])中,第一个具有任何字符的字符R是使用选中的{R&}=


我想了解如何使用CJam,但是在官方文档和我在这里阅读的内容之间却迷失了。有人可以给我一个页面,例如我可以理解为什么_el小写字母的页面吗?
Erdal G.

啊,el意思是“转换为小写”。我刚刚按下了大写字母,所以现在我用来复制它_,然后调用el结果副本。
林恩

1
我制作了一个很好的pdf文件,其中包含(几乎)所有的CJam命令。
林恩

4

视网膜,62字节

[a-z]
abcdefghijklmnopqrstuvwxyz
[A-Z]
ABCDEFGHIJKLMNOPQRSTUVWXYZ

两条短线是要匹配的正则表达式。如果输入是小写字母(在范围内[a-z]),它将用小写字母替换该字符(在这种情况下,即整个输入)。大写的过程与此类似。如果不是字母,则不会进行替换,并且会原封不动地输出。

在线尝试。


4

蟒2.7.10,95 93 79个字节

这是我第一次尝试高尔夫,所以,非常感谢您的帮助或建议!

from string import* 
lambda i:(i,(uppercase,lowercase)[i.islower()])[i.isalpha()]

感谢Morgan Thrapp的帮助!


1
@MorganThrapp,这似乎不起作用。您确定它可以在Python 2.7.10中运行吗?
丹尼尔(Daniel)

它适用于2.7.8。什么不起作用?
Morgan Thrapp 2015年

@MorganThrapp,实际上,您能否先解释一下它的工作原理?也许只是我听不懂,所以我做错了。
丹尼尔(Daniel)

当然,它使用False == 0True == 1索引到元组的事实。因此,它首先检查字母isalpha是否为,如果是,它将返回1,然后检查其是否为小写字母并执行相同的操作。
Morgan Thrapp 2015年

1
没问题!我喜欢打高尔夫球,所以我总是很乐意帮助新朋友!
Morgan Thrapp 2015年

4

Ruby,46个 43个字符

(42个字符的代码+ 1个字符的命令行选项)

[?a..?z,?A..?Z].map{|r|r===$_&&$_=[*r]*""}

谢谢:

  • 乔丹===魔术(-3个字符)

样品运行:

bash-4.3$ echo -n 'm' | ruby -pe '[?a..?z,?A..?Z].map{|r|r===$_&&$_=[*r]*""}'
abcdefghijklmnopqrstuvwxyz

bash-4.3$ echo -n 'W' | ruby -pe '[?a..?z,?A..?Z].map{|r|r===$_&&$_=[*r]*""}'
ABCDEFGHIJKLMNOPQRSTUVWXYZ

bash-4.3$ echo -n '@' | ruby -pe '[?a..?z,?A..?Z].map{|r|r===$_&&$_=[*r]*""}'
@

4

MATL,22字节

jtt1Y2XIm~Iw?km?Ik]]1$

这将使用该语言的当前版本(3.1.0)

编辑(2017年9月15日):在MATL在线上尝试一下(使用该语言的较新版本)。

例子

>> matl jtt1Y2XIm~Iw?km?Ik]]1$
> e
abcdefghijklmnopqrstuvwxyz

>> matl jtt1Y2XIm~Iw?km?Ik]]1$
> T
ABCDEFGHIJKLMNOPQRSTUVWXYZ

>> matl jtt1Y2XIm~Iw?km?Ik]]1$
> "
"

说明

j              % input string (assumed to be a single character)        
tt             % duplicate twice
1Y2            % predefined literal: uppercase letters
XI             % copy to clipboard I         
m~             % check if not member    
I              % paste from clipboard I      
w              % swap elements in stack      
?              % if
    k          % convert string to lowercase 
    m          % check if member         
    ?          % if                          
        I      % paste from clipboard I      
        k      % convert string to lowercase 
    ]          % end                         
]              % end                         
1$             % input specification for implicit printing

3

Java,165个字符

class A {public static void main(String[]p){int c=p[0].charAt(0),d=c|32,b=(d-96)*(d-123),e=b<0?65|(c&32):c,f=e+(b<0?26:1);for(;e<f;e++){System.out.print((char)e);}}}

生成所需的输出到stdout(而不是返回它)。通过运行时参数输入。

这个怎么运作。

1)设置一些整数变量
c =运行时参数的第一个参数的第一个字符的ASCII值。
d = c转换为小写ASCII值(通过与32进行或
运算)b =计算以查看d是否为字母。如果是字母,将为<0。
e =输出的起始字符。如果d中的ASCII值是一个字母(请参阅b),则将其设置为“ A”(或通过在“ A” ASCII值上加上c AND 32而将其设置为“ a”),否则将其设置为c的原始值。
f =要输出的字符数。如果不是字母(请参阅b),则将其设置为1,否则将其设置为26。2
)从e到e + f循环,将每个字符输出到stdout。


2
您知道对于大多数挑战,解决方案都可以作为完整程序或功能提供?鉴于Java中大量的样板代码,功能可能会更短。
manatwork 2015年

1
应用一些小技巧,而无需更改逻辑,我得到了:void f(char c){for(int d=c|32,b=(d-96)*(d-123),e=b<0?65|(c&32):c,f=e+(b<0?26:1);e<f;)System.out.print((char)e++);}
manatwork 2015年

3

Perl,23个字节

包括+2 -nE(而不是普通的+1),以公平对待其他perl解决方案

使用STDIN上的输入运行,而无需在换行符后尾加尾:

echo -n g | perl -lnE 'say/\pL/?a&$_|A..Z:$_'

只是代码:

say/\pL/?a&$_|A..Z:$_

很好地利用了输入限制为7位字符这一事实。
msh210 '16

3

Lua,98 97字节

可悲的是,我没有找到一个少于26个字节的解决方案来设置a字母。实际上,我没有发现短于32。

编辑:由于@ATaco,节省了1个字节,从Lua开始时经常执行此错误:p

c=io.read()a="abcdefghijklmnopqrstuvwyz"print(not c:find"%a"and c or c:find"%u"and a:upper()or a)

您可以在官方网站ideone上在线对其进行测试。如果使用前者,则该输入将不起作用(禁用),因此请使用以下源(将其包装到函数中)。

function f(c)
  a="abcdefghijklmnopqrstuvwyz"
  print(not c:find"%a"and c or c:find"%u"and a:upper()or a)
end

print(f("\""))
print(f("a"))
print(f("Q"))

您不是唯一在Lua中找不到生成字母的更短方法的人。:(
manatwork 2015年

@manatwork哈哈,完全一样的东西,除了我不必打印它,而是将它连接起来^^。至少,这意味着没有我不知道的隐秘技巧^^'。
Katenkyo

您可以保存一个字节,c=io.read()a="abcdefghijklmnopqrstuvwyz"而不是a,c = ...
ATaco 2013年

2

Mathematica,75个字节

#/.Thread[Join[a=Alphabet[],b=ToUpperCase@a]->Array[""<>If[#>26,b,a]&,52]]&

相当不错的成绩。非高尔夫的语言......使用字符码处理的任何解决方案,将采取更多的字节,由于成本ToCharacterCodeFromCharacterCode


2

C(函数),71字节

f(s,n,c){n=1;if(isalpha(s))s-=s%32-1,n=26;for(c=s;c<s+n;)putchar(c++);}

f(s,n,c){for(c=s-=(n=isalpha(s)?26:1)>1?s%32-1:0;c<s+n;)putchar(c++);}保存一个字节。
肯尼2015年

1
f(s,n){for(n=isalpha(s)?s-=s%32-1,s+26:s+1;s<n;)putchar(s++);}为62个字节
gastropner

2

Python,81个字节

f=lambda z,a="abcdefghijklmnopqrstuvwxyz":[k for k in[a,a.upper(),z]if z in k][0]

这基本上是Pyth答案的翻译。它定义了一个f以字符作为参数并返回结果的函数。


1
你的意思是if z in k吧?另外,f=默认情况下是可选的。
xnor 2015年

@xnor是的。显然我错过了Ctrl-C。
PurkkaKoodari 2015年

2
删除f=,使函数匿名。-2
暴民埃里克

2

Jolf,17个字节

在这里尝试。

? hpLipl? hpUipui
?                  if
  hpL               the lowercase alphabet (array) contains
     i               the input
      pl            return the lowercase alphabet (string)
        ?          else if
          hpU       the uppercase alphabet (array) contains
             i       the input
              pu    return the uppercase alphabet (string)
                i  otherwise, return the input
                   implicit: print the result

2

MATLAB:71 68字节

i=input('');b=i<65|i>122|(i>90&i<97);[i*b,~b*((65:90)+32*(i>96)),'']

(感谢OP节省了3个字节)

测试:

i='a'
ans=
abcdefghijklmnopqrstuvwxyz

i='A'
ans=
ABCDEFGHIJKLMNOPQRSTUVWXYZ

i='~'
ans=
~

说明:大写字母占用65:90ASCII字符。小写字母为97:122ASCII。因此,请b=i<65|i>122|(i>90&i<97)检查输入字符i是否不是字母。如果是这样,则返回输入。如果b==1i<97(大写字符),则返回大写字母。如果b==1i>96,则添加32 65:90对应于97:122 -小写字母。


不错的提交。两条评论:i=input('')如果提交是脚本,则通常使用;如果是function,则通常用作函数参数@(i)i^2i='a'通常不被接受。另外,您可以通过[1,2,3,'']代替来节省3个字节char([1,2,3])
Stewie Griffin

好的,已编辑。感谢您的建议!
brainkz 2015年

2

SpecBAS,111字节

我已经浏览过多个版本,111似乎是我能管理的最好的版本。

1 INPUT l$: a$="abcdefghijklmnopqrstuvwxyz"
2  ?IIF$(l$ IN ["a" TO "z","A" TO "Z"],IIF$(l$=UP$ l$,UP$ a$,a$),l$)

第2行将?快捷方式用于PRINT和嵌套内联IF语句

伪代码说明

IF character IN "a".."z","A".."Z"
THEN
 IF character = UPPERCASE character
 THEN
  print UPPERCASE alphabet
 ELSE
  print alphabet
 ENDIF
ELSE
 print the character
ENDIF

很难使它["a" TO "z","A" TO "Z"]看起来更像是伪代码。"a".."z","A".."Z"至少在我看来,这看起来更像是一个“真实代码”……尽管这两个都非常易于理解=)
Stewie Griffin 2015年

2
指定什么
Bassdrop Cumberwubwubwub 2015年

2

Swift 2,142字节

func d(s:String)->String{let a="abcdefghijklmnopqrstuvwxyz";for v in s.utf8{return v>64&&v<91 ?a.uppercaseString:(v>96&&v<123 ?a:s)};return s}

不打高尔夫球

func d(s: String) -> String{
    let a="abcdefghijklmnopqrstuvwxyz"
    for v in s.utf8{
        return (
            v > 64 && v < 91 ?
            a.uppercaseString :
            (
                v > 96 && v < 123 ?
                a :
                s
            )
        )
     }
    return s
}

2

05AB1E19 16字节

-3个字节 else

DAsåiAëDAusåiAuë

这个怎么运作

                   # implicit input
D                  # duplicate
 A                 # push lowercase alphabet
  s                # swap last two elements
   å               # push a in b
    i              # if
     A             # lowercase alphabet
      ë            # else
         D         # duplicate
          Au       # uppercase alphabet
            s      # swap last two elements
             å     # push a in b
              I    # if
               Au  # uppercase alphabet
                 ë # else leave input
                   # implicit print

在线尝试!


不知道¹(第一输入),当你发布你的答案已经存在,但你可以打高尔夫球与它2个字节:A¹åiAëAu¹åiAuë在线试用测试套件)。
凯文·克鲁伊森

2

Java SE 8,71 69字节

打高尔夫球:

(a,s)->{char b=97;if(a<91)b-=32;a=b;b+=26;while(a<b)s+=a++;return s;}

取消高尔夫:

(a,s)->{          // String as a parameter. If declaration is necessary it adds 8 bytes
char b = 97;      // Uppercase A char, this is important
if (a < 91)       // If it is not past 'z', where a is a char param
    b -= 32;      // Then go back to the lowercase alphabet
a = b;            // Done to prevent a cast
b += 26;          // End of alphabet
while (a < b)     // Go to end of alphabet
    s += a++;     // Append character
return s;}        // Then return

我最初实现了以下内容

String s="";char b=96;if(a-91<0)b-=32;for(char c=b;++c<b+27;)s+=c;return s;

它更优雅,但可悲的是它大了一个字节。假设未定义非字母字符的行为,并且在执行之前将字符串s初始化为“”。轻一点,这是我的第一篇文章。

编辑:Stewie Griffin通过更改保存了2个字节

a - 91 < 0 to a < 91

2
欢迎光临本站!:)
DJMcMayhem

1
谢谢!潜伏了几年,并且真的很感兴趣,看看我是否可以提出竞争性的Java / C ++答案:)
jfh

1
a<91应该工作,还是...?
Stewie Griffin

2

Scala,91个字符

(c:Char)=>{var a='a'.to('z').mkString;if(c.isUpper)a=a.toUpperCase;if(!c.isLetter)a=""+c;a}

未打高尔夫球

def f(c: Char): String = {
    var a='a'.to('z').mkString //set up lower case default response
    if (c.isUpper) {
        a = a.toUpperCase     //mutate the result if upper case
    }        
    if (!c.isLetter) { 
      a = ""+c                 //mutate the result if not a letter
    }
    a                         //return result
}

有一个初始的可变结果,而不是从3个不同的值返回一个不变的值(如果其他情况,则块节省了我2个字符),即使我讨厌它。

斯卡拉法

一种更好的scala方法是这样的:

def convertToAlphabet(c: Char): String = {
    c match {
      case x if !x.isLetter => x.toString
      case x if x.isUpper => ('A' to 'Z').mkString
      case _ => ('a' to 'z').mkString
    }
}

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.