ANNNUNNNCCCEEERRR VOICCCEEE


18

Bir dizi harf ve boşluk alan (harf olmayanları işlemeye gerek yoktur) bir işlev yazın ve SESLİ SES çeviri algoritmasını aşağıdaki gibi gerçekleştirin:

  • İlk olarak, her şeyi büyük harfle yazın.
  • Her kelime için,
    • Her harfleri üçe katlayarak her ünsüz kümeyi uzatın; kelime ünsüz bir kümeyle başlıyorsa , bu kümeyi uzatmayın. Örneğin, otherolmalı OTTTHHHEEERRRama motherolmalı MOTTTHHHEEERRR.
    • Uzamış bunu üç katına nihai sesli harf.
  • Her iki uzama durumunda, bir mektubu üç katına çıkarıyorsanız, ilk önce her iki tarafta da yinelenen harflerle birleştirin. Örneğin, hillolmalı HIIILLLve bookkeeperolmalı BOOKKKEEPPPEEERRR.
  • Bu zorluğun amaçları için, yünsüz olarak sayılır.
  • Açıklama / basitleştirme: Her bir kelime çiftinin tek bir boşlukla ayrıldığını ve girdinin ardışık boşluk içermediğini ve girdinin boş dize olmayacağını varsayabilirsiniz.
  • En kısa kod kazanır!

Test vektörleri:

> sunday sunday
SUNNNDDDAAAYYY SUNNNDDDAAAYYY
> mia hamm
MIAAA HAAAMMM
> chester alan arthur
CHESSSTTTEEERRR ALLLAAANNN ARRRTTTHHHUUURRR
> attention please
ATTTENNNTTTIOOONNN PLEASSSEEE
> supercalifragilisticexpialidocious
SUPPPERRRCCCALLLIFFFRRRAGGGILLLISSSTTTICCCEXXXPPPIALLLIDDDOCCCIOUUUSSS
> moo
MOOO
> Aachen
AACCCHHHEEENNN
> Oooh
OOOHHH
> grifffest
GRIFFFEEESSSTTT
> k
K
> aaaabbbbc
AAAABBBBCCC

İşte bu sabah itibariyle sorunun kapatılması dışında bir cevaba geçeceğim referans uygulaması. : P

import itertools,re
def j(s):return re.match('^[AEIOU]+$',s)
def c(s):return ''.join(sum(([h,h,h]for h in[k for k,g in itertools.groupby(s)]),[]))
def v(s):
 while len(s)>=2 and s[-2]==s[-1]:s=s[:-1]
 return s+s[-1]+s[-1]
def a(n):
 r=''
 for w in n.split():
  if r:r+=' '
  ss=re.split('([AEIOU]+)', w.upper())
  for i,s in enumerate(ss):
   r += [v(s),s][any(j(t) for t in ss[i+1:])]if j(s)else[s,c(s)][i>0]
 return r
while 1:print a(raw_input('> '))

2
Gelecek için bir istek: lütfen ünsüz küme , birleşme ve uzama gibi sözcüklerden ve ifadelerden kaçının . Anadili İngilizce olmayan bir konuşmacının yazınızı anlamak için bir sözlüğe ihtiyacı olabilir.
Dennis

