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 .
  3×  ç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.
      • 2×: 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.