Trova i miei polifongi!


19

Ai fini di questa sfida, un polittongo è definito come una porzione contigua di una stringa, che contiene solo vocali e ha una lunghezza di almeno 2. Data una stringa non vuota come input, il tuo compito è quello di produrre tutti i polittonghi che contiene .

Ad esempio, "abeoic"ha le seguenti sezioni contigue (separate da spazio):

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

Rimuovendo quelli che contengono qualcosa di diverso dalle vocali o che hanno una lunghezza inferiore a 2, otteniamo i polifonghi desiderati:

eo oi eoi

I tuoi invii devono rispettare le seguenti regole:

  • È possibile scegliere lettere minuscole o maiuscole per l'I / O, ma il caso di output deve corrispondere al caso di input.

  • Le vocali sono aeiou(per le lettere minuscole) e AEIOU(per le lettere maiuscole). y/ Ynon è considerata una vocale.

  • L'input conterrà solo ASCII stampabile.

  • Se un polifago compare più volte, è possibile scegliere di emetterlo una sola volta o di emetterne tutte le occorrenze.

  • È consentito qualsiasi formato e metodo I / O ragionevole (anche gli elenchi di caratteri vanno bene, sia per l'input che per l'output).

Casi test

Ingresso -> Uscita (minuscolo)

r67 ^^ () * 6536782! 87 -> []
puzzle di programmazione e code golf -> []
e ... ho vinto! -> ['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']

Si noti che per i casi di test 3 e 6, è possibile eseguire l'output 'aa'e 'ee'rispettivamente una sola volta (vedere la quarta regola).

Questo è , vince l'invio più breve in byte in ogni lingua!


Nota che questo è stato originariamente pubblicato come CMC (Chat Mini Challenge) in The Nineteenth Byte , ma Adám ha detto che è adatto per Main , quindi ho finito per pubblicarlo.
Mr. Xcoder,

Il tuo terzo caso di test 'aa'appare due volte. È necessario emettere più volte la stessa stringa se appare in varie posizioni o si possono produrre solo polifongi unici?
Jonathan Frech,

@JonathanFrech Ok, immagino che l'output dei poliftong unici vada bene. Modifica.
Mr. Xcoder,

L'ordine di uscita è importante?
Ov

1
@Xophmeister Ai fini di questa sfida , un polifago è definito come - so che non è la definizione linguistica corretta :-)
Mr. Xcoder,

Risposte:


7

Python 2 , 102 97 byte

grazie a @JonathanFrech per -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')}

Provalo online!

I / O minuscoli


1
Penso che non sia necessario ...AEIOU', dal momento che è consentito prendere solo lettere minuscole come input.
Jonathan Frech,


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

@Lynn E la tua soluzione produce 96 byte Python 2 .
Jonathan Frech,

6

JavaScript (ES6), 77 75 byte

Prevede input in lettere minuscole. Produce polifonghi unici senza ripetizione.

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

Casi test

Come?

Costruiamo in modo ricorsivo l'albero di tutti i possibili politoftong, potando i rami non appena il nodo corrente non è più contenuto nell'input e salvando tutti i nodi corrispondenti di almeno 2 caratteri.

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!&`..+

Provalo online!

Ciò stampa tutte le occorrenze di un polittongo.

Spiegazione

Retina ha un modo per ottenere tutte le partite sovrapposte , ma ciò significa davvero che cercherà una partita per ogni posizione. Quindi, se ci sono più corrispondenze dalla stessa posizione, questo restituirà solo una di esse. L'unico modo per ottenere davvero tutte le partite sovrapposte è utilizzare questa funzione due volte, una volta abbinata da sinistra a destra e una volta da destra a sinistra (in modo da ottenere prima la corrispondenza più lunga possibile da ogni posizione iniziale possibile, quindi poi ottenere anche tutte le partite per le possibili posizioni finali).

Quindi il programma attuale:

M!&`[aeiou]+

Ottieni tutte le serie sovrapposte di vocali. Ciò significa veramente ottenere tutti i suffissi di tutte le corse vocaliche.

