正反感叹号和问号对


13

挑战

¡我们将给感叹和问号倒置的伙伴!

由于包含文本的句子结束于一体.?或者!,前置倒问号,¿以疑问句(句子结尾?)和反向的感叹号,¡以感叹句(截至句子!)。结尾的句子.将被忽略。

句子将由空格(空格,制表符和/或换行符)分隔,并且仅包含字母数字,逗号,撇号和空格。每个句子至少要有一个单词。确保每个句子的第一个单词都大写。输入可以以任何空格开头和结尾。

输入:

  Hello there!      What is your name?
My name is Ron. What's your name?
My name is Alex.  Nice to meet you!
Nice to meet you to!  How was your break?
It was great, I spent all my time code golfing!
What's that?
        Wow, you're such a n00b! Here, let me show you.

输出:

  ¡Hello there!      ¿What is your name?
My name is Ron. ¿What's your name?
My name is Alex.  ¡Nice to meet you!
¡Nice to meet you to!  ¿How was your break?
¡It was great, I spent all my time code golfing!
¿What's that?
        ¡Wow, you're such a n00b! Here, let me show you.

规则

  • 所有默认的Code Golf规则均适用。
  • 字节数最短的程序获胜。

奖金(17%折扣)-解析多个分数

句子也可以以多个感叹号/问号结尾。给这些标记中的每一个加上一个配对的反感叹号/问号,可以使您的字节数额外减少17%。

输入:

I am a man in a can doing a dance?? Maybe...
              Doing it for the views??!???!

输出:

¿¿I am a man in a can doing a dance?? Maybe...
              ¡¿¿¿¡¿¿Doing it for the views??!???!

输出错误

¿¿I am a man in a can doing a dance?? Maybe...
              ¿¿¡¿¿¿¡Doing it for the views??!???!

我们是要选择哪种空格分隔句子,还是必须支持所有3种类型?
Mego 2015年

@Mego应该支持所有三种类型。
usandfriends 2015年

不,一个句子中总是至少有一个单词,并以三个允许的标点符号之一结尾。我将其添加到挑战中。
usandfriends 2015年

Answers:


5

视网膜39 37 34字节

\w[^.]*?([!?])
$1$0
T`?!`¿¡`\S\b

在线尝试。

说明

\w[^.]*?([!?])
$1$0

这与以感叹号或问号结尾的句子匹配,并将标点符号添加到句子之前。现在我们知道,所有!?紧随其后的非空格字符都必须是我们插入的那些字符,因为原始的空格应与下一个字符分开。

T`!?`¡¿`\S\b

只要在匹配项中找到它们,该音译阶段会将all !和分别?变为¡¿,该匹配\S\b仅适用于我们刚刚插入的匹配项。在相同的字节数中用两个单独的替换代替这两个替换,但是在这里我更喜欢音译阶段的语义。


3

Mathematica 137字节

不是最短的,但是这样做很有趣。

TextSentences将输入文本分解为句子,并StringPosition找到文本中每个句子的开始和结束位置。根据需要在每个句子的开头插入颠倒的标点符号。

w=StringPosition;f[x_,y_,q_]:=StringInsert[x,q,x~w~y/.{a_,a_}->a/.(x~w~#&/@TextSentences@#&@x/.{{c_,d_}}:>d->c)];f[f[t,"!","¡"],"?","¿"]&

使用方法,假设文本输入的t

f[f[#,"!","¡"],"?","¿"]&[t]

输出


1
很酷,不使用RegExp的解决方案!
usandfriends 2015年

3

Sed,61个字节

s/\(\s*\)\([^.!?]*!\)/\1¡\2/g;s/\(\s*\)\([^.!?]*?\)/\1¿\2/g

测试运行 :

$ echo """Hello there!      What is your name?
My name is Ron. What's your name?
My name is Alex.  Nice to meet you!
Nice to meet you to!  How was your break?
It was great, I spent all my time code golfing!
What's that?
        Wow, you're such a n00b! Here, let me show you.""" | sed 's/\(\s*\)\([^.!?]*!\)/\1¡\2/g;s/\(\s*\)\([^.!?]*?\)/\1¿\2/g'
¡Hello there!      ¿What is your name?
My name is Ron. ¿What's your name?
My name is Alex.  ¡Nice to meet you!
¡Nice to meet you to!  ¿How was your break?
¡It was great, I spent all my time code golfing!
¿What's that?
        ¡Wow, you're such a n00b! Here, let me show you.

1
从技术上讲,这是61个字节,因为反向字符算作2个字节。
usandfriends 2015年

@usandfriends权,固定
阿伦

如果使用-r(GNU)sed 的标志,则不需要转义()这将为您节省8。但是,您确实需要添加一个额外的点来使用此非默认选项。
Digital Trauma 2015年

@DigitalTrauma我知道该技巧并尝试了该技巧,但未返回相同的输出:“¿¡hello !!¿你叫什么名字??”而不是“¡¡hello !!¿你叫什么名字?”。
亚伦

3

Javascript(ES6),86 79 66 63字节

i=>i.replace(/\w[^.!?]*[!?]/g,k=>(k.slice(-1)>'>'?'¿':'¡')+k)

取消高尔夫:

func = inp => inp.replace(/\w[^.!?]*[!?]/g, sentence => (sentence.slice(-1) > '>' ? '¿' : '¡') + sentence)

用法:

console.log(func(`Hello there!      What is your name?
My name is Ron. What's your name?
My name is Alex.  Nice to meet you!
Nice to meet you to!  How was your break?
It was great, I spent all my time code golfing!
What's that?
            Wow, you're such a n00b! Here, let me show you.`))

即将实施奖金解决方案。

感谢:
@ user8165586 => 79个字节


1
节省9个字节的一些改进:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655

@ user81655看起来它节省了7个字节而不是9个字节,但是不管怎么说,谢谢!通过跳过对以结尾的句子的检查,能够删除更多的字节.
usandfriends 2015年


1

Python 2,127.82(154-17%)字节

import re
print re.sub("([A-Z][\w ,']*)([\.!\?]+)",lambda m:''.join({'!':'¡','?':'¿','.':''}[c]for c in m.group(2))[::-1]+m.group(1)+m.group(2),input())

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.