Temukan polifitong saya!


19

Untuk keperluan tantangan ini, sebuah polyphthong didefinisikan sebagai irisan yang berdekatan dari sebuah String, yang hanya berisi vokal, dan memiliki panjang setidaknya 2. Diberikan String yang tidak kosong sebagai input, tugas Anda adalah untuk mengeluarkan semua polyphthong yang dikandungnya. .

Misalnya, "abeoic"memiliki irisan yang berdekatan berikut ini (dipisahkan ruang):

a b e o i c ab be eo oi ic abe beo eoi oic abeo beoi eoic abeoi beoic abeoic

Menghapus yang mengandung apa pun selain vokal, atau memiliki panjang lebih kecil dari 2, kami mendapatkan poliphong yang kami inginkan:

eo oi eoi

Kiriman Anda harus mematuhi aturan berikut:

  • Anda dapat memilih huruf kecil atau besar untuk I / O, tetapi case keluaran harus cocok dengan case input.

  • Vokal adalah aeiou(untuk huruf kecil) dan AEIOU(untuk huruf besar). ySaya Ytidak dianggap sebagai vokal.

  • Input hanya akan berisi ASCII yang dapat dicetak.

  • Jika polyphthong muncul beberapa kali, Anda dapat memilih untuk hanya menghasilkan satu kali atau menampilkan semua kemunculannya.

  • Format dan metode I / O yang masuk akal dibolehkan (daftar karakter juga baik-baik saja, baik untuk input maupun output).

Uji Kasus

Input -> Output (huruf kecil)

r67 ^^ () * 6536782! 87 -> []
teka-teki pemrograman dan golf kode -> []
aaand ... aku menang! -> ['aa', 'aa', 'aaa']
abeoic -> ['eo', 'oi', 'eoi']
yah eioo ala -> ['ei', 'io', 'oo', 'eio', 'ioo', 'eioo']
@yabeeeayio__e -> ['ee', 'ee', 'ea', 'io', 'eee', 'eea', 'eeea']
0ioen0aaiosnjksd -> ['io', 'oe', 'aa', 'ai', 'io', 'ioe', 'aai', 'aio', 'aaio']

Perhatikan bahwa untuk kasus uji 3 dan 6, Anda dapat mengeluarkan 'aa'dan 'ee'masing - masing hanya sekali (Lihat aturan keempat).

Ini adalah , pengiriman terpendek dalam byte di setiap bahasa menang!


Perhatikan bahwa ini awalnya diposting sebagai CMC (Tantangan Obrolan Mini) di The Nineteenth Byte , tetapi Adám mengatakan bahwa ini cocok untuk Main , jadi saya akhirnya memposting ini.
Tn. Xcoder

Saya uji kasus ketiga Anda, 'aa'muncul dua kali. Apakah seseorang harus mengeluarkan string yang sama beberapa kali jika muncul di berbagai lokasi atau dapatkah satu hanya menampilkan polip unik?
Jonathan Frech

@ JonathanFrech Ok, saya kira mengeluarkan polyphtong yang unik tidak masalah. Akan diedit.
Tn. Xcoder

Apakah urutan output penting?
Ovs

1
@ Xophmeister Untuk keperluan tantangan ini , sebuah polyphthong didefinisikan sebagai - Saya tahu itu bukan definisi linguistik yang benar :-)
Tn. Xcoder

Jawaban:


7

Python 2 , 102 97 byte

terima kasih kepada @JonathanFrech untuk -5 byte

w=input();l=range(len(w)+1)
print{w[a:b]for a in l for b in l if b-a>1<set(w[a:b])<=set('aeiou')}

Cobalah online!

huruf kecil I / O


1
Saya pikir Anda tidak perlu ...AEIOU', karena Anda hanya diperbolehkan mengambil huruf kecil sebagai input.
Jonathan Frech


@JonathanFrech print([w[a:b]for a in l for b in l[a+2:]if{*w[a:b]}<={*'aeiou'}])bekerja untuk 93.
Lynn

