代码高尔夫:转发sdrawkcaB sdrawkcaB转发转发sdrawkcaB


14

任务

  • 用户输入一个句子-仅单词。除字母或空格外的任何输入(包括整数和标点符号)都应引发异常:“句子只能使用字母”。
  • 输出具有一种模式,其中某些单词是反向的,而其他单词是正常的。
  • 模式从正常单词开始,接下来的两个单词反转,然后接下来的两个单词正常,模式继续。
  • 以下是单词应为正常位置和单词经反转位置的示例:

正常-反转-反转-正常-正常-反转-反转-正常...

输入范例

她在海边卖贝壳

输出范例

她在海岸边偷走贝壳

附加规则

  • 如果使用大写字母,则它们应保留在最初张贴的字母上。
  • 最初在输入上发布的任何多个空格都应减少为一个空格。例如Programming Puzzles and Code Golf变成Programming selzzuP dna Code Golf

最短的代码胜出!!

祝您编程愉快...


8
许多编程语言都没有例外。
门把手

15
@nimi出于这种琐碎的原因,似乎完全没有必要将挑战仅限于一小部分语言。
门把手

10
这个原本不错的挑战被规则破坏了,Any input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".这意味着要执行一个与单词反转完全无关的次要任务,切掉没有异常的语言,并且需要对很多字符串进行硬编码或压缩,字节数。
xnor 2015年

2
@Belfield是的,我看到您的约束。我想您现在无能为力了。以后,请尝试在沙盒中进行发布以获取反馈,然后再进行发布。
xnor

3
@Belfield,一个好的挑战比一个好的答案要困难得多。无论如何我都喜欢,而下一个会更好。
edc65

Answers:


15

TeaScript,55个字节58 60 69 76 78 80 87 89

