Faire des ondes de chaîne

19

Étant donné une chaîne en entrée, sortez la chaîne avec l'algorithme suivant appliqué:

1. Split the String by " " (find the words): "Hello World" -> ["Hello","World"]
2. Find the vowel count of each component: [2,1]   ( ["H[e]ll[o]","W[o]rld"] )
3. For each of the components, output the first n letter where n is the number 
   of vowels it contains: ["He","W"]
4. Join the list to a single string and reverse it: "HeW" -> "WeH"

Spécifications

  • Vous pouvez prendre des entrées et fournir des sorties sous n'importe quelle forme standard , et le seul type de données autorisé pour Input et Output est le type String natif de votre langue. Il n'est pas permis de saisir directement une liste de mots individuels.

  • Vous avez la garantie qu'il n'y aura pas d'espaces consécutifs.

  • Les voyelles sont "a","e","i","o","u","A","E","I","O","U", mais "y","Y" ne sont pas considérées comme des voyelles .

  • Vous avez la garantie que seules les lettres et les espaces apparaîtront dans l'entrée, mais sans aucune nouvelle ligne.

  • La sortie doit être sensible à la casse.

  • Vous n'êtes pas assuré que chaque mot contient une voyelle. Si aucune voyelles n'apparaissent dans ce mot, vous n'avez rien à produire pour cela.

Cas de test

Input -> Output
---------------

""                                  -> ""
"Hello World"                       -> "WeH"
"Waves"                             -> "aW"
"Programming Puzzles and Code Golf" -> "GoCauPorP"
"Yay Got it"                        -> "iGY" 
"Thx for the feedback"              -> "eeftf"                  
"Go Cat Print Pad"                  -> "PPCG"   
"ICE CREAM"                         -> "RCCI"

Notation

La soumission valide la plus courte pour chaque langue gagne, c'est le . Bonne chance et amusez-vous bien!


Sandbox pour ceux qui peuvent voir les messages supprimés.

M. Xcoder
la source
Désolé pour la suppression temporaire!
M. Xcoder
6
Je ne sais pas pourquoi je pensais que cela allait être un PCG sur les ondes de cordes (comme dans la théorie des cordes ) (comme dans les oscillations dans un champ). Il est peut-être temps de dormir.
Marc.2377
2
@ Mr.Xcoder: veuillez ajouter un cas de test avec des voyelles majuscules. Merci!
nimi
@nimi Added. C'est juste le même algorithme, peu importe le cas.
M. Xcoder
1
@ Mr.Xcoder: oui, mais au moins deux réponses se sont trompées (toutes deux corrigées maintenant).
nimi

Réponses:

7

Haskell, 59 octets

map fst.reverse.(>>=zip<*>filter(`elem`"aeiouAEIOU")).words

Essayez-le en ligne!

       words     -- split into a list of words
  (>>=      )    -- apply a function to every word and collect the results in a
                 -- single list
     zip<*>filter(`elem`"aeiouAEIOU")
                 -- f <*> g x = f x (g x), i.e. zip x (filter(...)x)
                 -- we now have a list of pairs of (all letters of x, vowel of x)
                 -- with the length of number of vowels
 reverse         -- reverse the list
map fst          -- drop vowels from the pairs
nimi
la source
6

V , 31 octets

Í /ò
òÄøã[aeiou]
|DJ@"|D-òÍî
æ

Essayez-le en ligne!

00000000: cd20 2ff2 0af2 c4f8 e35b 6165 696f 755d  . /......[aeiou]
00000010: 0a01 7c44 4a40 227c 442d f2cd ee0a e6    ..|DJ@"|D-.....

Et explication:

Í               " Substitute Every space
  /             " With
   ò            " Newlines
                " This puts us on the last line of the buffer
ò               " Recursively:
 Ä              "   Duplicate the current line
  ø             "   Count:
   ã            "   Case insensitive
    [aeiou]     "   The number of vowels
<C-a>           "   Increment this number
     |          "   Go to the beginning of this line
DJ              "   Delete the number of vowels, and remove a newline that was accidentally made.
                "   Also, my name! :D
  @"            "   Run the unnamed register, which is the number of vowels that we deleted
    |           "   And move to the n'th column in this line
     D          "   Delete everything on this line after the cursor, keeping the first *n* characters
      -         "   Move up a line
       ò        " End the loop
        Íî      " Remove all newlines
