Giriş dizesinden n'den fazla ardışık sesli harfleri kaldırın


19

Arka arkaya üçten fazla sesli harfle dizeleri sevmiyorum. İstemediğim tüm sesli harfleri kelimelerden kaldıran bir program yazabilir misin?

STDIN (veya en yakın alternatif), komut satırı bağımsız değişkeni veya işlev bağımsız değişkeni ile girdi alarak ve sonucu STDOUT (veya en yakın alternatif), işlev dönüş değeri veya işlev (çıkış) parametresi aracılığıyla çıktı alarak bir program veya işlev yazabilirsiniz.

Giriş yalnızca yazdırılabilir ASCII karakteri içeren bir dizedir (0x20 - 0x7E, dahil).

Çıktı, yalnızca en fazla 3 ardışık sesli harf içeren bir dizedir. Giriş dizesinde art arda 3'ten fazla sesli harfin çalışması varsa, programınız bu çalışmada karşılaşılan ilk üç sesli harfleri içeren bir çıkış dizesi üreterek ardışık diğer sesli harfleri atar.

Y, bu mücadelenin amaçları için bir sesli harf değildir.

Bu kod golf, yani en kısa kod (bayt cinsinden) kazanır.

Test Durumları

"Aeiou" => "Aei"
"screeeen" => "screeen"
"We're queueing up for the Hawaiian movie." => "We're queung up for the Hawaiin movie."
"Spaces break runs: aei iou." => "Spaces break runs: aei iou."

2
Karışık vakalarla biraz daha test eklemelisiniz, örneğin aaYYAAaaaAERGH.
Zgarb

Yanıtlar:


5

Pyth, 21 bayt

sfg3=Z&}rT0"aeiou"hZz

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

Tüm karakterleri tekrar ediyorum ve bir sayaç kullanarak kaç sesli harfin geçtiğini takip ediyorum. Sesli harf olmayan bir karakter her ilettiğimde sayacı 0'a sıfırlarım. Sayaç> 4 olduğunda karakterleri yeniden düzenlerim.

sfg3=Z&}rT0"aeiou"hZz   implicit: z = input string
                                  Z = 0
 f                  z   test every char T in z; keep chars, that return true:
        rT0                convert T to lower
       }   "aeiou"         test if T is a vowel
      &           hZ       logical and with Z+1, 
                           gives 0 if ^ is false, otherwise Z+1
    =Z                     update Z with this value
  g3                       test if 3 >= Z
s                       sum up all remaining chars and print

10

Okunamaz , 1647 bayt

' '' '' ' ' '''' '' '' ' ' '' ' ' '' '' '''' ' ' '''' '''' '' '' '' '' "'" "" "" "" "" ' '' '' '' '' ' ' '' '' '''' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' ''""" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '' ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' ''""" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' ''"" ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '' ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' '''"" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' ''" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" ' '' "' '' '' ''" "" ' '' '' ''' "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" """" "' '' '' ''" ' '' ' ' '' '' '' '' ' ' '' '' '''' '''' '' '' '' "' '' '' "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' "' '' "' '' '' '' ''"' '' ''" "' '' ' ' '' '' '' '''' '' '' '' ' ' '' '' '' '''' '' '' ''"' '' ''"" "" ' '' '' '' ''' "" "" "" " ' '' ' ' '' '' '' '' ' ' '' '' '''' '''' '' "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '' ' '' '' '' "' '' ' ' '' '' '' '' ' ' '' '' '''' '''' '' '' '' "' ''""" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '' ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "' '' ' ' '' '' '' '' ' ' '' '' '''' '''' '' '' ''"' '' '' '' ''' '' '' '' ''' "" "" "" "" ' '' '' '' "' '' "' '' '' '' '' ' ' '' '' ''''" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "' '' '' ''" ' '' "' "" "" "" "" " ' '' '' '''" "" ' '' '' '' ''' "" "" "" "" ' '' '' ''"" ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" ' '' "' '' '' '' ''" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ' ' '' ' ' '' '' '' '''' '''' ''' "" "' ''" ' '' "'"" "' ''" ' '' "' '' "' ''" ' ''"' '' '' '' '' ' ' '''' ' ' '''' " ' '' '' "" ' ''' "" " ' '' '' '' '''" "" "" "" ' ''' "" "'" ' '' '' '' ' ' '''' "' "" " ' '' '' '''" " ' '' ' ' '''' '' '' '''" " ' '' ' ' '' '''''" "" """" ' ''' "" ' '' ' ' '' '' '''' "' '' ' ' '' '' '' '''' ''

açıklama

Bu program şu şekilde sözde koduna eşdeğerdir:

while (cp = (ch = read)) + 1 {
    (
        (cp -= 65) ?    // A
            (cp -= 4) ?     // E
                (cp -= 4) ?     // I
                    (cp -= 6) ?     // O
                        (cp -= 6) ?     // U
                            (cp -= 12) ?    // a
                                (cp -= 4) ?     // e
                                    (cp -= 4) ?     // i
                                        (cp -= 6) ?     // o
                                            (cp - 6) ?      // u
                                                0
                                            : 1
                                        : 1
                                    : 1
                                : 1
                            : 1
                        : 1
                    : 1
                : 1
            : 1
        : 1
    ) ? ((--vs)+4) ? print(ch) : (++vs) : {
        print(ch)
        vs = 0
    }
}

aşağıdaki değişken atamalarıyla:

0   (unused)   (13 bytes)
1   cp         ( 4 bytes; occurs 20× in the code)
2   vs         ( 7 bytes; occurs  5× in the code)
3   ch         (10 bytes; occurs  3× in the code)

Gördüğünüz gibi, değişken slot 0'dan kaçındım çünkü 0yazmak için çok uzun bir sabit.

Her karakteri okuyup hem de değerini depolamak Yani cpve ch. Gerekirse yazdırabilmemiz için değiştireceğiz, cpancak saklayacağız ch. cpASCII'deki 10 olası sesli harf karakterinden her birinin olup olmadığını kontrol etmek için 65, 4, 4, 6 vb .

vsher zaman yazdırılmasına izin verilen ünlü sayısından 3 daha az içerir. Başlangıçta başlar 0, böylece 3 sesli harf yazdırılabilir. O ulaştığında -3, biz sesli harfleri yazdırırken durdurun.

Biz karşılaşırsanız olmayan sesli harf (boşluk dahil), biz yürütmek print(ch)ardındanvs = 0 . Muhtemelen tahmin ettiğiniz gibi, sesli harfler sayacını sıfırlar.

Bir sesli harfle karşılaşırsak , idam ederiz ((--vs)+4) ? print(ch) : (++vs). Bunu parçalayalım:

  • azalma vs ;
  • değer şimdi ise -4, çok ileri gittik, bu yüzden hiçbir şey yazdırmayın, ancak vstekrar artırın , -3böylece devam edeceğiz sesli harfleri yazdırmak için reddetme;
  • aksi takdirde karakteri yazdırın.

1
Bu dil adı için geçerlidir.
bkul

2
Ben her zaman bu dillerde merak ediyorum ... "Aslında bunu elle mi yazdılar? Öyleyse, onlara acıyorum ..." +1
Addison Crump

9

Retina , 25 bayt

i`([aeiou]{3})[aeiou]+
$1

Çevrimiçi deneyin.

Oldukça basit regex ikamesi. Bu aynı bayt sayısı için de geçerlidir:

Ri`(?<=[aeiou]{3})[aeiou]

3
En sonunda! Çevrimiçi bir tercüman! Github sayfanızda link vermeyi düşünmelisiniz.
mbomb007

6

JavaScript (ES6), 42

Anonim bir işlev olarak

s=>s.replace(/[aeiou]+/gi,v=>v.slice(0,3))

4

Perl, 27 karakter

(26 karakter kod + 1 karakter komut satırı seçeneği)

s/[aeiou]{3}\K[aeiou]+//gi

Çok önemli değil, hatırladığım nadir bir durum \K var.

Örnek çalışma:

bash-4.3$ perl -pe 's/[aeiou]{3}\K[aeiou]+//gi' <<< "
> Aeiou
> screeeen
> We're queueing up for the Hawaiian movie.
> Spaces break runs: aei iou."

Aei
screeen
We're queung up for the Hawaiin movie.
Spaces break runs: aei iou.

2
Retina cevabını yazdığımda "Keşke .NET regex olsaydı \K" diye düşündüm . :)
Martin Ender

İlginç, @ MartinBüttner. Düzenli ifadelerin ciddi steroid diyeti uygulandığını hissettim. Merak için, özyinelemeli alt özellikleri var mı? Sonuç daha uzun olsa, yedek bir sesli harf numaralandırma için yardımcı olabilir: s/([aeiou]{1,3})(?1)+/$1/gi.
manatwork

Ne yazık ki, desen yeniden kullanımları da yok. Bu iki şey vardır bazen yapmak bana geçiş Perl veya PCRE'nin için. Retina'nın regex lezzetine bazı basit şeyler yamalamak için geldiğimde, bunları ekleyeceğim (gerçek özyineleme değil, en azından desen yeniden kullanımı ve sonlu özyineleme).
Martin Ender

2

