ลบสระที่ต่อเนื่องกันมากกว่า n สระออกจากสตริงป้อนข้อมูล


19

ฉันไม่ชอบสตริงที่มีสระมากกว่าสามสระในหนึ่งแถว คุณสามารถเขียนโปรแกรมที่ลบสระทั้งหมดที่ฉันไม่ต้องการออกจากคำศัพท์ได้หรือไม่?

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

อินพุตเป็นสตริงที่มีอักขระ ASCII ที่พิมพ์ได้เท่านั้น (0x20 ถึง 0x7E รวมอยู่ด้วย)

เอาท์พุทเป็นสตริงที่มีเพียงการทำงานที่มากที่สุด 3 สระติดต่อกัน หากมีการเรียกใช้สระมากกว่า 3 สระติดต่อกันในสายป้อนโปรแกรมของคุณควรสร้างสตริงเอาท์พุทรวมถึงสระสามสระแรกที่พบในการทำงานนั้น

Y ไม่ใช่เสียงสระสำหรับจุดประสงค์ของการท้าทายนี้

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

กรณีทดสอบ

"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
aaYYAAaaaAERGHคุณควรจะรวมถึงการทดสอบบางอย่างมากขึ้นกับกรณีผสมเช่น
Zgarb

คำตอบ:


5

Pyth, 21 ไบต์

sfg3=Z&}rT0"aeiou"hZz

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

ฉันวนซ้ำทุกตัวอักษรและติดตามจำนวนสระที่ฉันส่งผ่านโดยใช้เคาน์เตอร์ ทุกครั้งที่ฉันส่งถ่านซึ่งไม่ได้เป็นเสียงสระฉันจะรีเซ็ตตัวนับเป็น 0 ฉันจะเรียงตัวอักษรใหม่ทุกครั้งที่ตัวนับ> 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

10

ไม่สามารถอ่านได้ 1647 ไบต์

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

คำอธิบาย

โปรแกรมนี้เทียบเท่ากับ pseudocode เช่นนี้:

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

ด้วยการกำหนดตัวแปรต่อไปนี้:

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)

อย่างที่คุณเห็นฉันหลีกเลี่ยงตัวแปรสล็อต 0 เพราะ0ค่าคงที่ยาวนานในการเขียน

ดังนั้นเราอ่านตัวละครแต่ละตัวและเก็บค่าทั้งในและcp chเราจะแก้ไขcpแต่เก็บไว้chเพื่อที่เราจะสามารถพิมพ์ได้หากจำเป็น เราทำการลบตัวเลข 65, 4, 4, 6 และอื่น ๆ อย่างต่อเนื่องcpเพื่อตรวจสอบว่าเป็นตัวอักษรเสียงสระที่เป็นไปได้ 10 ตัวใน ASCII หรือไม่

vsมักจะมี 3 น้อยกว่าจำนวนของสระที่ยังคงได้รับอนุญาตให้พิมพ์ มันเริ่มต้นที่0จึงสามารถพิมพ์เสียงสระได้ 3 เสียง เมื่อมาถึง-3เราจะหยุดพิมพ์สระ

ถ้าเราพบไม่ใช่สระ (รวมทั้งพื้นที่) เรารันตามมาด้วยprint(ch) vs = 0ในขณะที่คุณคาดเดาอาจตั้งค่าเคาน์เตอร์สระ

ถ้าเราพบสระ((--vs)+4) ? print(ch) : (++vs)เราดำเนินการ เราจะทำลายสิ่งนี้ลง:

  • การลดลงvs;
  • ถ้าค่าอยู่ในขณะนี้-4เราได้ไปไกลเกินไปจึงไม่พิมพ์อะไร แต่เพิ่มขึ้นvsกลับไป-3ดังนั้นเราจะยังคงปฏิเสธที่จะพิมพ์สระ;
  • มิฉะนั้นให้พิมพ์อักขระ

1
ภาษานี้เป็นจริงกับชื่อของมัน
bkul

2
ฉันมักจะสงสัยในภาษาเหล่านี้ ... "พวกเขาเขียนด้วยมือจริง ๆ หรือไม่ถ้าใช่ฉันก็สงสารพวกเขา ... " +1
Addison Crump

9

เรติน่า 25 ไบต์

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

ลองออนไลน์

การทดแทน regex ตรงไปตรงมาอย่างยุติธรรม วิธีนี้ใช้ได้กับจำนวนไบต์เดียวกันด้วย:

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

3
ที่สุด! ล่ามออนไลน์! คุณควรพิจารณาเชื่อมโยงไปยังหน้า GitHub ของคุณ
mbomb007


4

Perl, 27 ตัวอักษร

(รหัสอักขระ 26 ตัวเลือกตัวเลือกบรรทัดคำสั่ง 1 ตัว)

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

ไม่ใช่เรื่องใหญ่ แต่เป็นโอกาสที่หายากที่ฉันจำ\Kได้

วิ่งตัวอย่าง:

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 ฉันคิดว่า "ฉันหวังว่า. NET regex จะมี\K" :)
Martin Ender

น่าสนใจ @ MartinBüttner ฉันมีความรู้สึกว่าการแสดงออกปกติเหล่านั้นถูกวางในอาหารเตียรอยด์อย่างจริงจัง สำหรับความอยากรู้อยากเห็นพวกเขามีรูปแบบย่อยซ้ำ? สามารถช่วยในการสำรองหนึ่งสระแจงนับ s/([aeiou]{1,3})(?1)+/$1/giแต่ผลที่ได้คืออีกต่อไป:
จัดการ