"Uzatılmış" ünlüler olmalı :(
Devil's Advocate

Ünsüz küme nedir?
MilkyWay90

Yanıtlar:


6

APL (Dyalog) , 175 bayt

1' +'R' ''[AEIOU][^AEIOU]+ 'R{m/⍨1,3×2≠/m←⍵.Match}'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'R'\1\1\1\2' '&' '&' '\1\1\1''$| |^'R'  '1(819⌶)⍞

Çevrimiçi deneyin!

 karakter girişi istemi

1(819⌶) büyük harfe dönüştür (819 ≈ Büyük)

 Sonucu daha ileriye taşı (dizeleri ve 1'i ayırmaya yarar)

'$| |^'⎕R' 'R eplace:
 son, herhangi bir boşluk ve başlangıç
 → iki boşluk

 Sonucu daha ileriye taşı (iki dize grubunu ayırmaya yarar)

'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'R eplace:
 herhangi bir sayıda aynı sesli harf ve herhangi bir sayıda sesli olmayan ve bir boşluk
 → sesli harf üç kez ve değiştirilmemiş ünsüzler
 bir boşluk ve bir ünlü
 → kendileri
 bir boşluk ve ünsüz bir küme
 → kendileri
 aynı ünsüzler çalışması
 → bunlardan üçü sesli harfler

'[AEIOU][^AEIOU]+ '⎕R{}R eplace:
 ünlü olmayanlar ve bir boşluk çalışması
 → bağımsız değişken olarak ad alanı ile aşağıdaki anonim işlevin sonucu :
  ⍵.Match bulunan metin,
  m← bunu m
  2≠/ farklı bir şekilde eşleştirmek için atar .
    çarpın üç tarafından
  1, sona ekleme tek
  m/⍨ kullanımda olduğu kopyalamazlarm

 Sonucu daha ileriye taşı (iki dizeyi ayırmaya yarar)

' +'⎕R' 'R eplace:
 bir veya daha fazla boşluk
 → tek bir boşluk ile

1↓ ilk harfi bırak (boşluk)


Bu çalışıyor mu? 1↓' +'⎕R' '⊢'[AEIOU][^AEIOU]+ '⎕R{m/⍨1,3×2≠/m←⍵.Match}'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R(s,'\2')'&' '&'(s←6⍴'\1')⊢'$| |^'⎕R' '⊢1(819⌶)⍞
Zacharý


5

JS (ES6), 138 134 129 bayt

s=>s.toUpperCase()[r="replace"](/(\w)\1/g,"$1")[r](/[AEIOU](?=[^AEIOU]*( |$))/g,s=>s+s+s)[r](/\B./g,s=>/[AEIOU]/.test(s)?s:s+s+s)

WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSS. AEIOU3 kez içerir , ama ben bunları bir golf olamaz.

HyperNeutrino sayesinde -4 bayt

Ungolfed

function v(str){
    return str.toUpperCase().replace(/(\w)\1/g,"$1").replace(/[AEIOU](?=[^AEIOU]*( |$))/g,s=>s+s+s).replace(/\B./g,s=>[..."AEIOU"].includes(s)?s:s+s+s);
}

Yazmayı seviyorum, kodu okumadım.


1
"WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSSS" ... ilk etapta, APL'nin önünde.
Zacharý

Ben JS bilmiyorum ama yerine s=>/[AEIOU]/.test(s)sahip /[AEIOU]/.test?
musicman523

@ musicman523 ne yazık ki hayır, çünkü üçlü bir operatör ifadesinde şartlı.
17'de

Bilginize, ünsüz kümeleri ele almanız biraz yanlış görünüyor; uygun çıktı WAAAYYY TOOO MAAANNNYYY BYTEEESSS(yani ilk kümeyi uzatmayın BYT) olacaktır.
Quuxplusone

İlk etapta.
Zacharý

5

APL, 90 bayt

{1↓∊{s←{⍵⊂⍨1,2≠/⍵}⋄x↑⍨¨(3⌈≢¨s⍵)⌊≢¨x←s⍵/⍨(1+2×{⌽<\⌽⍵}∨~∧∨\)⍵∊'AEIOU'}¨w⊂⍨w=⊃w←' ',1(819⌶)⍵}

Açıklama:

  • 1(819⌶)⍵: büyük harfe dönüştür
  • w⊂⍨w=⊃w←' ',: boşluklarda bölün
  • {... : her kelime için ...
    • s←{⍵⊂⍨1,2≠/⍵}: sbir dizeyi bitişik eşleşen karakter gruplarına ayıran bir işlevdir
    • ⍵∊'AEIOU': ünlüleri işaretle
    • (... ): hangi karakterleri çoğaltacağınızı görün
      • ~∧∨\: ilk sesli harfleri geçen tüm ünsüzler,
      • {⌽<\⌽⍵}: son sesli harf.
      • : bit vektörünü ikiyle çarp,
      • 1+: ve bir tane ekleyin. Şimdi seçilen tüm karakterler var 3ve geri kalanı var 1.
    • ⍵/⍨: verilen her bir karakteri her bir karakter için
    • x←s: eşleşen karakterlerden oluşan dizelere bölün ve bunu saklayın x.
    • (3⌈≢¨s⍵): giriş kelimesindeki her eşleşen karakter grubunun uzunluğu, en fazla 3.
    • ⌊≢¨: minimum değeri ve grupların uzunlukları x.
    • x↑⍨¨: her grubu bu uzunlukta yap
  • 1↓∊: sonucu düzleştirin ve ilk karakteri bırakın (bölmeye yardımcı olmak için başlangıçta eklenen boşluk)

Adama'yı ... vay be.
Zacharý

çok temiz! Biraz karıştırıp bir program olarak yazarsanız (Adám tarafından önerilen istemi kullanarak) başka bir 15 bayt tıraş edebilirsiniz:1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Gil

3

Python, 417 bayt

İşte Python'da bir referans uygulaması. Çok golf değil.

import itertools,re
def j(s):return re.match('^[AEIOU]+$',s)
def c(s):return ''.join(sum(([h,h,h]for h in[k for k,g in itertools.groupby(s)]),[]))
def v(s):
 while len(s)>=2 and s[-2]==s[-1]:s=s[:-1]
 return s+s[-1]+s[-1]
def a(n):
 r=''
 for w in n.split():
  if r:r+=' '
  ss=re.split('([AEIOU]+)',w.upper())
  for i,s in enumerate(ss):
   r+=[v(s),s][any(j(t) for t in ss[i+1:])]if j(s)else[s,c(s)][i>0]
 return r

Şununla test et:

while True:
 print a(raw_input('> '))

Gerekir değil en az golf azından altındaki gereksiz boşluklar kaldırarak ve değiştirerek biraz ssiçin S?
Zacharý

2

Python 3 , 238 bayt

def f(s):
 s=s.upper();k=[s[0]];s=''.join(k+[s[i]for i in range(1,len(s))if s[i]!=s[i-1]])
 for i in range(1,len(s)):k+=[s[i]]*(3-2*(s[i]in'AEIOU'and i!=max(map(s.rfind,'AEIOU'))))
 return''.join(k)
print(' '.join(map(f,input().split())))

Çevrimiçi deneyin!


Bayt vdeğerini olarak ayarlayarak kaydedebilir misiniz 'AEIOU'?
Zacharý

@ Zacharý Teşekkürler, ancak maalesef bayt sayısını değiştirmiyor.
HyperNeutrino

Ah, ilkinin etrafındaki boşluklar v.
Zacharý

0

Perl 5 , 139 + 1 (-p) = 140 bayt

$_=uc,s/^([^AEIOU]*)//,$s=$1,s/([^AEIOU])\1*/$1x(($q=length$&)>3?$q:3)/ge,s/.*?\K([AEIOU])\1*/$1x(($q=length$&)>3?$q:3)/e,print"$s$_ "for@F

Çevrimiçi deneyin!

Hatta örneğe uygun olarak "aaaabbbbc" test senaryosunu işler.

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.