æ               " And reverse:
                "   (implicit) The current line
DJMcMayhem
la source
C'est étonnamment lisible ... Pouvez-vous ajouter quelques mots sur son fonctionnement?
M. Xcoder
Je suis impressionné par la fréquence à laquelle je vois æutilisé, je semble me souvenir qu'il a été ajouté très récemment et c'est l'une des commandes les plus utiles.
nmjcman101
@ nmjcman101 Ouais, je suis totalement d'accord. æest extrêmement utile. J'aurais dû l'ajouter il y a longtemps. øest aussi vraiment sympa, c'est cool que cette réponse utilise les deux.
DJMcMayhem
Il semble fonctionner sans le premier |( essayez-le en ligne! ), Ce qui n'est pas dans votre explication. Mais je ne connais pas V; est-ce nécessaire?
CAD97
@ CAD97 Ah, je l'ai manqué dans mon explication. Cela fonctionne pour tous les cas de test, mais il casse lorsqu'il y a 10 voyelles ou plus dans un mot (car <C-a>place le curseur à la fin du mot). tio.run/##K/v//3Cvgv7hTVyHNx1uObzj8OLoxNTM/…
DJMcMayhem
5

Brachylog , 17 octets

ṇ₁{{∋ḷ∈Ṿ}ᶜ}ᶻs₎ᵐc↔

Essayez-le en ligne!

Explication

C'est une traduction directe du problème:

Example input: "Hello World"

ṇ₁                  Split on spaces:         ["Hello", "World"]
  {       }ᶻ        Zip each word with:      [["Hello",2],["World",1]]
   {    }ᶜ            The count of:
    ∋ḷ∈Ṿ                Chars of the words that when lowercased are in "aeiou"

            s₎ᵐ     Take the first substring of length <the count> of each word: ["He","W"]
               c    Concatenate:             "HeW"
                ↔   Reverse:                 "WeH"
Fatalize
la source
4

Perl 6 , 57 octets

{flip [~] .words.map:{.substr(0,.comb(rx:i/<[aeiou]>/))}}
Sean
la source
4

Alice , 32 octets

/.'*%-.m"Re.oK"
\iu &wN.;aoi$u@/

Essayez-le en ligne!

Explication

/....
\...@/

Ceci est juste un cadre pour le code linéaire en Ordinal (mode de traitement de chaîne). En déroulant le programme, nous obtenons:

i' %w.."aeiou".u*&-Nm;Ro.$K@

Voici ce qu'il fait:

i           Read all input.
' %         Split the input around spaces.
w           Push the current IP address to the return address stack to mark
            the beginning of the main loop. Each iteration will process one
            word, from the top of the stack to the bottom (i.e. in reverse 
            order).

  ..          Make two copies of the current word.
  "aeiou"     Push this string.
  .u*         Append an upper case copy to get "aeiouAEIOU".
  &-          Fold substring removal over this string. What that means is that
              we push each character "a", "e", ... in turn and execute -
              on it. That will remove all "a"s, all "e"s, etc. until all
              vowels are removed from the input word.
  N           Compute the multiset complement of this consonant-only version
              in the original word. That gives us only the vowels in the word.
              We now still have a copy of the input word and only its vowels
              on top of the stack.
  m           Truncate. This reduces both strings to the same length. In particular,
              it shortens the input word to how many vowels it contains.
  ;           Discard the vowels since we only needed their length.
  R           Reverse the prefix.
  o           Print it.
  .           Duplicate the next word. If we've processed all words, this
              will give an empty string.

$K          Jump back to the beginning of the loop if there is another word
            left on the stack.
@           Otherwise, terminate the program.
Martin Ender
la source
4

JavaScript (ES6), 76 octets

s=>s.split` `.map(w=>w.split(/[aeiou]/i).map((_,i)=>o=i?w[i-1]+o:o),o='')&&o

Cas de test

Arnauld
la source
4

Perl 5, 47 octets

Code de 45 octets + 2 pour -pa.