r!&`..+

Ora ottieni tutti i prefissi che sono almeno della lunghezza 2, facendo corrispondere da destra a sinistra. Qui Mè implicito, perché è l'ultima riga del programma.


Puoi spiegare il codice?
Adám,

!&`[aeiou]{2,}è così vicino alla correzione , c'è un modo per renderlo più avido in modo che corrisponda io?
AdmBorkBork,

1
@Adám Aggiunta una spiegazione.
Martin Ender,

@AdmBorkBork La mia spiegazione spiega perché non può funzionare. Retina non giocherella con il vero motore regex, quindi il massimo che &puoi fare è provare una partita da ogni posizione, quindi non puoi avere più partite di diversa lunghezza dalla stessa posizione. Ecco perché ho bisogno di un secondo stadio.
Martin Ender,

Bella spiegazione, grazie.
AdmBorkBork,

5

QuadS , 20 + 1 = 21 byte

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

con la obandiera

Provalo online!

In ordine di cose:

[aeiou]+ su ogni partita di questo PCRE

,\⍵M prefissi della partita

1↓ rilascia il primo (che ha una vocale)

,/⍵ concatena tutti gli elenchi di prefissi

 rivelare (perché le riduzioni /allegano)


Ciò equivale alla funzione tacita Dyalog APL:

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

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

Provalo online!


i<y-1può essere i<=ye String#matchesimplicito controlla l'intera stringa, quindi non è necessario il ^ e $. +1 per avermi battuto, però. Stavo per pubblicare la mia risposta a 138 byte (ma con queste modifiche ho proposto che la tua sia più breve). :)
Kevin Cruijssen,


3

Gelatina , 9 byte

ẆḟÐḟØcḊÐf

Provalo online!

Spiegazione

ẆḟÐḟØ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 grazie a Mr. Xcoder


11 byte sostituendo L>1$$con L’$.
Mr. Xcoder,

In realtà è possibile sostituire L’$con per 9 byte . Un equivalente sarebbe ẆṫLḊḟÐḟØc.
Mr. Xcoder


3

R , 137 byte

superato da 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]

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


Non hai bisogno unique.
Mr. Xcoder,

"È consentito qualsiasi formato e metodo I / O ragionevole (anche gli elenchi di caratteri vanno bene, sia per l'input che per l'output)." Non l'ho provato, ma sospetto che questo potrebbe essere molto più breve se usi gli elenchi di personaggi dall'inizio.
user2390246

@ forse user2390246. Non sono convinto che sarebbe di grande aiuto, ma probabilmente è solo perché l'approccio per isolare le corse di vocali sarebbe molto diverso e non posso avvolgerlo in questo momento.
Giuseppe,


2

PowerShell , 93 88 byte

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

Provalo online!

Utilizza I / O minuscoli o maiuscoli (o un mix!).

Prende in prestito il codice dalla mia risposta Sottostringa esplosa per ottenere tutte le sottostringhe, quindi estrae quelle -matchcontro cui si regexano ^[aeiou]{2,}$, cioè quelle che sono lunghe almeno due vocali e solo vocali. Tali stringhe vengono lasciate sulla pipeline e l'output è implicito.


2

Haskell , 148 137 130 123 118 byte

Grazie a @Laikoni per -11 byte, ulteriori -7 byte indicandomi le punte del golf, altri -7 byte e ancora altri -5 byte, per un totale di ben -30 byte.

Sembrava una buona scelta per Haskell ma il risultato non sembra essere d'accordo. Penso che Haskell sia stata una scelta OK dopo tutto. Sono comunque seccato dal modo in cui subsequencesfunziona.

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]

Provalo online!


1
Benvenuti nel golf di Haskell! Potresti essere interessato alla nostra raccolta di suggerimenti sul golf , alla guida alle regole del golf e a Of Monads and Men , alla nostra chat room di Haskell.
Laikoni,

1
Alcune note sulla risposta: le nuove righe hanno lo stesso numero di byte ;ma aumentano la leggibilità del codice. Usi sempre einsieme a v, quindi puoi dichiarare direttamente e=(elem "aeiou"). y!!0è più corto di head y. C'è concatMapinvece concat.map, ma anche più breve è (=<<)dalla lista monade che ha lo stesso effetto.
Laikoni

