打印自定义字母


20

挑战

显示从控制台输入读取的给定字母的字母。如果字母是大写字母,则必须以大写字母显示。打印的字母必须以所插入字母的开头字母结尾。如果将附加参数添加到输入(一个简单的点.),则该字母应在每行中打印一个字母。否则,应将字母打印在同一行中,并用一个简单的空格分隔。如果将错误的输入发送到程序,它将不会打印任何内容。

输入示例:

输入:

c

程序的输出:

d e f g h i j k l m n o p q r s t u v w x y z a b

输入值

H.

程序的输出:

I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
A
B
C
D
E
F
G

Sage Notebook在“控制台级别”上运行,因此在这种情况下所需的“控制台输入”是否只是在工作表单元格中键入输入?
res 2012年

最短的代码获胜?
ardnew

@ardnew是的,最短的代码胜出。
阿威罗伊

@res我认为,尽管您需要以某种方式对输入读数进行编码,但从规则的角度来看这可能是公平的。
阿威罗伊

6
@Averroes使用GolfScript的代价是学习在这种比赛之外没有实际用途的语言所花费的时间。我不认为对使用正确工具进行工作的人进行惩罚会很有成效。
Gareth 2012年

Answers:


12

GolfScript 48 75 73 70 67 66 63 57 53

