Знайди мої поліфтонги!


19

Для цілей цього виклику поліфтон визначається як суміжний фрагмент рядка, який містить лише голосні голоси і має довжину не менше 2. Враховуючи не порожній рядок як вхід, ваше завдання - вивести всі поліфтонги, які він містить .

Наприклад, "abeoic"має такі суміжні зрізи (розділені пробілом):

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

Видаляючи ті, що містять що-небудь, крім голосних, або мають довжину менше 2, ми отримуємо потрібні поліфтонги:

eo oi eoi

Ваші матеріали повинні дотримуватися таких правил:

  • Ви можете вибрати малі або великі регістри для вводу / виводу, але вихідний регістр повинен відповідати вхідному.

  • Голосні звуки aeiou(для малих літер) та AEIOU(для великої літери). y/ Yне вважається голосним.

  • Вхід буде містити тільки друкований ASCII.

  • Якщо поліфтон з'являється кілька разів, ви можете вивести його лише один раз або вивести всі його виникнення.

  • Дозволений будь-який розумний формат і спосіб вводу / виводу (списки символів також точні, як для введення, так і для виводу).

Випробування

Введення -> Вихід (малі літери)

r67 ^^ () * 6536782! 87 -> []
програмування головоломок та код-гольф -> []
ааа ... я переміг! -> ['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']

Зауважте, що для тестових випадків 3 та 6 ви можете виводити 'aa'і 'ee'відповідно лише один раз (Див. Четверте правило).

Це , виграє найкоротше подання в байтах на кожній мові!


Зауважте, що він спочатку був розміщений як CMC (Chat Mini Challenge) у «Дев'ятнадцятому байті» , але Адам сказав, що він підходить для Main , тому я закінчив цю публікацію.
Містер Xcoder

Я ваш третій тестовий випадок, 'aa'з’являється двічі. Чи потрібно виводити один і той самий рядок кілька разів, якщо він з’являється в різних місцях чи можна виводити лише унікальні багатогранники?
Джонатан Фрех

@JonathanFrech Добре, я думаю, виведення унікальних поліфтонів чудово. Відредагуємо.
Містер Xcoder

Чи має значення порядок виводу?
ов

1
@Xophmeister Для цілей цього виклику поліфтон визначається як - я знаю, це не правильне мовне визначення :-)
Містер Xcoder

Відповіді:


7

Python 2 , 102 97 байт

завдяки @JonathanFrech за -5 байт

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

Спробуйте в Інтернеті!

малі введення / виведення


1
Я думаю, вам це не потрібно ...AEIOU', оскільки вам дозволяється брати лише малі літери як вхідні дані.
Джонатан Фрех


@JonathanFrech print([w[a:b]for a in l for b in l[a+2:]if{*w[a:b]}<={*'aeiou'}])працює на 93.
Лінн

@Lynn І ваше рішення виробляє 96 байт Python 2 .
Джонатан Фрех

6

JavaScript (ES6), 77 75 байт

Очікує введення з малої літери. Виводить унікальні багатогранники без повторення.

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

Тестові справи

Як?

Ми рекурсивно будуємо дерево з усіх можливих багатогранників, обрізаючи гілки, як тільки поточний вузол більше не міститься у вході, і зберігаємо всі узгоджуючі вузли щонайменше з 2 символів.

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

Сітківка , 23 20 байт

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

Спробуйте в Інтернеті!

Це друкує всі виникнення поліфтонга.

Пояснення

У Retina є спосіб отримати всі збіги, що збігаються , але це дійсно означає, що вона буде шукати по одній матчі з кожної позиції. Тож якщо з однієї позиції є кілька матчів, це поверне лише один із них. Єдиний спосіб реально отримати всі збіги, що збігаються, - використовувати цю функцію двічі, один раз порівнюючи ліворуч праворуч і один раз праворуч ліворуч (щоб ми спочатку отримували найдовший можливий збіг з кожної можливої ​​стартової позиції, а потім також отримували всі матчі за можливі кінцеві позиції).

Отже, власне програма:

M!&`[aeiou]+

Отримайте всі накладені голосні звуки. Це насправді означає, щоб отримати всі суфікси всіх голосних прогонів.

r!&`..+

Тепер отримайте всі префікси, що мають принаймні довжину 2, зіставляючи справа наліво. Тут Mмається на увазі, оскільки це заключний рядок програми.


Чи можете ви пояснити код?
Adám