Ciddi, 34 bayt

,;ù0╗`Ok"aeiou"Okd-Y;╜+*;╗4>`M@░εj

Hex Dökümü:

2c3b9730bb604f6b226165696f75224f6b
642d593bbd2b2a3bbb343e604d40b0ee6a

Çevrimiçi deneyin

Pyth cevabı ile aynı algoritmayı kullanır, bir kayıttaki geçerli sesli harflerin uzunluğunu takip ederken, geçerli karakter bir sesli harf olduğunda onu arttırır ve izin verilen uzunluğu aşıp aşmadığını kontrol eder, eğer öyleyse 0 döndürür ve ardından orijinal dizeyi bu oluşturulan filtreyle filtreler. Dizelerde set çıkarma işlemini kullanabileceğimizde çok daha kısa olacaktır. ( OkSilinebilir ve Okdsadece ile değiştirilebilir @). Bu özelliğin bir sonraki güncellemede geldiğini duydum ....


2

C, 166 bayt

en kısa cevap değil ama bence güzel golfed ..

#define V v[1][i]!=
#define P printf("%c",v[1][i]),j
j;main(i,v)char**v;{for(i=0;V 0;i++)(V 97&V 'e'&V 'i'&V 'o'&V 'u'&V 65&V 69&V 73&V 79&V 85)?P=0:j>3?j++:P++;}

test durumu:

$ a.exe "We're queueing up for the Hawaiian movie."

We're queung up for the Hawaiin movie.

$ wc -c vowels.c 

166 vowels.c

2

Mathematica, 68 bayt