@ Lynn Dan solusi Anda menghasilkan 96 Python 2 byte .
Jonathan Frech

6

JavaScript (ES6), 77 75 byte

Mengharapkan input dalam huruf kecil. Menghasilkan polyphthong unik tanpa berulang.

w=>(r=[],g=s=>w.match(s)&&[...'aeiou'].map(c=>g(s+c),s[1]&&r.push(s)))``&&r

Uji kasus

Bagaimana?

Kami secara rekursif membangun pohon dari semua kemungkinan polyphthong, memangkas cabang segera setelah simpul saat ini tidak terkandung dalam input lagi, dan menyimpan semua node yang cocok minimal 2 karakter.

w => (                      // given the input w
  r = [],                   // r = array of results
  g = s =>                  // g = recursive function taking s
    w.match(s) &&           // if w contains s:
    [...'aeiou'].map(c =>   //   for each vowel c:
      g(s + c),             //     do a recursive call with s + c
      s[1] &&               //     if s is at least 2-character long:
      r.push(s)             //       push it into r
    )                       //   end of map()
)``                         // initial call to g() with s = ''
&& r                        // return r

6

Retina , 23 20 byte

M!&`[aeiou]+
r!&`..+

Cobalah online!

Ini mencetak semua kemunculan polyphthong.

Penjelasan

Retina memang memiliki cara untuk mendapatkan semua pertandingan yang tumpang tindih , tetapi apa artinya ini adalah bahwa ia akan mencari satu pertandingan dari setiap posisi. Jadi jika ada beberapa pertandingan dari posisi yang sama, ini hanya akan mengembalikan salah satunya. Satu-satunya cara untuk benar-benar mendapatkan semua pertandingan yang tumpang tindih adalah menggunakan fitur ini dua kali, sekali mencocokkan dari kiri ke kanan dan sekali dari kanan ke kiri (sehingga kami pertama-tama mendapatkan kecocokan terpanjang dari setiap posisi awal yang memungkinkan, dan kemudian kami juga mendapatkan semua kecocokan untuk posisi akhir yang mungkin).

Jadi program yang sebenarnya:

M!&`[aeiou]+

Dapatkan semua vokal yang tumpang tindih. Apa ini sebenarnya berarti untuk mendapatkan semua sufiks dari semua vokal berjalan.

r!&`..+

Sekarang dapatkan semua awalan dengan panjang minimal 2, dengan mencocokkan dari kanan ke kiri. Ini Mtersirat di sini, karena ini adalah baris terakhir dari program.


Bisakah Anda menjelaskan kodenya?
Adám