!&`[aeiou]{2,}це так близько до правильного , чи є спосіб , щоб отримати його жадібним , так що матчі проти io?
AdmBorkBork

1
@ Adám додав пояснення.
Мартін Ендер

@AdmBorkBork Моє пояснення типу обкладинки, чому це не може працювати. Сітківка не спішиться з реальним механізмом регулярних виразів, тому найбільше &можна зробити, щоб спробувати поєдинок з кожної позиції, тому у вас не може бути декількох матчів різної довжини з однієї позиції. Тому мені потрібен другий етап.
Мартін Ендер

Гарне пояснення, дякую.
AdmBorkBork

5

QuadS , 20 + 1 = 21 байт

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

з oпрапором

Спробуйте в Інтернеті!

У порядку, що відбувається:

[aeiou]+ на кожен матч цього PCRE

,\⍵M префікси Збігу

1↓ відкиньте перший (у якого одна голосна)

,/⍵ об'єднати всі списки префіксів

 розкрити (оскільки скорочення /додаються)


Це еквівалентно мовчазній функції Dyalog APL:

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

Спробуйте в Інтернеті!



4

Java (OpenJDK 8) , 138 135 134 байт

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

Спробуйте в Інтернеті!


i<y-1може бути i<=yі String#matchesнеявними перевіряє всі рядки, так що вам не потрібно ^ і $. +1 за те, що мене побили. Якраз збирався розмістити свою власну відповідь на 138 байт (але з цими змінами я запропонував ваш коротший). :)
Кевін Круїссен


3

Желе , 9 байт

ẆḟÐḟØcḊÐf

Спробуйте в Інтернеті!

Пояснення

ẆḟÐḟØ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 байти завдяки спадару Xcoder


11 байт замінивши L>1$$на L’$.
Містер Xcoder

На насправді ви можете замінити L’$з на 9 байт . Еквівалент був би ẆṫLḊḟÐḟØc.
Містер Xcoder

3

C (gcc) , 104 байти (99 байт лише з малого чи верхнього регістру)

Так, витікає - і що?

#include<string.h>
a;f(char*s){*s&&f(s+1);for(a=strspn(s=strdup(s),"AEIOUaeiou");a>1;)s[a--]=0,puts(s);}

Спробуйте в Інтернеті!


3
Здається, це працює без цього#include , і вам потрібно обробити лише одну літеру, так що ви можете скоротити її до 80 байт.
Steadybox


3

R , 137 байт

перевершив Марк !

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]

Спробуйте в Інтернеті!

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 }


Вам не потрібно unique.
Містер Xcoder

"Дозволено будь-який розумний формат і спосіб вводу / виводу (списки символів також добре, як для введення, так і для виведення)." Я не пробував цього, але я підозрюю, що це може бути набагато коротшим, якщо ви використовуєте списки символів з самого початку.
користувач2390246

@ user2390246 можливо. Я не впевнений, що це допоможе обов'язково, але це, мабуть, тільки тому, що підхід до виділення пробіжок голосних був би зовсім іншим, і я не можу зараз обернути голову навколо нього.
Джузеппе


2

PowerShell , 93 88 байт

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

Спробуйте в Інтернеті!

Використовується введення / виведення малих чи великих літер (або суміш!).

Запозичує код з моєї відповіді на Exploded Substrings, щоб отримати всі підрядки, а потім витягує ті, -matchпроти яких пересуваються ^[aeiou]{2,}$- тобто ті, що мають принаймні два голосні і лише голосні. Ці рядки залишаються на конвеєрі і вихід неявний.


2

Хаскелл , 148 137 130 123 118 байт

Завдяки @Laikoni на -11 байт, далі -7 байт, вказуючи мені на поради щодо гри в гольф, ще -7 байт і ще -5 байт, в цілому колосальних -30 байт.

Це виглядало як добре для Haskell, але результат, схоже, не згоден. Я здогадуюсь Haskell був OK-ish вибір врешті-решт. Мені все одно дратує те, як subsequencesпрацює.

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]

Спробуйте в Інтернеті!


1
Ласкаво просимо в гольф Haskell! Можливо, вас зацікавлять наша колекція порад з гольфу , посібник з правил гольфу та монадів та чоловіків , наш чат Хаскелл.
Лайконі

1
Деякі зауваження до вашої відповіді: Нові рядки мають те саме число байтів, що й ;, але збільшують читабельність коду. Ви завжди користуєтесь eразом із v, тому можете безпосередньо оголосити e=(елем "aeiou"). y!!0коротше, ніж head y. Існує concatMapзамість concat.map, але ще коротше - (=<<)зі списку монада, яка має той самий ефект.
Лайконі

1
Ви можете імпортувати Data.Listsзамість Data.List. Перший має всі функції останнього, але також додаткові речі, такі як powersliceсписок усіх безперервних підрядів.
німі

1
У розумінні списку ви можете відповідати y@(h:_:_)краплі length y>1та скорочувати v(y!!0)до v h.
Laikoni

1
У мене ще два тузи в рукаві: (1) (\x y->v x&&v y)можна скоротити, перетворившись на точковий, або вручну, використовуючи цей наконечник, або використовуючи pointfree.io . (2) Списку монада також може використовуватися з doпозначеннями, тобто do x<-l;[...]те саме, що l>>=(\x->[...]). До речі, в TIO ви можете помістити своє mainполе в колонтитул або колонтитула, щоб кількість байтів відповідало фактичному поданню.
Лайконі

2

Perl, 45 байт

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

Ласкаво просимо до PPCG! Гарний перший пост!
Rɪᴋᴇʀ

1
У випадку, якщо вам цікаво про низовий запис, він автоматично розміщувався в обліковому записі бота спільноти, оскільки ваше повідомлення було відредаговано. Вибачте, насправді з цим ми нічого не можемо зробити, це німа поведінка. Будемо сподіватися, що оновлення повинні спровокувати автоматичне відведення поворотних каналів.
HyperNeutrino

2

R , 120 байт 110 байт

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

Спробуйте в Інтернеті!

Як це працює

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 bytes nice approach, I'll add a comment to my solution noting that you have outgolfed me :)
Giuseppe

I'll be honest, I was very pleased that I was able to come up with an alternate solution to yours :) Normally you're already light years ahead of me or figuring out all the code I left on the table.
Mark


1

JavaScript (ES6), 105 bytes

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

Probably has a lot of golfing left to do.

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 bytes

Œʒg≠}ʒžMм_

Try it online!

Explanations:

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

Nice answer! I had ŒʒžMм_}ʒg≠
Mr. Xcoder

@Mr.Xcoder Thanks. I also had ŒD1ùKʒžMм_ for 10 bytes. I'm trying to find a way to golf it down though
scottinet

1

C, 105 75 bytes

A function accepting a pointer to lowercase input, and producing space-separated strings on standard output:

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

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 ]

Explanation

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

Using GCC on Debian Linux, I seem to get away with the incompatible implicit declarations of strchr() and printf(). Other platforms may require <stdio.h> and <string.h> to be included.

Try it online (requires Javascript).


Can f(p)char*p; not be f(char*p)?
Jonathan Frech

Quite right - I originally had output to caller-allocated storage: f(s,d)char*s,*d.
Toby Speight


1

APL (Dyalog), 53 bytes

This is a Dfn (direct function). Usage is p '<argument>'. Fair warning: this is not very efficient and times out for input > 8 characters on TIO, but works normally when given enough time.

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

Try it online!

Thanks to @Adám for 16 bytes!

How it works:

This is easier to understand if we break the code in smaller portions:

  • Part 1 - G←⊃,/{(,v∘.,⊢)⍣⍵⊢v←'aeiou'}¨⍳≢1↓⍵: This part of the function takes the length of the (right) argument and mixes the vector aeiou to itself that many times, yielding every possible combination of [2, length(right arg)] vowels.
  • Part 2 - (G∊⊃,/⌽,\∘⌽¨,\⌽⍵)/: This part checks which element(s) of G are members of the substrings of the input. This returns a boolean vector, with 1's at the indices of the vowel combinations that are present in the input and 0's where they're not. The resulting vector is then mapped (/) over G, returning the elements corresponding to the truthy values.

The whole thing is then assigned to p. p← is not included in the byte count because it's not necessary, it just makes using the function easier.


Golfed further. Also, you shouldn't use to filter. Use /.
Adám


1

Ruby 2.4, 100 bytes

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

This is my first attempt at golfing, and I'm sure there are lots of ways to shorten this code.




0

T-SQL (SQL Server 2014), 281 bytes

;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

Input give by

declare @ varchar(max) = 'abeoic'

Uses a common table expression s to blow the input apart into ordered individual letters, and then a second common table expression c to generate all ordered combinations, throwing out non vowels.

SQL Fiddle


0

PHP, 139 bytes

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

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

How it works

Select sub-strings (beginning with the length of 2) consisting of adjacent characters and move along string. Collect any sub-strings that only contain vowels. Repeat with longer sub-strings.

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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.