Hapus lebih dari n vokal berturut-turut dari string input

19

Saya tidak suka string dengan lebih dari tiga vokal berturut-turut. Bisakah Anda menulis program yang menghapus semua vokal yang tidak saya inginkan dari kata-kata?

Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter function (out).

Input adalah string yang hanya berisi karakter ASCII yang dapat dicetak (0x20 hingga 0x7E, inklusif).

Output adalah string yang hanya mengandung paling banyak 3 vokal berturut-turut. Jika ada aliran lebih dari 3 vokal berturut-turut dalam string input, program Anda harus menghasilkan string output termasuk tiga vokal pertama yang ditemukan dalam menjalankan itu, membuang vokal berturut-turut selanjutnya.

Y bukan vokal untuk tujuan tantangan ini.

Ini adalah kode golf, jadi kode terpendek (dalam byte) menang.

Uji Kasus

"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."
Joseph Weissman
sumber
2
Anda harus memasukkan beberapa tes lagi dengan case campuran, seperti aaYYAAaaaAERGH.
Zgarb

Jawaban:

5

Pyth, 21 byte

sfg3=Z&}rT0"aeiou"hZz

Cobalah online: Demonstrasi atau Test Suite

Penjelasan:

Saya beralih melalui semua karakter dan melacak berapa banyak vokal yang saya lewati menggunakan penghitung. Setiap kali saya melewati char, yang bukan vokal, saya mereset penghitung ke 0. Saya mengembalikan chars, setiap kali penghitungnya> 4.

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
Jakube
sumber
10

Tidak dapat dibaca , 1647 byte

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

Penjelasan

Program ini setara dengan pseudocode seperti ini:

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
    }
}

dengan tugas variabel berikut:

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)

Seperti yang Anda lihat, saya menghindari slot variabel 0 karena 0 konstanta yang panjang untuk menulis.

Jadi kami membaca setiap karakter dan menyimpan nilai di keduanya cpdan ch. Kami akan memodifikasi cptetapi tetap menggunakannya chsehingga kami dapat mencetaknya jika perlu. Kami berturut-turut mengurangi angka 65, 4, 4, 6, dll. Dari cpuntuk memeriksa apakah masing-masing dari 10 karakter vokal yang mungkin di ASCII (perhatikan yang terakhir tidak perlu menjadi tugas).

vsselalu mengandung 3 kurang dari jumlah vokal yang masih diperbolehkan untuk dicetak. Ini dimulai pada 0, sehingga 3 vokal dapat dicetak. Ketika itu mencapai-3 , kami berhenti mencetak vokal.

Jika kita menemukan non-vokal (termasuk spasi), kita jalankan print(ch)diikuti olehvs = 0 . Seperti yang mungkin sudah Anda duga, ini akan mengatur ulang penghitung vokal.

Jika kita menemukan vokal , kita mengeksekusi ((--vs)+4) ? print(ch) : (++vs). Mari kita uraikan ini:

  • pengurangan vs;
  • jika nilainya sekarang -4, kita sudah melangkah terlalu jauh, jadi jangan cetak apa pun, tetapi naikkan vskembali -3sehingga kita akan terus menolak untuk mencetak vokal;
  • jika tidak, cetak karakter.
Timwi
sumber
1
Bahasa ini sesuai dengan namanya.
bkul
2
Saya selalu bertanya-tanya dalam bahasa-bahasa ini ... "Apakah mereka benar-benar menulis ini dengan tangan? Jika demikian, saya kasihan pada mereka ..." +1
Addison Crump
9

Retina , 25 byte

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

Cobalah online.

Substitusi regex yang cukup mudah. Ini juga berfungsi untuk jumlah byte yang sama:

Ri`(?<=[aeiou]{3})[aeiou]
Martin Ender
sumber
3
Akhirnya! Seorang penerjemah online! Anda harus mempertimbangkan menautkannya di halaman github Anda.
mbomb007
6

JavaScript (ES6), 42

Sebagai fungsi anonim

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

Perl, 27 karakter

(26 karakter kode + 1 opsi baris perintah karakter)

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

Bukan masalah besar, hanya kesempatan langka yang saya ingat \Kada.

Contoh dijalankan:

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.
manatwork
sumber
2
Ketika saya menulis jawaban Retina saya pikir "Saya berharap .NET regex punya \K". :)
Martin Ender
Menarik, @ MartinBüttner. Saya merasa ekspresi reguler itu diberikan pada diet steroid yang serius. Untuk rasa ingin tahu, apakah mereka memiliki subpattern rekursif? Dapat membantu untuk cadangan satu vokal pencacahan, meskipun hasilnya lebih panjang: s/([aeiou]{1,3})(?1)+/$1/gi.
manatwork
Sayangnya, mereka juga tidak memiliki pola yang digunakan kembali. Itulah dua hal yang terkadang membuat saya beralih ke Perl atau PCRE. Ketika saya menyiasati untuk menambal beberapa hal sederhana ke dalam rasa regex Retina, saya pikir saya akan menambahkannya (bukan rekursi sejati, tetapi setidaknya pola reuse dan rekursi terbatas).
Martin Ender
2

Serius, 34 byte

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

Hex Dump:

2c3b9730bb604f6b226165696f75224f6b
642d593bbd2b2a3bbb343e604d40b0ee6a

Cobalah online

Ia menggunakan algoritme yang sama dengan jawaban Pyth, memetakan di atas string sambil melacak panjangnya arus vokal dalam register, menambahkannya kapan pun karakter saat ini adalah vokal, dan memeriksa apakah telah melebihi panjang yang diizinkan, mengembalikan 0 jika demikian, dan kemudian memfilter string asli dengan filter yang dihasilkan ini. Ini akan menjadi jauh lebih singkat setelah kita bisa menggunakan set pengurangan pada string. ( OkDapat dihapus dan Okdbisa diganti dengan adil @). Saya mendengar fitur ini akan muncul di pembaruan berikutnya ....

kuintopia
sumber
2

C, 166 byte

bukan jawaban terpendek sejauh ini tapi baik golf saya pikir ..

#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++;}

Kasus cobaan:

$ 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
Cleblanc
sumber
2

Mathematica, 68 byte

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

Jawaban regex akan memiliki panjang yang sama, tetapi siapa yang menggunakan regex?

LegionMammal978
sumber
2

Java, 115 byte

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

Diharapkan input sebagai parameter program.

Output tes unit:

Aei
screeen
We're queung up for the Hawaiin movie.
Tomas Langer
sumber
Simpan satu byte dengan menghapus spasi di antara String[]dan a. String[]a
Poke
Hemat 2 byte dengan menggunakan printdaripada println. Saya tidak percaya spek membutuhkan baris baru.
Poke
2

APL, 40 karakter

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

Dalam Bahasa Inggris:

  • 'aeiouAEIOU'∊⍨' ',⍵: temukan vokal (dan beri spasi untuk memecah rotasi);
  • (1-⍳4)⌽¨⊂: putar 0, 1, 2, 3 kali (dengan lilitan) mendorong ke kanan vektor boolean;
  • ⊃+/ sum: rotasi dan unbox
  • 1↓4≠: temukan yang berbeda dari 4, dan hapus yang pertama (untuk mengumpulkan ruang yang kita tambahkan)
  • ⍵/⍨: dalam argumen, simpan hanya elemen yang jumlahnya berbeda dari 4.
lstefano
sumber
1

Perl 6 ,  36  35 byte

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

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

pemakaian:

$ 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.
Brad Gilbert b2gills
sumber
1

C (205 byte)

#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);}}}}

(Satu baris ditambahkan untuk kejelasan)

musarithmia
sumber
1

Scala, 107 byte

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
Ruslan
sumber
1

Javascript ES6, 43 karakter

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

Uji:

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])
Qwertiy
sumber
1

x86 file MS-DOS .COM , 44 byte 36 byte

File .COM secara luas didukung dari MS-DOS 1 hingga sekarang --- Saya menjalankan dalam dosemu, hanya menggunakan 8086 perintah.

Mengurangi 44-36 byte dengan menggunakan REPNE SCASB untuk menguji vokal alih-alih menggunakan perintah terpisah untuk menguji setiap vokal.

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
Krubo
sumber
1

Matlab / Oktaf, 54 byte

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

Contoh:

>> @(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.

Cobalah di ideone .

Luis Mendo
sumber
1

V , 21 byte (tidak bersaing)

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

Cobalah online!

Penjelasan:

ñ[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

Ini hanya lebih pendek dari solusi yang lebih mudah:

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

(22 byte)

DJMcMayhem
sumber
0

Ruby, 44 byte

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

Contoh:

% 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.
Joseph Weissman
sumber
Anda menulisnya: “Input adalah string yang hanya berisi karakter ASCII yang dapat dicetak (0x20 hingga 0x7E, inklusif).” Lalu mengapa mengeluarkan karakter tambahan $<.readuntuk membuatnya menangani input multiline (dengan demikian mengandung karakter 0x0a di luar jangkauan) alih-alih gets?
manatwork
@manatwork itu poin yang sangat bagus, terima kasih! Pikir itu mungkin menghemat 2-3 byte :)
Joseph Weissman