map$\=$_.$\,(/./g)[0..lc=~y/aeiou//-1]for@F}{

Essayez-le en ligne!

Dom Hastings
la source
Fonctionne-t-il avec les voyelles majuscules, par exemple "Alabama"?
nimi
@nimi oooh, n'y a pas pensé, mis à jour pour +1.
Dom Hastings
3

JavaScript (ES6), 96 octets

s=>[...s.split` `.map(w=>w.slice(0,(m=w.match(/[aeiou]/gi))&&m.length)).join``].reverse().join``

darrylyeo
la source
Les mots sans voyelles ( Thx) ne devraient pas avoir de sortie; votre scénario de test génère le mot entier.
Justin Mariner
@JustinMariner Fixed!
darrylyeo
3

Pyth - 19 octets

_jkm<dl@"aeiou"rd0c

Essayez-le ici

Explication:

_jkm<dl@"aeiou"rd0c
                  c  # Split implicit input on whitespace
   m                 # For each word d...
               rd0   # ...take the lower-case conversion...
       @"aeiou"      # filter it to only vowels...
      l              # and find the length of this string (i.e., the number of vowels in the word)
    <d               # Take the first # characters of the word (where # is the length from above)
 jk                  # Join on empty string (can't use s, because that will screw up when the input is the empty string)
_                    # Reverse the result (and implicitly print)

Je pourrais avoir 18 octets sinon pour la chaîne vide:

_sm<dl@"aeiou"rd0c
Maria
la source
1
@DigitalTrauma: Je viens d'ajouter une explication
Maria
1
@- l'intersection est bien meilleure que l'expression régulière ici. Oh, je vois - vous n'avez qu'une lambda / carte par rapport à ma 2.
Digital Trauma
3

Pyth, 31

Cela m'a pris du temps à écrire, et j'ai l'impression qu'il y a probablement une meilleure approche, mais voici ce que j'ai:

_jkm<Fd.T,cQ)ml:d"[aeiou]"1crQ0

Test en ligne .

                             Q     # input
                            r 0    # to lowercase   
                           c       # split by whitespace
               :d"[aeiou]"1        # lambda: regex to find vowels in string
              l                    # lambda: count the vowels in string
             m                     # map lambda over list of words
          cQ)                      # split input by whitespace
         ,                         # list of (input words, vowel counts)
       .T                          # transpose
    <Fd                            # lambda to get first n chars of string
   m                               # map lambda over list of (input words, vowel counts)
 jk                               # join on on empty strings
_                                 # reverse
Traumatisme numérique
la source
> J'ai l'impression qu'il y a probablement une meilleure approche - j'ai 19 ans en Pyth
Maria
1
@Svetlana là je l'ai corrigé. Merci pour l' jkastuce.
Digital Trauma
3

Ohm, 13 octets

z:αv_K_σh;0JR

Explication

  • D'abord, l'entrée (implicite) est divisée sur les espaces par z.
  • Ensuite, une boucle foreach est lancée ( :) avec son bloc de code associé αv_K_σh.
    • av pousse aeiou
    • _ pousse l'élément itéré actuel
    • Kcompte les occurrences de aeioudans_
    • _ l'élément à nouveau
    • σhDivise l'élément en tranches de longueur occurenceset prend le premier élément.
      • Effectivement, cela prend les premiers occurencescaractères
  • 0J Pousse la pile jointe ''
    • Le 0est nécessaire car il nécessite un argument qui sera joint. Si cet argument n'est pas un tableau, il rejoint la pile
  • R inverse le résultat
  • impression implicite des CGU
Roman Gräf
la source
3

Rubis , 54 59 + 1 = 55 60 octets

Utilise l' -pindicateur pour +1 octet.

$_=$_.split.map{|w|w[0,w.count("aeiouAEIOU")]}.join.reverse

Essayez-le en ligne!

Encre de valeur
la source
@nimi C'est le cas maintenant.
Value Ink
Juste curieux, pourquoi -pvaut un octet?
Eric Duminil
2
@EricDuminil Voir cette méta-publication mais, fondamentalement, car il ruby -pe '...'ne s'agit que d'un octet de plus ruby -e '...'et -econstitue un moyen valide d'exécuter le script.
Dom Hastings
3

Japt v2.0a0, 12 10 octets

¸®¯Zè\vìw

Essayez-le


Explication

Fait à peu près exactement ce que la spécification décrit!

        :Implicit input of string U.
¸       :Split to array on spaces.
®       :Map over the array, replacing each element with itself ...
¯       :  sliced from the 0th character to ...
Zè\v    :  the count (è) of vowels (\v) in the element (Z).
à      :End mapping.
¬       :Join to a string.
w       :Reverse.
        :Implicit output of result.