a=Characters@"aeiouAEIOU";StringReplace[#,b:a~Repeated~{3}~~a..:>b]&

Normal ifade yanıtı aynı uzunlukta olur, ancak normal ifadeyi kim kullanır?


2

Java, 115 bayt

class a{public static void main(String[] a){System.out.println(a[0].replaceAll("(?i)([aeiou]{3})[aeiou]*","$1"));}}

Program parametresi olarak girişi bekler.

Birim test çıkışı:

Aei
screeen
We're queung up for the Hawaiin movie.

String[]Ve arasındaki boşluğu kaldırarak bir bayt kaydedin a. String[]a
Poke

Kullanılarak 2 bayt kaydet printziyade println. Spesifikasyonun sondaki bir yeni satır gerektirdiğine inanmıyorum.
Poke

2

APL, 40 karakter

{⍵/⍨1↓4≠⊃+/(1-⍳4)⌽¨⊂'aeiouAEIOU'∊⍨' ',⍵}

İngilizcede:

  • 'aeiouAEIOU'∊⍨' ',⍵: sesli harfleri bul (ve dönüşte kırılmak için bir boşluk ekle);
  • (1-⍳4)⌽¨⊂: boolean vektörünü sağa doğru iterek 0, 1, 2, 3 kez döndürün (etrafı sararak);
  • ⊃+/ sum: dönüşler ve kutudan çıkarma
  • 1↓4≠: 4'ten farklı olanı bulun ve ilkini kaldırın (daha önce önerdiğimiz alanı bulmak için)
  • ⍵/⍨: bağımsız değişkende, yalnızca toplamın 4'ten farklı olduğu öğeyi saklayın.

1

Perl 6 ,  36  35 bayt

{S:g:i/(<[aeiou]>**3)<[aeiou]>+/$0/} # 36 bytes

$ perl6 -pe 's:g:i/(<[aeiou]>**3)<[aeiou]>+/$0/' # 34 + 1 = 35 bytes

kullanımı:

$ perl6 -pe 's:g:i/(<[aeiou]>**3)<[aeiou]>+/$0/' <<< "
> Aeiou
> screeeen
> We're queueing up for the Hawaiian movie.
> Spaces break runs: aei iou."
Aei
screeen
We're queung up for the Hawaiin movie.
Spaces break runs: aei iou.

1

C (205 bayt)

#include <stdio.h>
#define T(x)for(i=0;i<10;++i){if(v[i]==x){b=x;m=1;break;}}putchar(c);
main(b,c,i,m){char v[]="aeiouAEIOU";
while((c=getchar())!=EOF){if(!m){T(c);}else{if(b==c)continue;else{m=0;T(c);}}}}

(Netlik için bir satır sonu eklendi)


1

Scala, 107 bayt

readLine.foldLeft("",0)((a,n)=>if(!"aeiou".contains(n|32))a._1+n->0 else if(a._2>2)a else(a._1+n,a._2+1))_1

1

Javascript ES6, 43 karakter

s=>s.replace(/([aeiou]{3})[aeiou]*/gi,"$1")

Ölçek:

f=s=>s.replace(/([aeiou]{3})[aeiou]*/gi,"$1")
;`"Aeiou" => "Aei"
"screeeen" => "screeen"
"We're queueing up for the Hawaiian movie." => "We're queung up for the Hawaiin movie."
"Spaces break runs: aei iou." => "Spaces break runs: aei iou."`
.replace(/"/g,"").split("\n").every(s=>f((s=s.split(" => "))[0])==s[1])

1

x86 MS-DOS .COM dosyası , 44 bayt 36 bayt

.COM dosyaları MS-DOS 1'den bugüne kadar yaygın olarak desteklenmektedir --- sadece 8086 komutlarını kullanarak dosemu'da çalışıyorum.

Her sesli harfleri test etmek için ayrı bir komut kullanmak yerine sesli harfleri test etmek için REPNE SCASB kullanılarak 44'ten 36 bayta düşürüldü.

Hex dump, reversible using `xxd -r -seek -256`:
0100: b3 03 43 b4 08 cd 21 88 c2 24 df b1 05 bf 1f 01   ..C...!..$......
0110: f2 ae 74 02 b3 05 4b 74 e9 b4 02 cd 21 eb e4 41   ..t...Kt....!..A
0120: 45 49 4f 55                                       EIOU

Unassembled using debug:
0100 B303    MOV BL,03     ; initialize counter to 3 (will increment by 1 to be 4)
0102 43      INC BX        ; increment counter--runs each time it hits 0 so it never goes <0
0103 B408    MOV AH,08     ; 
0105 CD21    INT 21        ; with AH=8, read 1 char without echo
0107 88C2    MOV DL,AL     ; copy input for potential output
0109 24DF    AND AL,DF     ; make input uppercase for testing
010B B105    MOV CL,05     ; count of 5 vowels to test against
010D BF1F01  MOV DI,011F   ; location of first vowel to test against
0110 F2AE    REPNE SCASB   ; test input against each vowel
0112 7402    JZ 0116       ; if input was not a vowel:
0114 B305    MOV BL,05     ;    reset counter to 5 (will decrement by 1 to be 4)
0116 4B      DEC BX        ; decrement counter regardless
0117 74E9    JZ 0102       ; if hit 0 (fourth or later vowel): goto 102
0119 B402    MOV AH,02     ; 
011B CD21    INT 21        ; with AH=2, print char
011D EBE4    JMP 0103      ; go to 103 for next character

bytes 011f-0123 contain the uppercase vowels AEIOU

1

Matlab / Oktav, 54 bayt

@(s)regexprep(s,'(?<=[aeiouAEIOU]{3})[aeiouAEIOU]','')

Misal:

>> @(s)regexprep(s,'(?<=[aeiouAEIOU]{3})[aeiouAEIOU]','')
ans = 
    @(s)regexprep(s,'(?<=[aeiouAEIOU]{3})[aeiouAEIOU]','')

>> ans('We''re queueing up for the Hawaiian movie.')
ans =
We're queung up for the Hawaiin movie.

Bunu ideone'de deneyin .


1

V , 21 bayt (rakipsiz)

ñ[aeiou]ñÍãqû3}úsq*

Çevrimiçi deneyin!

Açıklama:

ñ[aeiou]ñ                     "Assign the string `[aeiou]` to register 'q'
         Íã                   "Search and replace on multiple lines (case insensitive):
           <C-r>q             "Register 'q'
                 û3}          "Repeated 3 times
                    ús        "Mark the following to be removed:
                      <C-r>q* "Register 'q' repeated any number of times

Bu, daha basit bir çözümden zar zor kısadır:

Íã[aeiou]û3}ús[aeiou]*

(22 bayt)


0

Ruby, 44 bayt

><<$<.read.gsub(/([aeiou]{3})[aeiou]+/i,'\1')

Misal:

% ruby -e "$><<$<.read.gsub(/([aeiou]{3})[aeiou]+/i,'\1')" <<< "
Aeiou
screeeen
We're queueing up for the Hawaiian movie.
Spaces break runs: aei iou."

Aei
screeen
We're queung up for the Hawaiin movie.
Spaces break runs: aei iou.

Bunu yazdınız: “Girdi, yalnızca yazdırılabilir ASCII karakteri (0x20 - 0x7E, dahil) içeren bir dizedir. O zaman neden $<.readbunun yerine çok satırlı girdiyi (dolayısıyla aralık dışı karakter 0x0a içeren) işlemek için fazladan karakter harcamak gets?
manatwork

@manatwork bu gerçekten iyi bir nokta, teşekkür ederim! 2-3 bayt kurtarabileceğini düşün :)
Joseph Weissman
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.