像这样打印


17

编写一个程序,将输入输入到STDIN,并使2k-1第一个单词的所有小写​​字母(包括重音字母)都变为大写,而第一个单词的所有大写字母(也包括带重音字母)都变为2k小写(k是一个正整数)。该程序不应影响任何单词中的任何其他字符。例如,如果字符串为Ook! O0k!,则输出应为OOK! o0k!

当非空格字符后的空格数量非零时,将形成一个新单词。输入开头的空白应忽略。如果单词不包含任何更改的字符,程序仍应将其视为单词并继续。

样本输入(不同的输入用空白换行符分隔)

Nineteen Eighty-Four (1984)

Programming Puzzles & Code Golf   - 
Hooray for Code Golf Stack Exchange!

     2be or not 2be, that is the ~~~QuEsTiOn~~~

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

样本输出

NINETEEN eighty-four (1984)

PROGRAMMING puzzles & code GOLF   - 
HOORAY for CODE golf STACK exchange!

     2BE or NOT 2be, THAT is THE ~~~question~~~

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

这是代码高尔夫,伙计。适用标准CG规则。以字节为单位的最短程序获胜。


我敢肯定,我涵盖了所有有关空格和非字母字符的漏洞,但是如果我错过了任何漏洞,请告诉我。


感谢@Optimizer创建以下代码段。要使用,请单击“显示代码段”,滚动到底部,然后单击“►运行代码段”。


5
带有重音符号的字符呢?我们必须忽略那些吗?是否允许功能?
Downgoat

当我写问题时,我没有想到重音符号,但是我想他们会很重要。允许功能。
Arcturus

我们必须考虑哪些空格字符?我们可以假定非空白字符可以打印吗?
丹尼斯

所有空格字符,是的。
Arcturus

Answers:


4

Vim脚本,22 21字节

nm Q vEUWvEuWQ|norm Q

说明:

第一条命令映射Q到:

vEU使单词大写
W转到下一个单词
vEu使单词小写
W转到下一个单词
Q重复递归映射

|norm Q执行映射

该程序的用法

这是使Vim从stdin读取的方式:

$ vim - -c 'nm Q vEUWvEuWQ|norm Q'
Vim: Reading from stdin
This is the first line!
This is the second line!
This is the third and last line I type to check if this works!
^D

这将打开Vim显示以下内容:

THIS is THE first LINE.
this IS the SECOND line.
THIS is THE third AND last LINE i TYPE to CHECK if THIS works!
~
~
~

6

GNU sed,28岁

分数包括+2,用于-rz传递给GNU sed。

s/(\S+\s*)(\S*)/\U\1\L\2/g

测试输出

$ for t in 'Nineteen Eighty-Four (1984)' \
> 'Programming Puzzles & Code Golf   - 
> Hooray for Code Golf Stack Exchange!' \
> '     2be or not 2be, that is the ~~~QuEsTiOn~~~' \
> '++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.'; do
> echo "$t" | sed -zrf PRINTlikeTHIS.sed
> done
NINETEEN eighty-four (1984)
PROGRAMMING puzzles & code GOLF   - 
HOORAY for CODE golf STACK exchange!
     2BE or NOT 2be, THAT is THE ~~~question~~~
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
$ 

5

Perl,26个字节

25字节代码+ 1字节命令行

s/\S+/++$i%2?uc$&:lc$&/eg

感谢ThisSuitIsBlackNot修复了两个错误!

用法:

perl -p entry.pl

3

佩斯,23

jdmjbmrk=xZ!!kcdbcjb.zd

在线尝试或运行测试套件

pyth lowerupper函数之间的替代项,即r...0r...1。这可能会影响unicode字符,等待OP澄清更改。

我觉得有些东西一定可以打高尔夫球。特别是XOR,以更改应使用upper/ 的开关lower


如果我正确地解释了问题,则输入A\nB应打印A\nb
丹尼斯

那不是对该问题的正确解释。 A new word is formed when there is a nonzero amount of whitespace after a non-whitespace character.输出为A\nBIS A\NB。但是看来您的CJAM回答正确了。
Arcturus

@丹尼斯,谢谢,应该立即修复。
FryAmTheEggman

2

Perl,87个字节

在使用正则表达式固定了map一段时间之后,我无法提出一个优雅的解决方案,因此结果如下:

@a=split(" ",lc(<>));while($i<=$#a/2){@a[$i*2]=uc(@a[$i*2]);$i++;}print(join(" ", @a));

1
不错的解决方案。是否可以将<STDIN>替换为<>以节省一些字节?另外,可以跳过$ i = 0吗?
史蒂夫(Steve)2015年

@steve谢谢;是的,现在还包括一个小的修正(使用不同的输入对其进行了测试,并且它有一个小的错误)。感谢您的想法!我很习惯冗长而明确的编码:P
Codefun64

1
@ Codefun64欢迎来到PPCG!您可以跳过大多数括号来保存更多字节,因为它们在Perl中是可选的,例如。lc(<>),可能是,lc<>并且为您使用了一个语句修饰符,while例如,您也可以跳过括号。print$i++while$i<10while($i<10){print$i++}。有一个有用的页面,对我帮助了很多Perl高尔夫技巧
Dom Hastings

2

Ruby,56个字节

$><<gets.gsub(/\S+/){($.+=1)%2>0?$&.downcase: $&.upcase}

2

JavaScript ES6, 74 71个字节

.toUpperCase().toLowerCase()绝对宰杀字节数(添加32个字节0.o)。大多数变通办法最终都需要更多字节

s=>s.replace(/(\S+\s*)(\S*)/g,(_,a,b)=>a.toUpperCase()+b.toLowerCase())

1

Groovy中,108 125 120

System.in.eachLine{def b;it.split(" ").any{if(!it.empty)b=!b;print "${b?it.toUpperCase():it.toLowerCase()} "};println()}

不像我希望的那样干净,这似乎是我的Groovy答案的主题。

  • +17以领先的空格修复行为
  • -5删除尾随换行符并从.isEmpty()切换到.empty

 

$ cat tests.txt 
Nineteen Eighty-Four (1984)

Programming Puzzles & Code Golf   - 
Hooray for Code Golf Stack Exchange!

     2be or not 2be, that is the ~~~QuEsTiOn~~~

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
$ groovy PRINTlikeTHIS.groovy < tests.txt 
NINETEEN eighty-four (1984) 

PROGRAMMING puzzles & code GOLF   - 
HOORAY for CODE golf STACK exchange! 

     2BE or NOT 2be, THAT is THE ~~~question~~~ 

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

1

Lua,96个字节

i=0 print(io.read'*l':gsub('%S+',function(x)i=i+1 return i%2==1 and x:upper() or x:lower()end))

这将在输出后打印出一个数字。
Trebuchette 2015年

1

Python 3,103 95字节

print(' '.join(b.lower()if a%2 else b.upper()for a,b in enumerate(input().strip().split(' '))))

您可以将条件替换为[b.upper(),b.lower()][a%2]以保存4个字节(假设我在移动设备上正确计数)。
PurkkaKoodari 2015年

1

STATA,252个字节

insheet using a.b
g b=word(v,1)
gl c=0
forv x=1/`=_N'{
loc d=1
while b[`x']!=""{
if !$c replace v=subinword(v,b,upper(b),1) if `x'==_n
if $c replace v=subinword(v,b,lower(b),1) if `x'==_n
loc ++d
replace b=word(v,`d') if `x'==_n
gl c=1-$c
}
di v[`x']
}

预期输入为称为ab的csv文件(一列)

说明:

读取数据(默认变量名称为v1,可缩写为v)。使每行新变量b等于v的第一个单词(用空格分隔的标记)。对于每一行,当下一个单词不为空时(仅当该行上没有更多字符时才会发生),将v中的单词替换为当前行中该单词的大写或小写版本,具体取决于数量(mod 2 )的单词已经找到。然后得到下一个单词并重复。完成后打印出整行。


1

Delphi,290个字节

program P;uses SysUtils;var s:string;i:word;w:byte;f:boolean;begin repeat readln(s);w:=0;f:=false; for I:=1 to length(s) do begin if s[i]>' ' then begin if w=0 then f:=not f;w:=1;if f then s[i]:=uppercase(s[i])[1] else s[i]:=lowercase(s[i])[1] end else w:=0 end;writeln(s)until false;end.

并不是真正的好高尔夫语言...


欢迎来到编程难题和代码高尔夫球!
丹尼斯

1

Lua,88个字节

a=io.read():gsub("%g+",function(s)m=not m return m and s:upper()or s:lower()end)print(a)

1

CJam,28个字节

q{C' >Sc'!<*X^:XCelCeu?:S}fC

我目前正在考虑前33个ASCII / Unicode字符(仅那些)。我正在等待澄清,以了解这是否有效。

CJam解释器中在线尝试。



0

C#,104个 100 99字节

static void Main(){string.Join(" ","".Split(' ').Select((o,i)=>i++%2==0?o.ToUpper():o.ToLower()));}

这是79个字节

string.Join(" ","".Split(' ').Select((o,i)=>i++%2==0?o.ToUpper():o.ToLower()));
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.