(91,65>.+.{32+}%+.@?>(;25<''+.,1>*\['''.']?[' 'n 0]=*

在线演示:

更新:

现在,最后一条规则也已实施。感谢Ventero指出了这个问题。

更新:

我从头重写了代码,并找到了进一步缩短代码的新方法。

修改历史:

.,3<\(:x;:§['''.']?)and{91,65>.+.{32+}%+.x?).{>25<''+{§n' 'if}%}{;;}if}''if
.,3<\(:x;:§['''.']?)*{91,65>.+.{32+}%+.x?).{>25<''+{§n' 'if}%}{;;}if}''if
.,3<\(:x;:§['''.']?)*{91,65>.+.{32+}%+.x?).!!@@>25<''+{§n' 'if}%*}''if
.,3<\(:x;:§['''.']?)*!!91,65>.+.{32+}%+.x?).!!@@>25<''+{§n' 'if}%**
.,3<\(:x;:§['''.']?)*91,65>.+.{32+}%+.x?).@@>25<''+{§n' 'if}%@@*!!* 
.(@,3<@:§['''.']?)*91,65>.+.{32+}%+@1$?).@@>25<''+{§n' 'if}%@@*!!*
.(@,3<@:§['''.']?)*91,65>.+.{32+}%+@1$?):x>25<''+{§n' 'if}%\x*!!*
.(@,3<@:§['''.']?)*91,65>.+.{32+}%+@1$?):x>25<''n' 'if*\x*!!*
(\:§['''.']?)91,65>.+.{32+}%+@1$?):x>25<''n' 'if*\x*!!*
(91,65>.+.{32+}%+.@?>(;25<''+.,1>*\['''.']?[' 'n 0]=* 

2
该解决方案未遵循最后的要求:If wrong input is send to the program it will not print anything.
Ventero 2012年

@Ventero对。我会解决这个问题。
克里斯蒂安·卢帕斯库

63 -不错,我们是库标准盘:),希望我能理解golfscript;)
布阿

我对Q的看法也一样。;-)
Cristian Lupascu 2012年

+1很棒!愿意突破50 ;-)?
2012年

10

C,135 129 128个字符

该死的,这么多不同的魔术数字,但是没有办法摆脱它们。

必须以输入作为程序参数运行。现在遵循“输入错误”的要求。

c;main(a,b)char**b;{if(a==2&&isalpha(**++b)&&!(c=1[*b])||c==46&&!2[*b])for(;++a<28;)printf("%c%c",**b-=**b+6&31?-1:25,c?10:32);}

说明:

c;                   // Variable that will be used later
main(a,b)char**b;{   // There's one parameter => a = 2, b[1] = the parameter
                     // Wrong input checks: We want...
  if(
     a==2 &&         // 1 parameter and ...
     isalpha(**++b)  // lower- or uppercase letter as parameter,
                     // increase b so we can access it better
     &&              // and ...
     !(c=1[*b]) ||   //   either no further character,
                     //     save the character in c, or...
     (c==46&&!2[*b]) //   a dot as next character and no further characters
    )                // if check succeeded, execute the for loop, else do nothing
  for(;++a<28;)      // This will loop 26 times (2..27)
    printf("%c%c",   // Print two characters
                     // First character to print:
      **b            // We'll print the first character of the parameter,
       -=            // but decrement it before printing
       **b+6&31?     // if the last five bits (31 = 11111b) are not 26 (6 == -26 mod 32)
        -1           //   decrement it by -1 (aka increment it)
        :25,         //   else (char=z/Z) decrement by 25, so we start over at a/A
                     // Second character to print:
      c?             // c is either ASCII 0 or a dot (ASCII 46)
       10            //   dot     -> print a newline
       :32);         //   ASCII 0 -> print a space (ASCII 32)
}

**b+6&31部分使用以下事实:如果仅查看最后5位,其余5位在1..26范围内,则小写/大写字符的ASCII码相同。

没有“错误输入”要求的版本(82个字符):

main(a,b)char**b;{for(b++;++a<28;)printf("%c%c",**b-=**b+6&31?-1:25,1[*b]?10:32);}

关于如何编译的任何说明?运行时出现细分错误。
manatwork,2012年

@manatwork似乎将输入作为参数。
shiona 2012年

是的,的确可以编辑以澄清。例如,如果程序名称为test,则称呼它为test ctest X.
schnaader 2012年

谢谢,明白了。我的C语言似乎比我想象的要生锈。
manatwork,2012年

2
K&R定义样式可以帮助:main(a,b)char**b;{。同样,b++您可以替换*b[1]-> **bb[1][1]-> 1[*b]
ugoren

7

Ruby,72 71 61个字符

gets;25.times{$><<$_=$_.succ[0]+=$1?$/:' '}if~/^[a-z](\.)?$/i

红宝石版本使用正则表达式来验证输入。幸运的是,Ruby字符串方法succ为我们完成了大部分工作(包括环绕)。

编辑:chronVentero的帮助下61个字符。


我的结局与您的结局太相似,以至于无法单独发帖。相同的方法,但短一些字符(65):c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Paul Prestidge 2012年

2
这是62:gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i-与您所滥用的基本相同,$_以及$/
Paul Prestidge 2012年

2
@chron:使用+=代替+,您可以在周围加上括号$1?$/:' '
Ventero

@chron和Ventero:谢谢。将您的代码添加到我的解决方案中。
霍华德

6

Ruby:127 113 92(?)个字符

(我找不到关于使用罚款分数的规则-p。目前添加了1。如果有误,请纠正我。)

$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end

样品运行:

bash-4.2$ ruby -pe '$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end' <<< c
d e f g h i j k l m n o p q r s t u v w x y z a b

bash-4.2$ ruby -pe '$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end' <<< H.
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
A
B
C
D
E
F
G

bash-4.2$ ruby -pe '$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end' <<< seven

6

红宝石,101 95

i,d=gets.split''
[*?a..?z].join[/#{i}/i]
($'+$`).chars{|c|$><<(i>?Z?c:c.upcase)+(d==?.?$/:' ')}

在线尝试


不遵循“如果将错误的输入发送到程序,它将不会打印任何内容。”
马特

可以用('a'..'z').to_a=> 保存一些字符[*?a..?z]
Paul Prestidge 2012年

@chron谢谢!我怎么会错过呢..
2012年

6

GolfScript,80 72个字符

.).46={;)}*25,{65+.32+}%?)\""=*!!\([{)..31&26-!26*-}25*;]n+\"."=n" "if**

许多代码正在测试有效输入和“不打印”选项。实际逻辑仅为37个字符。

在线测试用例


6

q / k4 66 64 63 60 58 56 + 2罚

全局变量init的惩罚,算法为56,如下所示:

56:

if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]

58:

if[&/x in".",l:(a;A)90>*x;1@/(1_,/|_[0,l?x;l]),'"  \n"@#x]
  • 从if-else更改为if允许重新组织代码并摆脱“;” 在最后

60:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'"  \n"@#x;
  • 最终摆脱了这份多余的支票

63:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x; 
  • 递归打印字符而不是整个对象
  • 仍然无法摆脱“。”中的身份比较x。在两个地方... :(
  • 最后需要用分号,否则打印功能(1 @)会将其返回值打印到stdout。...该死

64:

2@,/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x;  

编辑:

全局初始化(x :)增加了2的罚款,如果将函数包装到方括号中(如slackware建议的),则相同(
不确定更改名称空间是否也应受到惩罚)...然后是另外3

(.Q`a`A) instead of (a;A)

例:

q)\         - switch interpreter to k4
 \d .Q     - change to native namespace
  x:"c"
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]
d e f g h i j k l m n o p q r s t u v w x y z a b

  x:"@"
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]    
  x:"H."
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
A
B
C
D
E
F
G
  x:...

+1进展顺利。现在,我将尝试寻找另一种缩短代码的方法。
克里斯蒂安·卢帕斯库

如果它在qk中使用定义,它真的可以称为有效k吗?;-)此外,如果将其包装在函数中,则可以跳过x:“ a”设置步骤,例如{$ [...]}
skeevey 2012年

@slackwear你是对的,这就是为什么它被称为q / k4 ;-)。
2012年

6

Perl,131 127 117 112 106 104 102 98 96 92 91 90 93 71 66 65 64 58个字符

s!^([a-z])(\.?)$!print chop,$2?$/:$"for($1..az)[1..25]!ie

用法:

perl -ne 's!^([a-z])(\.?)$!print chop,$2?$/:$"for($1..az)[1..25]!ie'

n选项的计数已添加一个字符。

仅因为看到乔恩·普迪(Jon Purdy)的答案++on字符的行为,才可能进行最大的剪切。


您可以删除最后2个分号来删除几个字符
ardnew

@ardnew谢谢。:-)
Gareth

1
这件事令人印象深刻

@bua谢谢,我仍在尝试查找字符,以便我可以抓住你和我。:-)
Gareth 2012年

s/a.$1/az/多保存2个。chop().($2?$/:$")->还有chop,$2?$/:$"4个
暴民

5

Perl中,149,167

更新资料

  • 添加了健全性检查。
  • 提出了有关分离器应用的新建议。
exit if $ARGV[0] !~ /[a-z]\.?/i;    # sanity check input
($x,$d)=split //,$ARGV[0];          # split input arguments
@l=65..90;                          # define uc letter range
push @l,splice @l,0,ord(uc $x)-64;  # rotate letter range
pop @l;                             # remove the argument letter
print join $d?$/:$",                # print the joined list
  map {ord($x)>90?lc chr:chr} @l;   # map chr and lc as appropriate

您可以替换为$s=($d)?"\n":" ";$s=$d?$/:$";甚至可以$s完全摆脱它
ardnew,2012年

4

Python,83岁

r=raw_input()
i=ord(r[0])
exec"i+=1-26*(i%%32>25);print chr(i)%s;"%","["."in r:]*26

我不是这个限制的支持者,但是它存在并且您的程序没有遵循该限制:“如果将错误的输入发送到程序,它将不会打印任何内容。”
马特2012年

另外,看起来您打印的字符比应打印的多。示例输出为25个字符。
马特

4

PHP, 120 119 113

<?$v=fgets(STDIN);$f=$c=$v[0];ctype_alpha($c++)||die;for(;$c[0]!=$f;$c=$c[0],$c++)echo$c[0],$v[1]=='.'?"\n":" ";

1
这是一个代码挑战,因此不需要速度和资源使用优化。与其将$v[1]=='.'?"\n":" "结果存储在变量$ s中,不如让PHP在echo语句中每次对其进行计算。这样,您可以保留6个字符。
manatwork,2012年

1
@manatwork谢谢,我更改了它。
lortabac

4

数学158 159 204 199 183 167 165 162

f@h_ := Most@RotateLeft[#, Position[#, h][[1, 1]]] &[FromCharacterCode /@ 
        (65~Range~90 + 32 Boole@LowerCaseQ@h)];
g = Characters@# /. {{p_} :> Row[f@p, " "], {p_, "."} :> Column@f@p, _ -> ""} &

用法

g["c"]
g["H"]
g["H."]
g["seven"]

用法


第三种用法是f [“ H”]或f [“ H。”]?
阿威罗伊

我必须修复“。”的处理,将50个字符添加到代码中。但是,现在它可以按照指示运行了
DavidC

3

J 43

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0

例子:

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 's'

tuvwxyzabcdefghijklmn opqr

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 's.'

t
u
v
w
x
y
z
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 '['

该解决方案在J编程论坛上得到了发展:http : //jsoftware.com/pipermail/programming/2012-August/029072.html

作者:AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlock泰勒·泰勒

说明

J词组从右边开始执行,将进行中的结果传递给左边时进行评估。由于它是交互式的,因此我们可以单独查看解决方案的各个部分,以更好地理解它们。

中间部分生成Unicode中的大小写字母:

   u:,2#65 97+/i.26
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

“ u:”动词将其数字右参数转换为Unicode字符。通过将分别为“ A”和“ a”的数字添加到由“ i.26”生成的从0到25的值,从大写和小写字符的ASCII值生成数字参数:

   65 97+/i.26
65 66 67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

右侧部分

   ((>:@i.}.[)])"0

查找(i。)右侧参数(])在左侧([)的位置-这是上方字母的向量-的位置,然后比该数字多(>:)下降(}。)。“ 0”将此短语应用于0维(标量)参数。

   ('123H999' (>:@i.}.[)])"0 'H'
999

“ 25 {。”短语采用右侧向量的前25个元素。

左侧倒数第二个短语“ 1j1#”根据左侧数字复制其右侧参数。一个简单的数字可以做一个简单的复制:

   2 # 'ABCD'
AABBCCDD

但是,在实部和虚部之间用“ j”表示的复数会根据虚部插入填充元素。在这里,我们在“ j”右边的一个指示一个填充元素。

   2j1 # 'ABCD'
AA BB CC DD 

与大多数J基元一样,复制动词(#)在数字数组上的工作方式与在字符数组上的工作方式类似。如图所示

   1j1 # 1 2 3
1 0 2 0 3 0

我们看到默认的数字填充元素为零,而对于字符,则为空格字符。

最后,最左边的标记“ |:”将前面动词的结果转置到右边。

Devon McCormick提供的解释。谢谢德文郡。


+1非常好的解决方案和解释。我考虑过在J中进行尝试,但无法找到一种方法(简短的方法)来检查输入是否有效。我认为我的时间至少是这个时间的两倍。
Gareth 2012年

谢谢Gareth,如果您在讨论链接中查看早期解决方案,您会发现我们的许多起步时间更长。我们发现的一件整洁的事情是,我们可以与J.干杯一起使用的各种方法,鲍勃
鲍勃·瑟里奥

3

脑干,303

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

当前它不支持该If wrong input is send to the program it will not print anything部件,并且可能会更短。我计划稍后再修复。现在,我的大脑太发达了,无法继续。


2

C,110

有时在字母之间打印“空格”,有时不打印。

i,j;main(int c,char*l){gets(l);l[1]&=10;j=*l%32;c=*l&~31;for(i=j;i<j+25;i++){l[0]=c+i%26+1;printf("%2s",l);}}

更具可读性:

i,j;
main(int c,char*l)
{
  gets(l);
  l[1]&=10;          // makes . to line feed and some other chars to "start of text" 
                     // which looks like space in some cases 
                     // (the byte can become either 0, 2, 8 or 10)

  j=*l%32;           // 0b 000c cccc, these five bits code which letter was chosen
  c=*l&~31;          // 0b ccc0 0000, these three bits code upper/lowercase

                     // 0b ccc0 0000 + (0b 000c cccc + [0..24])%26 + 1
  for(i=j;i<j+25;i++){l[0]=c+i%26+1;printf("%2s",l);}
}

运行:

$ ./a.out
G
 H I J K L M N O P Q R S T U V W X Y Z A B C D E F

$ ./a.out
p.
q
r
s
t
u
v
w
x
y
z
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o

2

JavaScript 137

不幸的是有点冗长(String.fromCharCodecharCodeAt)。

for(x=b=(n=prompt(m={122:97,90:65})).charCodeAt(r='');/^[a-z]\.?$/i.test(n)&&(x=m[x]||x+1)!=b;)r+=String.fromCharCode(x)+(n[1]?"\n":" ");

2

Perl, 77 76 70 68

chomp(($a,$b)=split//,<>);$"=$/if$b;map{++$a=~/(.)$/}1..25;print"@a"

编辑:

  1. 使用regex而不是来保存字符substr

  2. 使用map代替保存了6个字符for

  3. 省略最后的换行符,节省了2个字符。


3
很好,但是正如您所指出的那样,它不满足无效输入不提供任何输出的要求。解决这个问题,您会得到我的支持。
Gareth 2012年

在perl 5.14.2上似乎不适用于我。我也不相信\n您的决赛print是必需的,这样可以节省几个字符
ardnew 2012年

@ardnew:我在具有5.12.3的工作计算机上编写了它。将杀死\n,谢谢。
乔恩·普迪

2

R,219

丑陋,长...仍然有效。

f=function(l){if(!nchar(l)%in%c(1,2))invisible()else{s=ifelse(nchar(l)==1," ","\n");l=substr(l,1,1);v=letters;if(l%in%v){}else v=LETTERS;l=grep(l,v);if(l==26)cat(v[1:25],sep=s)else cat(c(v[l+1:(26-l)],v[1:l-1]),sep=s)}}

用法:

f("a")
f("c.")
f("H")
f("z")
f("Z.")
f("seven")

2

C,146个字符(可怕)

main(){char b[100];gets(b);for(char a=b[0],c=a,d=a&223,e=b[1];++c!=a&64<d&d<91&(!e|e==46&!b[2]);(c&31)>26?(c&=96):(putchar(c),putchar(e?10:32)));}

我对C的经验不是很丰富,这可能表明...>。不过,我将尝试留在这里,随时提出改进建议。

未缩小版本:

main() {
  char b[999]; // assume that the line will fit in 999 chars...
  gets(b);

  // a is the char we start on, c is the char that we iterate,
  // d is toUppercase(a), e is just an alias for the second char.
  for (char a = b[0], c = a, d = a&223, e=b[1];
      // increment c, make sure that we haven't reached a yet.
      // also check the other conditions (first char is letter, second char
      // is either '.' or NULL, third char is NULL if second char was '.').
      ++c != a & 64 < d & d < 91 & (!e | e == 46 & !b[2]);
      (c&31) > 26     // check if we need to wrap around
        ? (c &= 96)   // if so, wrap
        : (putchar(c), putchar(e?10:32))  // otherwise, print char & separator
  );
}

2

VBA 225

设置为从立即窗口运行:

s=InputBox(""):n=Asc(Left(s,1)):l=Len(s):p=IIf(l<3,IIf(l=2,IIf(Right(s,1)=".",vbCr,"")," "),""):c=IIf(n>64 And n<91,65,IIf(n>96 And n<123,97,99)):o=n-c+1:If o>0 And p<>"" Then For i=o To o+24:x=x & Chr(i Mod 26+c) & p:Next:?x

分解为单独的行(需要用Sub块包围,并且需要print在模块中使用不同的方法来工作,从而使代码更长):

s=InputBox("")
n=Asc(Left(s,1))
l=Len(s)
p=IIf(l<3,IIf(l=2,IIf(Right(s,1)=".",vbCr,"")," "),"")    
c=IIf(n>64 And n<91,65,IIf(n>96 And n<123,97,99))
o=n-c+1
If o>0 And p<>"" Then 
For i=o To o+24
x=x & Chr(i Mod 26+c) & p
Next
End If 'Not needed when completed in single line format
MsgBox x

2

Java 8,127字节

a->{String r="",d=a.length>1?"\n":" ";char c=a[0],C=c;for(;++c<(c<97?91:123);r+=c+d);for(c=C<97?64:'`';++c<C;r+=c+d);return r;}

说明:

在线尝试。

a->{                        // Method with character-array parameter and String return-type
  String r="",              //  Result-String, starting empty
         d=a.length>1?      //  If the length of the input is larger than 1
            "\n"            //   Set the delimiter to a new-line
           :                //  Else:
            " ";            //   Set the delimiter to a space
  char c=a[0],              //  Get the input letter
       C=c;                 //  And create a copy of it
  for(;++c<(c<97?91:123);   //  Loop from this letter + 1 to (and including) 'Z'/'z'
    r+=c+d);                //   And append the result with a letter + the delimiter
  for(c=C<97?64:'`';++c<C;  //  Loop again from 'A'/'a' to (and excluding) the input-letter
    r+=c+d);                //   And append the result with a letter + the delimiter
  return r;}                //  Return the result

1

腮腺炎,91868279,76

r t i t?1A.1"." s a=$A(t),p=a>90*32+65 f i=1:1:25 w *(a+i-p#26+p) w:t["." !

并不是这样的现代语言;)我敢肯定还有一些优化空间。

说明:

r t 

读取输入

i t?1A.1"."

检查t是否与所需输入匹配

s a=$A(t),p=a>90*32+65 f i=1:1:25 { w *(a+i-p#26+p) w:t["." !}

基本的for循环通过字母表。请注意,腮腺炎从左到右严格评估。True = 1,因此p的结果为65或97,#是取模运算符

测试:

USER>d ^golf
d.e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
a
b
c

USER>d ^golf
tuvwxyzabcdefghijklmnopqrs
USER>d ^golf
h.i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
a
b
c
d
e
f
g

USER>d ^golf
hallo
USER>

(您需要一个腮腺炎运行时环境,即Caché来运行它)

编辑:大胆的标题

编辑:有一个错误的解决方案,现在修复。感谢rtfs和Averroees指出了这一点


该代码的长度似乎是79个字符,而不是80个字符
Cristian Lupascu,2012年

不幸的是,第一个空间是不可选的,所以我想我有算吧。
kazamatzuri

测试用例不会以作为参数传递的那个用例的开头字母结尾,对吗?
Averroes 2012年

1

的JavaScript:141

c="",b=c[0].charCodeAt()<91,a="abcdefghijklmnopqrstuvwxyz",b&&(a=a.toUpperCase()),a=a.split(c[0]),a=a[1]+a[0],a=c[1]?a.split("").join("\n"):a

评论版本:

c="", //write input here (examples "a", "B", "c.", "D.")
b=c[0].charCodeAt()<91, //true for upperC, false for lowerC
a="abcdefghijklmnopqrstuvwxyz", //the abc
b&&(a=a.toUpperCase()), //if upper, turn main string to upperC
a=a.split(c[0]), //split by the first char of input
a=a[1]+a[0], //swap the two parts
a=c[1]?a.split("").join("\n"):a //if input second char, add breaklines in between
//the output is inside 'a'

jsFiddle演示


0

这是我第一次尝试使用APL。

⍞{1 1≡(2⌈⍴⍺)⍴⍺∊'.',⍵:⊃(~=/2⍴⍺)⌷(,X,' ')(X←25 1⍴1↓(X⍳⊃⍺)⌽X←(⎕A∊⍨⊃⍺)⌷2 26⍴⍵)}6↓26⌽⎕UCS 65+⍳58

如果我可以使用单个全局变量,A←2 26⍴6↓26⌽⎕UCS 65+⍳58则可以将以上内容简化为以下内容:

{1 1≡(2⌈⍴⍵)⍴⍵∊'.',,A:⊃(~=/2⍴⍵)⌷(,X,' ')(X←25 1⍴1↓(X⍳⊃⍵)⌽X←(⎕A∊⍨⊃⍵)⌷A)}⍞

0

C ++ 11

#include <iostream>
#include <vector>
#include <cstdio>

int main(int argc, const char * argv[])
{
    std::vector<char> list1,list2;
    for( char c = 'a'; c <='z'; c++ )
    {
        list1.push_back( c );
        list2.push_back( toupper( c ) );
    }
    char c = getchar();
    auto f = [ c ]( std::vector<char> list )
    {
        auto i = std::find( list.begin(), list.end(), c );
        if( i == list.end() )
            return;
        auto c = i;
        for( ;; )
        {
            c++;
            if( c == list.end() ) c = list.begin();
            if( c == i )break;
            std::cout<<*c<<"\n";
        }
    };
    f( list1 );f(list2);
    return 0;
}

0

C(111)

main(int i, char**c){if(isalpha(*c[1]))for(i=0;i<25;i++) printf("%c",isalpha((*c[1])+1)?++*c[1]:(*c[1]-=25));}

解剖

if(isalpha(*c[1])) // start with char-check.

for(i=0;i<25;i++) // we need 25 values, excluding input char. reusing i.

printf("%c", // print char. ofcourse.

isalpha((*c[1])+1) ? ++*c[1] : (*c[1]-=25)); 
//check if we are past z/Z and fall back to a/A. 
//make that available to print. 

Works] $ ./test 5

Works] $ ./test W XYZABCDEFGHIJKLMNOPQRSTUV

作品] $ ./test M NOPQRSTUVWXYZABCDEFGHIJKL

作品] $ ./test g hijklmnopqrstuvwxyzabcdef

作品] $ ./test [

Works] $ ./test a bcdefghijklmnopqrstuvwxyz

Works] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY


谢谢您的思考。


如果不是“。”,则无需添加换行符。给出。另外,[A-Za-z]\.?如果我理解的是正确的问题,那么如果输入的不是,则不应输出任何内容。
marinus 2012年

#1 哦!我全神贯注于使代码简短。.#2。看到'test ['的输出,它什么也不打印。@marinus
essbeev 2012年

0

Perl,226个字符

die "Invalid input " if $ARGV[0] !~ /[a-z]\.?/i;
@listA=(a...z);
$index=ord(lc(substr($ARGV[0],0,1)))-97;
print join(substr($ARGV[0],1) ? "\n" : " ",map{$ARGV[0] =~ /[A-Z]/?uc $_:$_}(@listA[$index+1...25],@listA[0...$index]));

您可以设置文本格式以显示为代码块。在此处阅读指南以设置帖子格式。另外,您可以使用单个字符变量名称来保存一些字符。
Gareth 2012年

1
无效的输入应不会显示任何内容,因此die可以减少您的陈述,从而节省
大量资金

0

C#170

using System.Linq;namespace N{class P{static void Main(string[]a){foreach(char e in"abcdefghijklmnopqrstuvwxyz".ToCharArray().Where(o =>o>'c'))System.Console.Write(e);}}}

未压缩

using System.Linq;
namespace N {
    class P {
        static void Main(string[]a){
            foreach (char e in "abcdefghijklmnopqrstuvwxyz".ToCharArray().Where(o => o > 'c'))
                System.Console.Write(e);
        }
    }
}

不要忘了在回答中添加解释。
贾斯汀

该程序到目前为止还没有尝试遵守规则。1:如果字母是大写字母,则必须以大写字母显示。2:打印的字母必须以所插入字母的开头字母结尾。3:如果将附加参数添加到输入(一个简单的点。),则该字母应在每行中打印一个字母。否则,应将字母打印在同一行中,并用一个简单的空格分隔。4:如果将错误的输入发送到程序,它将不会打印任何内容。这是4分之4的失误。
RobIII

^除此之外,我敦促您在这里查看我之前的评论。您可以替换charvar和刮脸1点你的分数的,松散的.ToCharArray()(一个string 一个字符数组,你已经可以叠代!),失去了string[] a,因为你不处理命令行参数,失去了命名空间,你的常量“C”应该从控制台输入中读取,丢失字母字符串并改用ASCII等。您的演奏很棒,但是请尽力而为。您提交的大多数意见书似乎只是在拖钓。
罗布三世


0

重击:110个字节

(([[ $1 =~ [a-z] ]]&&echo {a..z})||([[ $1 =~ [A-Z] ]]&&echo {A..Z}))|([ "${1:1:1}" = . ]&&sed 's/ /\n/g'||cat)

就解释而言,这非常简单,没有魔术-这只是bash本质上很适合的事情。就非显而易见的位而言:

  • {a..z}bash是bash中一个未被充分利用的技巧-它扩展到a b c d...。您可以执行相同的操作来生成数字序列。
  • Bash可以进行正则表达式匹配,[[ $1 =~ [a-z] ]]对第一个程序参数针对从a到z的字符运行正则表达式匹配。AZ也是如此。您需要为此使用双方括号,但[不能这样做。
  • ${1:1:1}得到一个$ 1的子字符串(第一个参数),一个字符,一个字符长-也就是说,它返回字符串的第二个字符,即我们期望的.
  • sed 's/ /\n/g'简单的正则表达式:搜索并用换行符替换空格。如果.是字符串的第二个字符,我们将输入通过管道传递给该字符串,否则...
  • cat 这是这里的最后一个技巧-如果我们不想用换行符替换空格,我们将stdin喂给cat,而cat只会再次输出它。

不要忘记添加说明。
贾斯汀
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.