xO`a-z `?xl(#~-i&2?l:lv(),/ +/):Ld`SÀZn­ Û § «e Ò5s`

非常短,我对此非常满意。

最后的〜20个字符可能看起来有些乱七八糟,但这是“句子只能使用字母”编码。所有字符的字符代码均低于256,因此每个字符均为一个字节

说明

xO`a-z `?  // If input contains only a-z and space...

   xl(#       // Loop through input 
      ~-i&2?  // If (index - 1 "unary and"ed with 2) isn't 0...
          :l,     // Leave alone
          lv()    // Otherwise, reverse string
       / +/ // Loops on spaces
   )

:Ld`SÀZn­ Û § «e Ò5s` // Otherwise... decompress and print  the error string

感谢您发布测试-非常好。遇到错误时,每个人都在同一条船上-禁止打那条线
Belfield 2015年

奇怪,现在可以在Firefox中使用。但是我之前也使用过Firefox。
2015年

到目前为止最好的答案!
贝尔菲尔德

什么?你击败了Pyth ?!使用基于JS的语言吗?!这怎么可能呢?!?!
ETHproductions 2015年

2
@ETHproductions只要丹尼斯不参加比赛,您就可以永远赢:p
Downgoat 2015年

4

Haskell,141个字节

r=reverse
f x|all(`elem`(' ':['a'..'z']++['A'..'Z']))x=unwords$zipWith($)(cycle[id,r,r,id])$words x|1<2=error"Sentence must only use letters"

几乎2/3的代码用于错误检查。似乎是第一个现实世界的挑战。

通过unwords$zipWith($)(cycle[id,reverse,reverse,id])$words x将输入拆分为单词列表,并使用循环功能列表将其压缩来完成工作。[id,reverse,reverse,id,id,reverse...]然后将结果与空格连接回单个字符串,完成工作。

感谢@Christian Irwan提供2个字节。


可以将“句子只能使用用户字母”更改为“句子只能使用字母”-我的错误很严重!
Belfield

@Belfield:固定
NIMI

为什么不r=reverse呢?
Akangka

@ChristianIrwan:谢谢!(在早期版本中,我有一个没有名称的无点功能,因此由于缺少它,所以使用了两次reverse并且r=reverse具有相同的长度。由于f=移至非无点状态,因此不再进行检查)。
nimi 2015年

3

JavaScript(ES6)122

f=s=>/[^a-z ]/i.test(s)?"Sentence must only use letters":s.split(/ +/).map((w,i)=>~-i&2?w:[...w].reverse().join``).join` `

alert(f(prompt('?','She sells Sea shells on the Sea shore')))


当输入中有换行符时,它会输出错误,例如,我认为应该不会发生这种情况
Downgoat 2015年

1
@Vɪʜᴀɴ这很棘手,该示例涉及多个空格,但是没有多个空格-只有1个换行符。我认为它是由SO编辑破坏的。如果我们必须管理换行符和其他通用空间,则字节数增加2
edc65

2

视网膜,103字节

\s+

(?<=^\S+ (\S+ )?((\S+ ){4})*)
;
+`(;\S*)(\S)
$2$1
;

i`.*[^a-z ].*
Sentence must only use letters

第二行应该有一个空格,SE似乎正在吞噬它。从带有-s标志的单个文件运行代码。

视网膜没有例外的概念,因此Sentence must only use letters如果输入中包含非字母的非空白字符,则将输出替换为。



2

Python中,163 160 157 145

k=raw_input()
k=["Sentence tsum ylno use letters",k][k.replace(' ','').isalpha()]
for i,x in enumerate(k.split()):print x[::-1if(i+1)/2%2else 1],

删除了15个字符,谢谢Mego


是的,怕妮米有意思……
Belfield

射击,我错过了。我会修改它。
2015年

@Mego,如果未找到结果,则re.search返回None(不能用作索引),并且添加“!= None”实际上比我的原始方法长一个字节。我通过合并最后两行节省了3个字节。谢谢!
驼鹿2015年

1

Bash + coreutils,108

[ ${@//[a-zA-Z]/} ]&&echo Sentence must only use letters||for t;{
((++i/2%2))&&rev<<<$t||echo $t
}|tr \\n \ 

该程序的最后一个字符是空格。

输入来自命令行:

$ ./norrevvevnor.sh Programming Puzzles and Code$'\n' Golf
Programming selzzuP dna Code Golf $ 
$ ./norrevvevnor.sh Programming Puzzles and Code$'\n' Golf1
Sentence must only use letters
$ 

1

佩斯,72

=zflTc?:z"[^A-Za-z ]"0"Sentence tsum ylno use letters"zdjd.e?%/hk2 2_bbz

没有击败其他Pyth答案,但是我已经花了一些时间编写它。基本上,这是我的Python答案的翻译。

在线尝试


1

朱莉娅109字节

s->(i=0;join([isalpha(w)?(i+=1)%4>1?reverse(w):w:error("Sentence must only use letters")for w=split(s)]," "))

i=0(i+=1)%4>1用于确定每个单词是否为reversed。isalpha适用于拆分后split(s)用来确定是否存在不是字母的字符的单词(到此为止,空格已被删除)。join除非error引发,否则将在操作后恢复字符串。


1

利亚,150个 134字节

s->ismatch(r"[^a-z ]"i,s)?error("Sentence must only use letters"):(i=3;join([(i+=1;isodd((i+1)i÷2)?reverse(w):w)for w=split(s)]," "))

取消高尔夫:

function f(s::AbstractString)
    if ismatch(r"[^a-z ]"i, s)
        error("Sentence must only use letters")
    else
        i = 3
        a = [(i += 3; isodd((i + 1)i ÷ 2) ? reverse(w) : w) for w = split(s)]
        return join(a, " ")
    end
end

感谢Glen O,节省了16个字节!


首先,我是否建议反转初始条件的逻辑并将r其赋值为结果?也就是说,r=ismatch(...)||error(...)-将删除一些字符,并反转使用的条件r。我怀疑还会再省些钱
Glen O

较小的修正-我不得不||处理否定,然后意识到否定是不必要的。反转回&&。甚至更好,使用?:代替来做得更好。s->(r=ismatch(r"[^a-z ]"i,s))?error("Sentence must only use letters"):join([(iseven(i)&&(r=!r);r?reverse(w):w)for(i,w)=enumerate(split(s))]," ")144个字节。而且我认为我可以做得更好join……
Glen O

这是您的解决方案的简化版本,具有134个字节:s->ismatch(r"[^a-z ]"i,s)?error("Sentence must only use letters"):(i=3;join([(i+=1;isodd((i+1)i÷2)?reverse(w):w)for w=split(s)]," "))
Glen O

@GlenO很棒的建议,谢谢!
Alex A.

0

Pyth,55个字节

?--rz0Gd"Sentence must only use letters"jd.e_W%%k4 3bcz

%%k4 3从Pietu1998 借了一点。保存了一个额外的字节。

在线尝试:演示测试套件

说明

?--rz0Gd"..."jd.e_W%%k4 3bcz   implicit: z = input string
   rz0                         convert z to lower-case
  -   G                        remove all letters
 -     d                       remove all spaces
?                              if there is some chars left than
        "..."                    print the string "Sentence must only ..."
                               else:
                          cz     split z by spaces or multiple spaces
               .e                map each pair (k index, b string) of ^ to: 
                 _       b          b or reversed of b, depending on
                  W%%k4 3           (k mod 4) mod 3
             jd                  join the result by spaces


0

Java,215个字节

正则表达式很有趣

s->{if(s.split("[^a-zA-Z ]").length>1)throw new Error("Sentence must only contains letters");else{int i=1;for(String a:s.split(" "))System.out.print((i++%2<1?new StringBuffer(a).reverse():a)+(a.isEmpty()?"":" "));}}

在线尝试!


您的输出当前不正确。现在She slles aeS shells no the aeS shore,您输出,但是应该She slles aeS shells on eht aeS shore改为(首先正常;然后每2对反向交替或不反向)。这有两个问题。现在,i即使项目为空,您也i++%2<1应该增加,而应该增加i++%4>1这里是一个固定的211字节版本。
凯文·克鲁伊森

@KevinCruijssen这就是我没有仔细阅读而得到的
本杰明·厄克特

0

果冻,39个字节

³Ḳ¹ƇUJ2&TƲ¦K
“*[,ṛDṾȧƤ°Ġṛ©¦»
ØẠ” ṭ³eƇ⁼£

在线尝试!

感谢外长者埃里克(Erik)。他从一些多余的字节和许多小时的沮丧中拯救了我。

这是一个46字节的解决方案

当输入包含无效字符时,实际上会引发python语法错误。

³Ḳ¹ƇUJ2&TƲ¦K
“çỤḷṁŀDṀẠṠGmḟĖƲƑ⁽Ḳḟ»ŒV
ØẠ” ṭ³eƇ⁼£

在线尝试!


0

Japt v2.0a0,41 -S个字节

¸¬è\L ?`SÀZn­ Û § «e Ò5s`:UeS²S ¸ËzEc2

尝试一下

¸¬è\L ?`...`:UeS²S ¸ËzEc2     :Implicit input of string U
¸                             :Split on spaces
 ¬                            :Join
  è                           :Count occurrences of
   \L                         :RegEx /[^A-Z]/gi
      ?`...`:                 :If truthy return the compressed string "Sentence must only use letters", else
             Ue               :Recursively replace in U
               S²S            :  Two spaces with one
                   ¸          :Split on spaces
                    Ë         :Map each element at 0-based index E
                     z        :  Rotate clockwise by 90 degrees multiplied by
                      Ec2     :    E rounded up to the nearest multiple of 2
                              :Implicit output, joined with spaces

0

05AB1E,36 个字节

ðKDáÊi“¸–ƒ—€É€Å™ê“.ªFë#áεN4%>2÷iR]ðý

在线尝试。

当输入不仅包含时,将引发以下错误[A-Za-z ]

(RuntimeError)无法转换句子只能使用字母转换为整数。

说明:

ðK                   # Remove all spaces from the (implicit) input-string
  Dá                 # Create a copy, and remove everything except for letters from this copy
    Êi               # If the copy with letters removed and the original are NOT equal:
      “¸–ƒ—€É€Å™ê“   #  Push dictionary string "sentence must only use letters"
                   #  With sentence capitalization
      F              #  And try to loop that many times, causing the error above
     ë               # Else:
      #              #  Split the (implicit) input-string on spaces
       á             #  Only keep letters (which will remove empty items caused by multiple
                     #  adjacent spaces in the input, which is shorter than `õK`)
        ε            #  Map each word to:
         N4%>2÷      #   Calculate ((index modulo-4) + 1) integer-divided by 2
                     #   (results in 0,1,1,2,0,1,1,2,0,1 for indices 0,1,2,3,4,5,6,7,8,9)
               i     #   If this is exactly 1:
                R    #    Reverse the current word
     ]               # Close the if-statement, map, and if-else statement
      ðý             # Join the modified word-list by spaces
                     # (and then output it implicitly as result)

见我这个05AB1E尖端(部分如何使用字典?理解为什么“¸–ƒ—€É€Å™ê“"sentence must only use letters"


0

PHP,147字节

foreach(explode(' ',$argn)as$a){if(!ctype_alpha($a))throw new Exception('Sentence must only use letters');$o.=(++$i%4>1?strrev($a):$a).' ';}echo$o;

在线尝试!

或者如果 die()可以接受作为“例外”:

PHP,131字节

foreach(explode(' ',$argn)as$a){if(!ctype_alpha($a))die('Sentence must only use letters');$o.=(++$i%4>1?strrev($a):$a).' ';}echo$o;

在线尝试!

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.