น่าเสียดายที่พวกเขาไม่ได้ใช้รูปแบบซ้ำอีกด้วย นี่คือสองสิ่งที่ทำให้ฉันเปลี่ยนเป็น Perl หรือ PCRE เป็นครั้งคราว เมื่อฉันได้รับการแก้ไขสิ่งที่เรียบง่ายลงในรสชาติ regex ของ Retina ฉันคิดว่าฉันจะเพิ่มเหล่านั้น (ไม่ใช่การเรียกซ้ำที่แท้จริง แต่อย่างน้อยรูปแบบการใช้ซ้ำและการเรียกซ้ำ จำกัด )
Martin Ender

2

อย่างจริงจัง 34 ไบต์

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

ฐานสิบหก:

2c3b9730bb604f6b226165696f75224f6b
642d593bbd2b2a3bbb343e604d40b0ee6a

ลองออนไลน์

มันใช้อัลกอริธึมแบบเดียวกับคำตอบของ Pyth การแมปผ่านสายอักขระขณะที่ติดตามความยาวของการเรียกสระปัจจุบันในการลงทะเบียนเพิ่มขึ้นทุกครั้งที่อักขระปัจจุบันเป็นสระและตรวจสอบว่ามีความยาวเกินความยาวที่อนุญาตหรือไม่ กลับ 0 ถ้าเป็นเช่นนั้นแล้วกรองสตริงเดิมด้วยตัวกรองที่สร้างขึ้นนี้ มันจะสั้นลงมากเมื่อเราใช้การตั้งค่าการลบกับสตริง ( Okสามารถลบได้และOkdสามารถแทนที่ด้วยเพียง@) ฉันได้ยินมาว่าฟีเจอร์นี้กำลังมาในการอัพเดทครั้งต่อไป ....


2

C, 166 ไบต์

ไม่ใช่คำตอบที่สั้นที่สุดโดยไกล แต่ฉันคิดว่า ..

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

กรณีทดสอบ:

$ 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 ไบต์

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

คำตอบ regex จะมีความยาวเท่ากัน แต่ใครใช้ regex


2

Java, 115 ไบต์

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

ต้องการอินพุตเป็นพารามิเตอร์โปรแกรม

เอาต์พุตทดสอบหน่วย:

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

บันทึกหนึ่งไบต์โดยการลบช่องว่างระหว่างและString[] aString[]a
Poke

บันทึก 2 ไบต์โดยใช้มากกว่าprint printlnฉันไม่เชื่อสเป็คต้องขึ้นบรรทัดใหม่
Poke

2

APL, 40 ตัวอักษร

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

เป็นภาษาอังกฤษ:

  • 'aeiouAEIOU'∊⍨' ',⍵: ค้นหาเสียงสระ (และเพิ่มพื้นที่เพื่อหยุดหมุน);
  • (1-⍳4)⌽¨⊂: หมุน 0, 1, 2, 3 ครั้ง (โดยล้อมรอบ) ดันไปทางขวาเวกเตอร์บูลีน;
  • ⊃+/ sum: การหมุนและ unbox
  • 1↓4≠: ค้นหาความแตกต่างจาก 4 และลบอันแรก (เพื่อหาพื้นที่ที่เราได้เตรียมไว้)
  • ⍵/⍨: ในการโต้แย้งให้เก็บเฉพาะองค์ประกอบที่ผลรวมนั้นแตกต่างจาก 4

1

Perl 6 ,  36  35 bytes

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

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

การใช้งาน:

$ 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 ไบต์)

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

(เพิ่มตัวแบ่งหนึ่งบรรทัดเพื่อความชัดเจน)



1

Javascript ES6, 43 ตัวอักษร

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

ทดสอบ:

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 , 44 ไบต์ 36 ไบต์

ไฟล์. COM ได้รับการสนับสนุนอย่างกว้างขวางจาก MS-DOS 1 ถึงปัจจุบัน --- ฉันใช้งานใน dosemu โดยใช้คำสั่ง 8086 เท่านั้น

ลดลงจาก 44 เป็น 36 ไบต์โดยใช้ REPNE SCASB เพื่อทดสอบเสียงสระแทนการใช้คำสั่งแยกต่างหากเพื่อทดสอบเสียงสระแต่ละตัว

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

V , 21 ไบต์ (ไม่ใช่การแข่งขัน)

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

ลองออนไลน์!

คำอธิบาย:

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

นี่เพิ่งจะสั้นกว่าโซลูชันที่ตรงไปตรงมามากขึ้น:

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

(22 ไบต์)


0

Ruby, 44 ไบต์

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

ตัวอย่าง:

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

คุณเขียนมัน:“ อินพุตเป็นสตริงที่มีอักขระ ASCII ที่พิมพ์ได้เท่านั้น (0x20 ถึง 0x7E, รวมแล้ว)” ทำไมจึงใช้อักขระพิเศษ$<.readเพื่อให้จัดการกับอินพุตหลายบรรทัด (ดังนั้นจึงประกอบด้วยอักขระช่วง 0x0a) แทนที่จะเป็นgets?
จัดการ

@ การทำงานเป็นจุดที่ดีจริงๆขอบคุณ! คิดว่ามันอาจบันทึก 2-3 ไบต์ :)
โจเซฟ Weissman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.