Çok sesli telefonumu bul!


19

Bu zorluğun amaçları doğrultusunda, bir polifhthong , yalnızca ünlüler içeren ve uzunluğu en az 2 olan bitişik bir dilim olarak tanımlanır. .

Örneğin "abeoic", aşağıdaki bitişik dilimlere (boşlukla ayrılmış) sahiptir:

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

Sesli harflerden başka bir şey içeren veya 2'den küçük bir uzunluğa sahip olanları kaldırarak, istediğiniz polifonları elde ederiz:

eo oi eoi

Gönderileriniz aşağıdaki kurallara uymalıdır:

  • G / Ç için küçük veya büyük harf seçebilirsiniz, ancak çıkış durumu giriş durumu ile eşleşmelidir.

  • Ünlüler aeiou(küçük harf için) ve AEIOU(büyük harf için) şeklindedir. y/ Ysesli harf sayılmaz.

  • Giriş yalnızca yazdırılabilir ASCII içerecektir.

  • Bir poliphthong birden çok kez görünürse, yalnızca bir kez çıkmayı veya tüm oluşumlarını çıkarmayı seçebilirsiniz.

  • Makul I / O formatı ve yöntemine izin verilir (hem giriş hem de çıkış için karakter listeleri de iyidir).

Test Durumları

Giriş -> Çıkış (küçük harf)

r67 ^^ () * 6536782! 87 -> []
programlama bulmaca ve kod golf -> []
aaand ... kazandım! -> ['aa', 'aa', 'aaa']
abeoik -> ['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']

Test durumları 3 ve 6 için, sırasıyla 'aa've 'ee'sadece bir kez çıkabileceğinizi unutmayın (Bkz. Dördüncü kuralı).

Bu , her dilde bayt en kısa teslim kazanır!


Bunun orijinal olarak On dokuzuncu Bayt'ta bir CMC (Sohbet Mini Mücadelesi) olarak gönderildiğini unutmayın , ancak Adám Main için uygun olduğunu söyledi, bu yüzden bunu yayınladım.
Bay Xcoder

Üçüncü test durumunuz, 'aa'iki kez görünür. Çeşitli yerlerde görünüyorsa aynı dizeyi birden çok kez çıktısı almalı mı yoksa yalnızca benzersiz çokgentonlar çıktısı almalı mı?
Jonathan Frech

@JonathanFrech Tamam, sanırım eşsiz poliphtongs çıktısı iyi. Düzenleyecek.
Bay Xcoder

Çıktı sırası önemli mi?
ovs

1
@Xophmeister bu meydan amaçları doğrultusunda gibi bir polyphthong tanımlanır O doğru dilsel tanım :-) değil biliyorum -
Sn Xcoder

Yanıtlar:


7

Python 2 , 102 97 bayt

-5 bayt için @JonathanFrech'e teşekkürler

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

Çevrimiçi deneyin!

küçük I / O


1
Sanırım ihtiyacın yok ...AEIOU', çünkü giriş olarak sadece küçük harfler almana izin verildi
Jonathan Frech


@JonathanFrech print([w[a:b]for a in l for b in l[a+2:]if{*w[a:b]}<={*'aeiou'}])93 kişi için çalışıyor.
Lynn

@Lynn Ve çözümünüz 96 Python 2 bayt üretir .
Jonathan Frech

6

JavaScript (ES6), 77 75 bayt

Küçük harf girişi bekler. Tekrarlamadan benzersiz polifhthong üretir.

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

Test senaryoları

Nasıl?

Mevcut düğüm artık girişte yer almaz dalları budama dalları, budama tüm polifontların ağacını özyineli olarak inşa ediyoruz ve en az 2 karakterden oluşan eşleşen tüm düğümleri kaydediyoruz.

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 bayt

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

Çevrimiçi deneyin!

Bu, bir polifhthong'un tüm oluşumlarını yazdırır.

açıklama

