通常および逆の感嘆符と疑問符のペア


13

チャレンジ

¡私たちは感嘆符と疑問符を逆さの仲間に与えるつもりです!

終わる文章を含むテキストの体を考えると.?あるいは!、逆疑問符、先頭に追加¿、疑問文(で終わる文章へ?)と逆感嘆符、¡、感嘆(で終わる文章にします!)。で終わる文.は無視されます。

文は空白(スペース、タブ、改行)で区切られ、英数字、コンマ、アポストロフィ、スペースのみが含まれます。すべての文には少なくとも1つの単語があります。すべての文の最初の単語は大文字であることが保証されています。入力は、任意の空白で開始および終了できます。

入力:

  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

@Mego 3つのタイプすべてをサポートする必要があります。
usandfriends

いいえ、文には常に少なくとも1つの単語が含まれ、許可される3つの句読点文字のいずれかで終了します。これをチャレンジに追加します。
usandfriends

回答:


5

網膜39 37 34バイト

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

オンラインでお試しください。

説明

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

これは、感嘆符または疑問符で終わる文に一致し、その句読文字を文の先頭に追加します。元の文字は次の文字とスペースで区切る必要があるため、スペース以外の文字が直後に続くすべての!また?はは、挿入した文字でなければならないことがわかりました。

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

この音訳ステージは全て変わる!?にする¡¿、それぞれ、それらがの試合で見ていて\S\bのみ、我々はちょうど挿入したものに適用され、。同じバイトカウントの2つの別個の置換で両方を置換しますが、ここでは音訳段階のセマンティクスを好みます。


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

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
反転文字は2バイトとしてカウントされるため、これは技術的には61バイトです。
usandfriends

@usandfriendsの権利、修正
アーロン

-r(GNU)sedにフラグを使用する場合、8 をエスケープする必要はありません。これにより()8を節約できます。ただし、このデフォルト以外のオプションを使用するために追加のポイントを追加する必要があります。
デジタル外傷

@DigitalTrauma私はそのトリックを知ってそれを試してみましたが、同じ出力を返しませんでした:「¡Hello there!¿
アーロン

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 9ではなく7バイトを節約するようですが、それにもかかわらず、ありがとうございます!で終わる文のチェックをスキップして、さらに多くのバイトを削除できました.
usandfriends

3

Mathematica、101 92 91バイト

StringReplace[#,RegularExpression@"[A-Z][^.]*?([?!])":><|"?"->"¿","!"->"¡"|>@"$1"<>"$0"]&

これがどのように機能するか説明していただけますか?
-DavidC

1
@DavidCトリッキーです。
LegionMammal978

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())

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.