1
Puoi importare Data.Listsinvece di Data.List. Il primo ha tutte le funzioni del secondo, ma anche cose aggiuntive come powerslice, che fornisce un elenco di tutte le sottosequenze continue.
nimi

1
Nella lista di comprensione, è possibile abbinare a y@(h:_:_)cadere length y>1e accorciare v(y!!0)a v h.
Laikoni,

1
Ho altri due assi nella manica: (1) (\x y->v x&&v y)può essere abbreviato convertendolo in point-free, manualmente usando questo suggerimento o usando pointfree.io . (2) La monade lista può anche essere usata con la donotazione, che do x<-l;[...]è la stessa di l>>=(\x->[...]). A proposito, su TIO puoi inserire il tuo mainnell'intestazione o nel piè di pagina affinché il conteggio dei byte corrisponda all'invio effettivo.
Laikoni,

2

Perl, 45 byte

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

Benvenuti in PPCG! Bel primo post!
Rɪᴋᴇʀ

1
Nel caso ti stia chiedendo del downvote, che è stato inserito automaticamente dall'account del bot della Community perché il tuo post è stato modificato. Siamo spiacenti, non possiamo farci nulla, è un comportamento stupido. Si spera che i voti positivi dovrebbero innescare la retrazione automatica dei voti negativi.
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)}

Provalo online!

Come funziona

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 bel approccio, aggiungerò un commento alla mia soluzione notando che mi hai superato di gran lunga :)
Giuseppe,

Sarò onesto, sono stato molto contento di essere riuscito a trovare una soluzione alternativa alla tua :) Normalmente hai già anni luce davanti a me o ho capito tutto il codice che ho lasciato sul tavolo.
Segna il

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

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

Probabilmente ha ancora molto da fare.

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м_

Provalo online!

spiegazioni:

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

Bella risposta! Ho avutoŒʒžMм_}ʒg≠
Mr. Xcoder il

@ Mr.Xcoder Grazie. Ho anche avuto ŒD1ùKʒžMм_per 10 byte. Sto cercando di trovare un modo per giocare a golf
scottinet

1

C, 105 75 byte

Una funzione che accetta un puntatore all'input in minuscolo e produce stringhe separate da spazio sull'output standard:

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

Programma di test

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

dimostrazione

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

Spiegazione

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

Usando GCC su Debian Linux, mi sembra di cavarmela con le dichiarazioni implicite incompatibili di strchr()e printf(). Altre piattaforme potrebbero richiedere<stdio.h> e<string.h> essere incluse.

Provalo online (richiede Javascript).


Non f(p)char*p;può essere f(char*p)?
Jonathan Frech,

Giustissimo - Inizialmente avevo immagazzinare nella memoria del visitatore-allocato: f(s,d)char*s,*d.
Toby Speight,


1

APL (Dyalog) , 53 byte

Si tratta di una Dfn( d ire f unctio n ). L'uso è p '<argument>'. Avviso equo: questo non è molto efficiente e input > 8 charactersscade per TIO, ma funziona normalmente quando viene concesso abbastanza tempo.

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

Provalo online!

Grazie a @ Adám per 16 byte!

Come funziona:

Questo è più facile da capire se suddividiamo il codice in porzioni più piccole:

  • Parte 1 G←⊃,/{(,v∘.,⊢)⍣⍵⊢v←'aeiou'}¨⍳≢1↓⍵: questa parte della funzione prende la lunghezza dell'argomento (a destra) e mescola il vettore aeioua se stesso molte volte, producendo ogni possibile combinazione di[2, length(right arg)] vocali.
  • Parte 2 (G∊⊃,/⌽,\∘⌽¨,\⌽⍵)/: questa parte controlla quali elementi di G sono membri delle sottostringhe dell'input. Ciò restituisce un vettore booleano, con 1gli indici delle combinazioni vocali presenti nell'input e 0dove non lo sono. Il vettore risultante viene quindi mappato ( /) sopra G, restituendo gli elementi corrispondenti ai valori di verità.

Il tutto viene quindi assegnato a p. p←non è incluso nel conteggio dei byte perché non è necessario , ma semplifica l'utilizzo della funzione.


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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.