Retina yok var bir yol için al tüm üst üste maçları , ancak bunun gerçekten anlamı, her pozisyondan bir maç arayacağı. Aynı pozisyonda birden fazla eşleşme varsa, bu sadece bir tanesini döndürür. Üst üste gelen tüm maçları gerçekten elde etmenin tek yolu, bu özelliği iki kez kullanmaktır, bir kez soldan sağa ve bir kez sağdan sola eşleşir (böylece önce her olası başlangıç ​​konumundan mümkün olan en uzun eşleşmeyi elde ederiz ve sonra da tüm eşleşmeleri elde ederiz. olası bitiş konumları).

Yani asıl program:

M!&`[aeiou]+

Sesli harflerin tüm üst üste binmesini sağlayın. Bunun anlamı, tüm sesli harflerin tüm soneklerini almaktır.

r!&`..+

Şimdi en az 2 uzunluğunda olan tüm önekleri sağdan sola eşleştirerek alın. MO Programın son çizgi, çünkü burada gizlidir.


Kodu açıklayabilir misiniz?
17'de

!&`[aeiou]{2,}düzeltmek için bu kadar yakın , daha açgözlü almak için bir yolu var iomı?
AdmBorkBork

1
@ Adám Bir açıklama eklendi.
Martin Ender

@AdmBorkBork Açıklamalarım bunun neden işe yaramadığını anlatıyor. Retina gerçek regex motoruyla uğraşmaz, bu yüzden en fazla &yapabileceğiniz her pozisyondan bir maç denemek, böylece aynı pozisyondan farklı uzunlukta birden fazla maçınız olamaz. Bu yüzden ikinci bir aşamaya ihtiyacım var.
Martin Ender

Güzel açıklama, teşekkürler.
AdmBorkBork

5

QuadS , 20 + 1 = 21 bayt

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

ile obayrak

Çevrimiçi deneyin!

Olanlar sırasıyla:

[aeiou]+ bu PCRE'nin her maçında

,\⍵M Maç önekleri

1↓ ilkini bırak (bir sesli harf var)

,/⍵ tüm önek listelerini bitiştir

 ifşa et (indirimler /kapsadığı için)


Bu, Dyalog APL tacit işlevine eşdeğerdir:

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

Çevrimiçi deneyin!



4

Java (OpenJDK 8) , 138 135 134 bayt

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

Çevrimiçi deneyin!


i<y-1olabilir i<=yve String#matchesörtük tüm Dize denetler, böylece ^ ve gerekmez $. Yine de + 1'i beni dövdüğü için. Kendi 138 bayt cevabımı göndermek üzereydim (ancak bu değişikliklerle sizinkinin daha kısa olmasını önerdim). :)
Kevin Cruijssen


3

Jöle , 9 bayt

ẆḟÐḟØcḊÐf

Çevrimiçi deneyin!

açıklama

ẆḟÐḟØ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)

Bay Xcoder sayesinde -4 bayt


11 bayt yerine L>1$$ile L’$.
Bay Xcoder

Aslında yerini alabilir L’$ile için 9 bayt . Bir eşdeğer olurdu ẆṫLḊḟÐḟØc.
Bay Xcoder


3

R , 137 bayt

Mark tarafından geride bırakıldı !

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]

Çevrimiçi deneyin!

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 }


İhtiyacınız yok unique.
Bay Xcoder

"Makul bir G / Ç formatı ve yöntemine izin verilir (hem giriş hem de çıkış için karakter listeleri de uygundur)." Ben denemedim, ama başından beri karakter listeleri kullanırsanız bu çok daha kısa olabileceğinden şüpheleniyorum.
user2390246

@ user2390246 belki. Mutlaka yardımcı olacağına ikna olmadım, ancak bunun nedeni büyük olasılıkla ünlülerin çalışmalarını izole etme yaklaşımının oldukça farklı olması ve şu an kafamın etrafına sarılamam.
Giuseppe


2

PowerShell , 93 88 bayt

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

Çevrimiçi deneyin!

Küçük harf veya büyük harf G / Ç (veya bir karışım!) Kullanır.

Üzerinde cevabım Borrows kodu Ayrılmış alt dizeleri tüm alt dizeleri almak için, daha sonra bu o regex çıkarır -matchkarşı ^[aeiou]{2,}$- yani uzunluğu en az iki ünlüler ve sadece sesli harfleri olanlar. Bu dizeler boru hattında bırakılır ve çıktı örtüktür.


2

Haskell , 148 137 130 123 118 bayt

-11 bayt için @Laikoni sayesinde, beni golf ipuçlarına, başka bir -7 bayt ve yine -5 bayt olmak üzere toplam -30 bayt için -7 bayt.

Bu Haskell için iyi bir uyum gibi görünüyordu, ancak sonuç aynı fikirde değil. Sonuçta Haskell ok-ish bir seçim oldu sanırım. Yine de bu şekilde subsequencesçalışır rahatsız .

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]

Çevrimiçi deneyin!


1
Haskell Golf'e hoş geldiniz! Bizim ilgilenen olabilir golf ipuçları toplanması , golf kurallarına rehber ve monad'ların ve İnsanlar , bizim Haskell sohbet odası.
Laikoni

1
Cevabınızla ilgili bazı notlar: Yeni satırlar aynı bayt sayısına sahiptir ;, ancak kodun okunabilirliğini artırır. Hep ebirlikte kullanırsınız v, böylece doğrudan e=(elem ilan edebilirsiniz "aeiou"). y!!0daha kısadır head y. Orada concatMapyerine concat.map, ama daha kısadır (=<<)aynı etkiye sahiptir wich liste monad dan.
Laikoni

1
Bunun Data.Listsyerine içe aktarabilirsiniz Data.List. Birincisi, ikincisinin tüm işlevlerine sahiptir, ancak powerslicetüm sürekli alt dizilerin bir listesini veren gibi ek şeylere sahiptir.
nimi

1
Liste kavrayışında, y@(h:_:_)düşmek length y>1ve kısaltmak v(y!!0)için eşleştirebilirsiniz v h.
Laikoni

1
Kolumda iki tane daha asım var: (1) (\x y->v x&&v y)manuel olarak bu ucu kullanarak veya pointfree.io kullanarak noktadan bağımsız olarak kısaltılabilir . (2) listesi atom ile de kullanılabilir do, yani gösterim do x<-l;[...]ile aynıdır l>>=(\x->[...]). Btw, TIO'da main, bayt sayısının gerçek gönderimle eşleşmesi için üstbilgi veya altbilgi alanına ekleyebilirsiniz.
Laikoni

2

Perl, 45 bayt

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

PPCG'ye Hoşgeldiniz! Güzel ilk gönderi!
Rɪᴋᴇʀ

1
Aşağı oyu merak ediyorsanız, yayınınız düzenlendiği için Topluluk bot hesabı tarafından otomatik olarak yerleştirilir. Üzgünüm, bu konuda gerçekten yapabileceğimiz hiçbir şey, bu aptalca bir davranış. Umarım upvotes otomatik downvote retraksiyonunu tetiklemelidir.
HyperNeutrino

2

R , 120 bayt 110 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt güzel bir yaklaşım, benim çözüm :) beni outgolfed işaret etti yorum eklemek edeceğiz
Giuseppe

Dürüst olacağım, sizinkine alternatif bir çözüm bulabildiğim için çok memnun oldum :) Normalde zaten ışık yıllarım önümde ya da masanın üzerinde bıraktığım tüm kodları çözüyorsunuz.
Mark


1

JavaScript (ES6), 105 bayt

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')

Muhtemelen yapacak çok fazla golf var.

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 bayt

Œʒg≠}ʒžMм_

Çevrimiçi deneyin!

açıklamalar:

Œʒ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

Güzel cevap! Ben vardıŒʒžMм_}ʒg≠
Bay Xcoder

@ Mr.Xcoder Teşekkürler. Ayrıca ŒD1ùKʒžMм_10 bayt için vardı . Yine de golf için bir yol bulmaya çalışıyorum
scottinet

1

C, 105 75 bayt

Küçük harf girişi için bir işaretçiyi kabul eden ve standart çıktıda boşlukla ayrılmış dizeler üreten bir işlev:

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

Test programı

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

gösteri

'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 ]

açıklama

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

Debian Linux GCC kullanarak, uyumsuz örtük beyanları ile kurtulmak gibi görünüyor strchr()ve printf(). Diğer platformlar gerektirebilir <stdio.h>ve<string.h> dahil edilmelidir.

Çevrimiçi deneyin (Javascript gerektirir).


Can f(p)char*p;olmaz f(char*p)?
Jonathan Frech

Çok doğru - Aslında Arayan-tahsis depolamaya çıkışı vardı: f(s,d)char*s,*d.
Toby Speight


1

APL (Dyalog) , 53 bayt

Bu bir Dfn( d irect f unctio n ). Kullanımı p '<argument>'. Adil uyarı: bu çok verimli değildir ve input > 8 charactersTIO için zaman aşımına uğrar, ancak yeterli zaman verildiğinde normal çalışır.

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

Çevrimiçi deneyin!

@ Adám'a 16 bayt için teşekkürler!

Nasıl çalışır:

Kodu daha küçük porsiyonlarda kırırsak bunu anlamak daha kolaydır:

  • Bölüm 1 - G←⊃,/{(,v∘.,⊢)⍣⍵⊢v←'aeiou'}¨⍳≢1↓⍵: Fonksiyonun bu kısmı (sağ) argümanının uzunluğunu alır ve vektörü aeioubirçok kez kendi kendine karıştırır ve her olası kombinasyonunu verir.[2, length(right arg)] sesli harf .
  • Bölüm 2 - (G∊⊃,/⌽,\∘⌽¨,\⌽⍵)/: Bu bölüm G'nin hangi elemanlarının girişin alt dizelerinin üyeleri olduğunu kontrol eder. Bu 1, girişte bulunan ve bulunmadıkları sesli harf kombinasyonlarının endekslerinde yer alan bir boole vektörü döndürür 0. Elde edilen vektör daha sonra eşlenir ( /) G, bu da doğruluk değerlerine karşılık gelen öğeler döndürülür.

Sonra her şey atandı p. p←bayt sayısına dahil edilmez, çünkü gerekli değildir , sadece işlevi kullanmayı kolaylaştırır.


Daha fazla golf. Ayrıca, filtrelemek için kullanmamalısınız . Kullanın /.
Adam


1

Yakut 2.4, 100 bayt

(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]+$/}

Bu benim ilk golf girişimim ve eminim bu kodu kısaltmanın birçok yolu var.




0

T-SQL (SQL Server 2014), 281 bayt

;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

Girdi vermek

declare @ varchar(max) = 'abeoic'

sGirdiyi sıralı ayrı ayrı harflere ayırmak için ortak bir tablo ifadesi ve sonra csesli harfleri dışarı atarak tüm sıralı kombinasyonları oluşturmak için ikinci bir ortak tablo ifadesi kullanır.

SQL Keman


0

PHP, 139 bayt

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

Çevrimiçi demo

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

Nasıl çalışır

Bitişik karakterlerden oluşan alt dizeleri (2 uzunluğundan başlayarak) seçin ve dize boyunca hareket edin. Yalnızca sesli harf içeren alt dizeleri toplayın. Daha uzun alt dizelerle tekrarlayın.

For string 'abcdef' these are the substrings generated and checked:

'ab','bc','cd','de','ef'
'abc','bcd','cde','def'
'abcd','bcde','cdef'
'abcde','bcdef',
'abcdef'
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.