Hirsute
la source
Heureusement que j'ai vérifié les réponses existantes avant d'écrire la mienne: P Bien, je ne pense pas que cela raccourcira (bien que je puisse me tromper ...)
ETHproductions
En plus: dans Japt 2.0, vous pourriez théoriquement passer "%v"à \v(un littéral d'expression régulière à classe unique, équivalent à /\v/). Pas encore utile, bien sûr, car je n'ai pas encore implémenté la version
2.0
@ETHproductions, je me préparais à courir à la porte lorsque ce défi est apparu, alors je l'ai simplement écrit rapidement, le prenant littéralement. Il pourrait y avoir un moyen plus court de le faire moins littéralement, peut-être? Ces modifications apportées au RegEx seront utiles pour économiser quelques octets; les attend avec impatience
Shaggy
2

05AB1E , 14 octets

#RʒDžMDu«Ãg£R?

Essayez-le en ligne!

Darn 05AB1E n'a pas intégré pour AEIOUaeiou ಠ_ಠ

Erik le Outgolfer
la source
1
Attendez ... 05AB1E battu par Japt?
M. Xcoder
@ Mr.Xcoder arrive plus souvent que vous ne le pensez probablement.
Erik the Outgolfer
1
#RʒDlžMÃg£R?pour 12, vous pouvez à peu près juste mettre en minuscule la dupe en supprimant le besoin de AEIOUaeiou. Aussi, pourquoi diable ce travail sans le ?? Pouvez-vous poster une explication, je ne suis pas familier avecʒ
Magic Octopus Urn
@carusocomputing Malheureusement, la sortie doit être sensible à la casse.
Erik the Outgolfer
2

Mathematica, 145 octets

(s=StringCount[#,{"a","e","i","o","u","A","E","I","O","U"}]&/@(x=StringSplit@#);StringReverse[""<>Table[StringTake[x[[i]],s[[i]]],{i,Tr[1^s]}]])&
J42161217
la source
Je ne suis pas vraiment familier avec Mathematica, mais ne peut pas l'espace entre s[[i]]],et {i,Length@s}renvoyé?
M. Xcoder
oui bien sûr, j'ai raté ça. Je dois aussi
jouer au
Existe-t-il un moyen de convertir une chaîne en une liste dans Mathematica? Quelque chose comme ça "aeiouAEIOU".ToCharArray()?
caird coinheringaahing
vous voulez dire les personnages []?
J42161217
2

Rétine , 49 46 octets

i`(?=(([aeiou])|\w)+)((?<-2>.)+)\w* ?
$3
O^$`.

Essayez-le en ligne! Le lien inclut une suite de tests. Explication: il s'agit d'une application des groupes d'équilibrage de .NET. La tête de recherche recherche le mot pour les voyelles, qui sont capturées dans le groupe 2. Le groupe est ensuite sauté lorsque chaque lettre est appariée, capturant ainsi le nombre de lettres égal au nombre de voyelles dans le mot. Le reste du mot et tout espace de fin sont ensuite ignorés afin que le processus puisse recommencer avec le mot suivant. Enfin, les lettres restantes sont inversées.

Neil
la source
2

C # (.NET Core) , 144 octets

using System.Linq;s=>new string(string.Join("",s.Split(' ').Select(e=>e.Substring(0,e.Count(c=>"aeiouAEIOU".Contains(c))))).Reverse().ToArray())

Essayez-le en ligne!

Le pire, c'est qu'inverser un stringen C # renvoie un IEnumerable<char>que vous devez reconvertir en a string.

Charlie
la source
2

PHP , 96 octets

foreach(explode(" ",$argn)as$w)$r.=substr($w,0,preg_match_all("#[aeiou]#i",$w));echo strrev($r);

Essayez-le en ligne!

Jörg Hülsermann
la source
2

Python 3 , 83 81 79 77 octets

  • M. Xcoder a enregistré 2 octets
  • Griffin a économisé 2 octets: passer de Python 3 à 2
  • économisé 2 octets: utilisation de lambda
lambda z:''.join(i[:sum(y in'aeiouAEIOU'for y in i)]for i in z.split())[::-1]

Essayez-le en ligne!

officialaimm
la source
1
81 octets
M. Xcoder
1
passez à python 2 et vous n'avez pas besoin de l' ()impression
Griffin
1
@Griffin En Python 2, vous auriez besoin raw_input()au lieu de input()quoi gaspillerait 4 octets.
M. Xcoder
1
@ Mr.Xcoder pourquoi ne pouvez-vous pas simplement entrer des guillemets?
Griffin
1
@Griffin Ah, c'est vrai. Cela économiserait finalement 2 octets.
M. Xcoder
2

Java 8 , 171 151 octets

-20 octets grâce à @Lukas Rotter

J'ai l'impression qu'il faut encore du golf ... faites le moi savoir dans les commentaires si vous avez des suggestions.

s->{String z="";for(String w:s.split(" "))z+=w.substring(0,w.replaceAll("(?i)[^aeiou]","").length());return new StringBuilder(z).reverse().toString();}

Essayez-le en ligne!

Santiago Benoit
la source
Java prend en charge l' (?i)ignorance de la casse dans les expressions régulières. Cela (?i)[aeiou]devrait également fonctionner.
Lukas Rotter
Vous pouvez également supprimer les {}crochets de la boucle for, car une seule instruction y est contenue.
Lukas Rotter
Au lieu de soustraire la longueur de la chaîne d'expression régulière, vous pouvez également simplement utiliser ^pour trouver la quantité de voyelles: z+=w.substring(0,w.replaceAll("(?i)[^aeiou]","").length());
Lukas Rotter
1

Lisp commun, 218 octets

(defun p(s &aux(j 0)c(v 0)r)(dotimes(i(1+(length s))(apply'concatenate'string r))(cond((or(= i(length s))(eql(setf c(elt s i))#\ ))(setf r(cons(reverse(subseq s j(+ j v)))r)v 0 j(1+ i)))((find c"AEIOUaeiou")(incf v)))))

Explication

(defun p(s &aux (j 0) c (v 0) r)               ; j start of word, c current char, v num of wovels, r result
  (dotimes (i                                  ; iteration var
            (1+ (length s))                    ; iteration limit
            (apply 'concatenate 'string r))    ; iteration final result
    (cond ((or (= i (length s))                ; if string is terminated   
               (eql (setf c (elt s i)) #\ ))   ;  or, set current char, and this is a space, then
           (setf r (cons (reverse (subseq s j (+ j v))) r) ; push on result from current word chars as number of vowels
                 v 0                           ; reset number of vowels to 0
                 j (1+ i)))                    ; reset start of current word to next char
          ((find c "AEIOUaeiou")               ; if current char is a wovel
           (incf v)))))                        ;   then increment num of vowels
Renzo
la source
1

sed, 133 (132 + 1) octets

sed est appelé avec le -Edrapeau, ce qui signifie apparemment que j'ajoute un octet.
Remarque: je n'ai pas encore vraiment essayé de jouer au golf.

s/$/\n/
:l
s/(.)(\n.*)/\2\1/
tl
s/\n/ /
h
s/[aoeui]//g
G
:r
s/^(\S*) \S(.*\n\S* )\S/\1 \2/
tr
s/^ //
s/(\n\S*) /\1/
/^\n/!br
s/\s//g

Essayez-le en ligne!

zgrep
la source
1

Clojure, 96 94 octets

#(apply str(mapcat(fn[i](take(count(filter(set"aeiouAEIOU")i))i))(reverse(re-seq #"[^ ]+"%))))

Eh bien, cette longueur est assez ridicule. mapcatenregistré deux octets.

NikoNyrh
la source
1

Swift 3, 240 octets

C'est une fonction qui peut être utilisée avec f(s:"Input"). Étonnamment, je ne pense pas qu'il puisse être joué plus loin:

import Foundation
func f(s:String){var c=s.components(separatedBy:" "),r="";for i in c{let b=i.startIndex;r+=i[b...i.index(b,offsetBy: i.characters.filter{"aeiouAEIOU".contains(String($0))}.count-1)]};print(String(r.characters.reversed()))}

Essayez-le chez IBM Sandbox!


la source
2
En effet, il semble que vous ayez le code Swift le plus court possible pour cette soumission. Je l'ai également résolu dans Swift, et j'ai également obtenu 240 octets! Bien joué!
M. Xcoder