!&`[aeiou]{2,}adalah begitu dekat dengan benar , apakah ada cara untuk mendapatkannya rakus sehingga pertandingan melawan io?
AdmBorkBork

1
@ Adám Menambahkan penjelasan.
Martin Ender

@ AdmBorkBork Penjelasan saya semacam mencakup mengapa itu tidak berhasil. Retina tidak mengutak-atik mesin regex yang sebenarnya, jadi yang paling &bisa dilakukan adalah mencoba untuk pertandingan dari setiap posisi, sehingga Anda tidak dapat memiliki beberapa pertandingan dengan panjang yang berbeda dari posisi yang sama. Itu sebabnya saya butuh tahap kedua.
Martin Ender

Penjelasan yang bagus, terima kasih.
AdmBorkBork

5

QuadS , 20 + 1 = 21 byte

⊃,/⍵
[aeiou]+
1↓,\⍵M

dengan obendera

Cobalah online!

Dalam urutan hal-hal yang terjadi:

[aeiou]+ pada setiap pertandingan PCRE ini

,\⍵M awalan Pertandingan

1↓ jatuhkan yang pertama (yang memiliki satu vokal)

,/⍵ merangkai semua daftar awalan

 mengungkapkan (karena pengurangan /terlampir)


Ini setara dengan fungsi diam APL Dyalog:

{⊃,/⍵}'[aeiou]+'S{1↓,\⍵.Match}⍠'OM'1

Cobalah online!



4

Java (OpenJDK 8) , 138 135 134 byte

s->{String e,x="";for(int i=0,j,y=s.length();i<=y;i++)for(j=y;j>i;x+=e.matches("[aeiou]{2,}")?e+" ":"")e=s.substring(i,j--);return x;}

Cobalah online!


i<y-1bisa i<=ydan String#matchessecara implisit memeriksa seluruh String, sehingga Anda tidak perlu ^ dan $. +1 untuk mengalahkan saya karenanya. Baru saja memposting jawaban 138 byte saya sendiri (tetapi dengan perubahan ini saya mengusulkan Anda lebih pendek). :)
Kevin Cruijssen


3

Jelly , 9 byte

ẆḟÐḟØcḊÐf

Cobalah online!

Penjelasan

ẆḟÐḟØcḊÐf  Main Link
Ẇ          Get all (contiguous) sublists
  Ðḟ       Filter; remove all elements where the result is truthy:
 ḟ  Øc     Filter; remove all vowels; if it's truthy, then it contains non-vowels
       Ðf  Filter; keep elements where the result is truthy:
      Ḋ    Dequeue; return all but the first element (truthy if the length was at least 2)

-4 byte terima kasih kepada Tn. Xcoder


11 byte dengan mengganti L>1$$dengan L’$.
Tn. Xcoder

Sebenarnya Anda bisa mengganti L’$dengan untuk 9 byte . Setara akan ẆṫLḊḟÐḟØc.
Tn. Xcoder


3

R , 137 byte

dikalahkan oleh Mark !

function(S)(x=unlist(sapply((s=el(strsplit(S,"[^aeiou]")))[nchar(s)>1],function(x)substring(x,1:(n=nchar(x)),rep(n:1,e=n)))))[nchar(x)>1]

Cobalah online!

function(S){
 s <- el(strsplit(S,"[^aeiou]"))            # split on non-vowels
 s <- s[nchar(s)>1]                         # vowel groups of length at least 2
 p <- function(x){                          # generates all substrings of inputs
  n <- nchar(x)
  start <- 1:n
  stop <- rep(n:1, n)                       # this will generate dups
  substring(x, start, stop)
} q <- unlist(sapply(s, p)) # all substrings q <- q[nchar(q)>1] # all length-2 or more substrings }


Anda tidak perlu unique.
Tn. Xcoder

"Format dan metode I / O yang masuk akal dibolehkan (daftar karakter juga baik-baik saja, baik untuk input maupun output)." Saya belum mencobanya, tapi saya kira ini bisa menjadi jauh lebih singkat jika Anda menggunakan daftar karakter sejak awal.
user2390246

@ user2390246 mungkin. Saya tidak yakin bahwa itu akan membantu, tapi itu mungkin hanya karena pendekatan untuk mengisolasi vokal akan sangat berbeda dan saya tidak bisa membungkus kepala saya di sekitarnya sekarang.
Giuseppe


2

PowerShell , 93 88 byte

param($a)0..($b=$a.count-1)|%{($i=$_)..$b|%{-join$a[$i..$_]}}|?{$_-match'^[aeiou]{2,}$'}

Cobalah online!

Gunakan huruf kecil / huruf besar I / O (atau campuran!).

Pinjam kode dari jawaban saya pada Substring Meledak untuk mendapatkan semua substring, kemudian tarik keluar yang regex -matchterhadap ^[aeiou]{2,}$- yaitu, mereka yang setidaknya dua vokal panjangnya dan hanya vokal. String-string tersebut ditinggalkan di jalur pipa dan hasilnya tersirat.


2

Haskell , 148 137 130 123 118 byte

Berkat @Laikoni untuk -11 byte, lebih lanjut -7 byte dengan mengarahkan saya ke tips golf, -7 byte, dan lagi -5 byte, untuk total -30 byte kekalahan.

Ini sepertinya cocok untuk Haskell tetapi hasilnya tampaknya tidak setuju. Saya kira Haskell adalah pilihan yang baik-baik saja. Saya masih kesal dengan cara subsequenceskerjanya.

import Data.List
v=(`elem`"aeiou")
p s=nub$do x<-groupBy((.v).(&&).v)s;[y|y@(c:_:_)<-subsequences x,v c,y`isInfixOf`x]

Cobalah online!


1
Selamat datang di golf Haskell! Anda mungkin tertarik dengan koleksi kiat golf kami , panduan untuk aturan golf dan Of Monads and Men , ruang obrolan Haskell kami.
Laikoni

1
Beberapa catatan pada jawaban Anda: Baris baru memiliki jumlah byte yang sama ;, tetapi meningkatkan keterbacaan kode. Anda selalu menggunakan ebersama dengan v, sehingga Anda dapat langsung mendeklarasikan e=(elem "aeiou"). y!!0lebih pendek dari head y. Ada concatMapbukannya concat.map, tetapi bahkan lebih pendek (=<<)dari daftar monad yang memiliki efek yang sama.
Laikoni

1
Anda dapat mengimpor Data.Listsalih-alih Data.List. Yang pertama memiliki semua fungsi yang terakhir, tetapi juga hal-hal tambahan seperti powerslice, yang memberikan daftar semua urutan berkelanjutan.
nimi

1
Dalam daftar pemahaman, Anda dapat cocok pada y@(h:_:_)drop length y>1dan memperpendek v(y!!0)ke v h.
Laikoni

1
Saya memiliki dua ace lainnya di lengan baju saya: (1) (\x y->v x&&v y)dapat disingkat dengan mengonversikannya menjadi bebas titik, baik secara manual menggunakan tip ini atau dengan menggunakan pointfree.io . (2) Daftar monad juga dapat digunakan dengan donotasi, yaitu do x<-l;[...]sama dengan l>>=(\x->[...]). Btw, pada TIO Anda bisa memasukkan mainbidang header atau footer Anda agar jumlah byte sesuai dengan kiriman yang sebenarnya.
Laikoni

2

Perl, 45 byte

local $,=" ";print $_=~/(?=([AEIOU]{2,}))/ig;

Selamat datang di PPCG! Posting pertama yang bagus!
R

1
Jika Anda bertanya-tanya tentang downvote, itu secara otomatis ditempatkan oleh akun bot Komunitas karena pos Anda telah diedit. Maaf, tidak ada yang bisa kita lakukan tentang itu, itu perilaku bodoh. Semoga upvotes akan memicu pencabutan downvote otomatis.
HyperNeutrino

2

R , 120 byte, 110 byte

function(x){k=nchar(x);i=k:1;e=expand.grid(i,i[-1]);grep("^[aeiou]+$",mapply(substr,x,e[,2],e[,2]+e[,1]),v=T)}

Cobalah online!

Bagaimana itu bekerja

function(x){                  #initalize the anonymous function where input is stored in x
  k=nchar(x)                  #set k to the number of characters in x
  i=k:1                       #create vector of integers from k to 1
  e=expand.grid(i,i[-1])      #create matrix of full outer join on i 
                              #except in the second column, limit i to being less than k
  grep("^[aeiou]+$",          #search for strings made of only vowels
       mapply(substr,         #map the substring function
              x,              #with x as the string to subset
              e[,2],          #start at the second column of the outer join
              e[,2]+e[,1]     #end at the sum of the sum of the first and second columns
       ),
       v=T                    #if a match is found, return it's value
  )
}                             #by default, R returns the last line of a function

105 byte pendekatan yang bagus, saya akan menambahkan komentar ke solusi saya mencatat bahwa Anda telah mengungguli saya :)
Giuseppe

Saya akan jujur, saya sangat senang bahwa saya bisa datang dengan solusi alternatif untuk Anda :) Biasanya Anda sudah bertahun-tahun di depan saya atau mencari tahu semua kode yang saya tinggalkan di atas meja.
Tandai

1

C, 119 byte

f(char*s){*s&&f(s+1);char*t,*b=calloc(strlen(s),1);for(t=b;*s==65|*s==69|*s==73|*s==79|*s==85;b[1]&&puts(b))*t++=*s++;}

Cobalah online!


1

JavaScript (ES6), 105 byte

s=>eval('a=[];l=i=s.length;while(i--){j=l;while(j--)if(/^[aeiou]{2,}$/.test(t=s.slice(i,j)))a.push(t)}a')

Mungkin masih banyak golf yang harus dilakukan.

let f=
s=>eval('a=[];l=i=s.length;while(i--){j=l;while(j--)if(/^[aeiou]{2,}$/.test(t=s.slice(i,j)))a.push(t)}a')
console.log(JSON.stringify(f('r67^^()*6536782!87')))
console.log(JSON.stringify(f('programming puzzles and code golf')))
console.log(JSON.stringify(f('aaand... i won!')))
console.log(JSON.stringify(f('abeoic')))
console.log(JSON.stringify(f('yah eioo ala')))
console.log(JSON.stringify(f('@yabeeeayio__e')))
console.log(JSON.stringify(f('0ioen0aaiosnjksd')))



1

05AB1E , 10 byte

Œʒg≠}ʒžMм_

Cobalah online!

Penjelasan:

Œʒg≠}ʒžMм_  
Œ            Push all substrings (abeoic => a, b, e, ..., eoi, eoc, ... abeioc)
 ʒ  }        Filter elements for which result is 1
  g≠            Push 1 if length is != 1, 0 otherwise
     ʒ       Filter elements for which result is 1
      žMм       Remove all occurences of 'aeiou' from element
         _      Negative bool: push 1 if length == 0, 0 otherwise

Jawaban bagus! Saya punyaŒʒžMм_}ʒg≠
Tn. Xcoder

@ Mr.Xcoder Terima kasih. Saya juga punya ŒD1ùKʒžMм_10 byte. Saya mencoba mencari cara untuk menurunkannya
scottinet

1

C, 105 75 byte

Sebuah fungsi yang menerima pointer ke input huruf kecil, dan menghasilkan string yang dipisahkan ruang pada output standar:

i;f(char*p){for(i=strspn(p,"aeiou");i>1;)printf("%.*s ",i--,p);*p&&f(p+1);}

Program uji

#include <stdio.h>

int main(int argc, char **argv)
{
    for (int i = 1;  i < argc;  ++i) {
        char *in = argv[i];
        printf("'%s' -> [ ", in);
        f(in);
        puts("]");
    }
}

Demo

'r67^^()*6536782!87' -> [ ]
'programming puzzles and code golf' -> [ ]
'aaand... i won!' -> [ aaa aa aa ]
'abeoic' -> [ eoi eo oi ]
'yah eioo ala' -> [ eioo eio ei ioo io oo ]
'@yabeeeayio__e' -> [ eeea eee ee eea ee ea io ]
'0ioen0aaiosnjksd' -> [ ioe io oe aaio aai aa aio ai io ]

Penjelasan

#include <string.h>
#include <stdio.h>

void find_polyphthongs(char *p)
{
    /* from longest polyphthong substring down to 2 */
    for (int i = strspn(p,"aeiou");  i >= 2;  --i) {
        /* print exactly [p .. p+i] */
        printf("%.*s ", i, p);
    }

    /* tail-recurse to next char */
    if (*p) {
        find_polyphthongs(p+1);
    }
}

Menggunakan GCC di Debian Linux, saya sepertinya lolos dengan deklarasi implisit yang tidak kompatibel dari strchr()dan printf(). Platform lain mungkin mengharuskan <stdio.h>dan <string.h>untuk disertakan.

Cobalah secara online (memerlukan Javascript).


Tidak f(p)char*p;bisa f(char*p)?
Jonathan Frech

Benar - Aku awalnya punya output penyimpanan pemanggil-dialokasikan: f(s,d)char*s,*d.
Toby Speight


1

APL (Dyalog) , 53 byte

Ini adalah Dfn( d irect f unctio n ). Penggunaan adalah p '<argument>'. Peringatan yang adil: ini tidak terlalu efisien dan waktu habis untuk input > 8 charactersdi TIO, tetapi bekerja secara normal ketika diberikan waktu yang cukup.

p←{(G∊⊃,/⌽,\∘⌽¨,\⌽⍵)/G←⊃,/{(,v∘.,⊢)⍣⍵⊢v'aeiou'}¨⍳≢1↓⍵}

Cobalah online!

Terima kasih kepada @ Adám selama 16 byte!

Bagaimana itu bekerja:

Ini lebih mudah dipahami jika kita memecah kode dalam porsi yang lebih kecil:

  • Bagian 1 - G←⊃,/{(,v∘.,⊢)⍣⍵⊢v←'aeiou'}¨⍳≢1↓⍵: Bagian ini dari fungsi mengambil panjang argumen (kanan) dan mencampur vektor aeiouitu sendiri berkali-kali, menghasilkan setiap kombinasi yang mungkin dari [2, length(right arg)]vokal.
  • Bagian 2 - (G∊⊃,/⌽,\∘⌽¨,\⌽⍵)/: Bagian ini memeriksa elemen G yang merupakan anggota dari substring input. Ini mengembalikan vektor boolean, dengan 1's di indeks kombinasi vokal yang ada di input dan 0di mana mereka tidak. Vektor yang dihasilkan kemudian dipetakan ( /) di atas G, mengembalikan elemen yang sesuai dengan nilai-nilai yang sebenarnya.

Semuanya kemudian ditugaskan p. p←tidak termasuk dalam jumlah byte karena itu tidak perlu , itu hanya membuat penggunaan fungsi lebih mudah.


Golf lebih jauh. Juga, Anda seharusnya tidak menggunakan untuk memfilter. Gunakan /.
Adám


1

Ruby 2.4, 100 byte

(2..(b=(a=gets).size-1)).to_a.flat_map{|i|(0..(b-i)).to_a.map{|j|a[j,i]}}.select{|k|k=~/^[aeiou]+$/}

Ini adalah upaya pertama saya bermain golf, dan saya yakin ada banyak cara untuk mempersingkat kode ini.




0

T-SQL (SQL Server 2014), 281 byte

;with s as(select substring(@,1,1)C,stuff(@,1,1,'')D,1 R union all select substring(D,1,1),stuff(D,1,1,''),R+1from s where len(D)>0),c as(select R i,C w from s where C LIKE'[aeiou]'union all select R,w+C from c join s ON i+1=R where s.C LIKE'[aeiou]')select w from c where len(w)>1

Masukan diberikan oleh

declare @ varchar(max) = 'abeoic'

Menggunakan ekspresi tabel umum suntuk meledakkan input menjadi beberapa huruf yang diurutkan, dan kemudian ekspresi tabel umum kedua cuntuk menghasilkan semua kombinasi yang diurutkan, membuang non vokal.

SQL Fiddle


0

PHP, 139 byte

function y($s){$p=[];$l=strlen($s);for($i=2;$i<=$l;$i++)for($j=0;$j<=$l-$i;$j++)strspn($a=substr($s,$j,$i),'aeiou')==$i&&$p[]=$a;return$p;}

Demo online

function yreadable($s)
{
    $p = [];
    $l = strlen($s);
    for($i=2; $i<=$l; $i++)
        for($j=0; $j<=$l-$i; $j++)
            strspn($a=substr($s,$j,$i),'aeiou')==$i
            && $p[] = $a;
    return $p;
}

Bagaimana itu bekerja

Pilih sub-string (dimulai dengan panjang 2) yang terdiri dari karakter yang berdekatan dan bergerak di sepanjang string. Kumpulkan sub-string yang hanya berisi vokal. Ulangi dengan sub-string yang lebih panjang.

Untuk string 'abcdef' ini adalah substring yang dihasilkan dan diperiksa:

'ab','bc','cd','de','ef'
'abc','bcd','cde','def'
'abcd','bcde','cdef'
'abcde','bcdef',
'abcdef'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.