Normal ve ters ünlem işareti ve soru işareti çiftleri


13

Meydan okuma

¡Biz ünlem ve soru işaretleri ters arkadaşları vereceğiz!

Biten metin içeren cümlelerin bir gövde göz önüne alındığında ., ?ya !, başına ters soru işaretleri, ¿, soru cümlesinin (cümle ile biten ?) ve ters ünlem işaretleri, ¡, ünlem (biten cümleler !). İle biten cümleler .göz ardı edilecektir.

Cümleler boşlukla (boşluklar, sekmeler ve / veya yeni satırlar) ayrılır ve yalnızca alfasayısallar, virgül, kesme işaretleri ve boşluklar içerir. Her cümlede en az bir kelime olacaktır. Her cümlenin ilk kelimesi büyük harfle yazılır. Giriş herhangi bir boşlukla başlayıp bitebilir.

Misal

Giriş:

  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.

Çıktı:

  ¡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.

kurallar

  • Tüm varsayılan Code Golf kuralları geçerlidir.
  • En az bayt içeren program kazanır.

Bonus (% 17 indirim) - Birden fazla işareti ayrıştır

Bir cümle birden fazla ünlem / soru işaretiyle de bitebilir. Bu işaretlerin her birine, bayt sayımınızdan% 17 daha fazla bir ücret karşılığında eşleştirilmiş ters ünlem / soru işareti verin.

Misal

Giriş:

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

Çıktı:

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

Yanlış çıktı:

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

Hangi tür boşlukların cümleleri ayırdığını seçebilir miyiz, yoksa 3 tipin tümünü desteklememiz gerekir mi?
Mego

@ Mego Her üç tür de desteklenmelidir.
usandfriends

Hayır, bir cümlenin içinde daima en az bir kelime bulunur ve izin verilen üç noktalama işaretinden biriyle biter. Bunu mücadeleye ekleyeceğim.
usandfriends

Yanıtlar:


5

Retina , 39 37 34 bayt

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

Çevrimiçi deneyin.

açıklama

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

Bu, ünlem işareti veya soru işaretiyle biten bir cümle ile eşleşir ve noktalama karakterini cümleye ekler. Şimdi, boşluk olmayan bir karakterin hemen arkasından gelen !veya ?gelen karakterin eklediğimiz karakterler olması gerektiğini biliyoruz, çünkü orijinal karakterler bir sonraki karakterden bir boşlukla ayrılmalıdır.

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

Bu harf çevirisi aşaması , yalnızca yeni eklediklerimiz için geçerli olan bir eşleşmede bulunması şartıyla sırasıyla !ve ?içine ¡ve dönüşüne dönüşür . Her ikisini de aynı bayt sayısında iki ayrı ikamede değiştirmek, ancak burada bir harf çevirisi aşamasının anlambilimini tercih ediyorum.¿\S\b


3

Mathematica 137 bayt

En kısa değil, ama yapmak eğlenceliydi.

TextSentencesgirdi metnini cümlelere ayırır ve metindeki StringPositionher cümlenin başlangıç ​​ve bitiş konumlarını bulur. Baş aşağı noktalama işaretleri her cümlenin başına gerektiği gibi eklenir.

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,"!","¡"],"?","¿"]&

Metnin girildiği varsayılarak kullanım t,

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

çıktı


1
Harika, RegExp kullanmayan bir çözüm!
usandfriends

3

Sed, 61 bayt

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

Test sürüşü :

$ 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
Tersine çevrilmiş karakterler 2 bayt olarak sayıldığından, bu teknik olarak 61 bayttır.
usandfriends

@usandfriends right, fixed
Aaron

-r(GNU) sed için bayrağı kullanırsanız, kaçmanız gerekmez (ve )bu da sizi kurtarır. 8 Bu varsayılan olmayan seçeneğin kullanımı için fazladan bir nokta eklemeniz gerekir.
Dijital Travma

@DigitalTrauma Bu numarayı biliyordum ve denedim ama aynı çıktıyı döndürmedi: "¿¡Merhaba!! İsminiz nedir? ¿" Yerine "¡Merhaba! ¿İsminiz nedir?"
Aaron

3

Javascript (ES6), 86 79 66 63 bayt

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

Ungolfed:

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

Kullanımı:

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.`))

Yakında bonus çözüm uygulayacak.

Teşekkürler:
@ user81655 , 86 => 79 bayt


1
9 bayt tasarruf eden birkaç iyileştirme:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655

@ user81655 Görünüşe göre 9 yerine 7 bayt kaydediyor, ama ne olursa olsun bunun için teşekkürler! İle biten cümleleri kontrol atlayarak daha fazla bayt kaldı ..
usandfriends

3

Mathematica, 101 92 91 bayt

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

Bunun nasıl çalıştığını açıklar mısınız?
DavidC

1
@DavidC Zor.
LegionMammal978

1

Python 2, 127.82 (% 154-17) bayt

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.