Сделать струнные волны

19

Задав строку в качестве входных данных, выведите строку с применением следующего алгоритма:

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"

Спекуляции

  • Вы можете принимать и предоставлять выходные данные в любой стандартной форме , и единственным типом данных, разрешенным как для ввода, так и для вывода, является собственный тип String вашего языка. Принимать ввод непосредственно как список отдельных слов не разрешается.

  • Вам гарантировано, что не будет последовательных пробелов.

  • Гласные есть "a","e","i","o","u","A","E","I","O","U", но "y","Y" не считаются гласными .

  • Вам гарантировано, что на входе будут отображаться только буквы и пробелы, но без перевода строки.

  • Вывод должен быть чувствительным к регистру.

  • Вам не гарантируется, что каждое слово содержит гласный. Если в этом слове нет гласных, вам не нужно ничего выводить для него.

Тестовые случаи

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"

счет

Самое короткое действительное представление для каждого языка выигрывает, это - . Удачи и приятного времяпровождения!


Песочница для тех, кто видит удаленные посты.

Мистер Xcoder
источник
Извините за временное удаление!
г-н Xcoder
6
Не знаю, почему я думал, что это будет PCG о струнных (как в теории струн ) волнах (как при колебаниях в поле). Может быть, пришло время идти спать.
23
2
@ Mr.Xcoder: Пожалуйста, добавьте контрольный пример с гласными в верхнем регистре. Благодарность!
Nimi
@nimi Добавлено. Это один и тот же алгоритм, в любом случае.
Мистер Кскодер
1
@ Mr.Xcoder: да, но по крайней мере два ответа ошиблись (оба исправлены сейчас).
Nimi

Ответы:

7

Haskell, 59 байт

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

Попробуйте онлайн!

       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
Ними
источник
6

V , 31 байт

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

Попробуйте онлайн!

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

И объяснение:

Í               " 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
источник
Это удивительно читабельно ... Можете ли вы добавить несколько слов о том, как это работает?
г-н Xcoder
Я впечатлен тем, как часто я вижу æиспользованный, я помню, что он добавлялся совсем недавно, и это одна из наиболее полезных команд.
nmjcman101
@ nmjcman101 Да, я полностью согласен. æявляется чрезвычайно полезным. Я должен был добавить это давным-давно. øтоже очень приятно, это круто, что этот ответ использует оба.
DJMcMayhem
Кажется, что работает без первого |( попробуйте онлайн! ), Что не в вашем объяснении. Но я не знаю V; это нужно?
CAD97
@ CAD97 Ах, я пропустил это в своем объяснении. Это работает для всех тестовых случаев, но прерывается, когда в слове 10 или более гласных (потому <C-a>что курсор ставится в конце слова). tio.run/##K/v//3Cvgv7hTVyHNx1uObzj8OLoxNTM/…
DJMcMayhem
5

Брахилог , 17 байт

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

Попробуйте онлайн!

объяснение

Это прямой перевод проблемы:

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
источник
4

Алиса , 32 байта

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

Попробуйте онлайн!

объяснение

/....
\...@/

Это просто структура для линейного кода в Ordinal (режим обработки строк). Развернув программу, мы получим:

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

Вот что он делает:

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.
Мартин Эндер
источник
4

JavaScript (ES6), 76 байт

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

Контрольные примеры

Arnauld
источник
4

Perl 5, 47 байт

45 байт код + 2 для -pa.

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

Попробуйте онлайн!

Дом Гастингс
источник
Работает ли это с гласными в верхнем регистре, например, "Алабама"?
Nimi
@nimi ооо, не думал об этом, обновил +1.
Дом Гастингс
3

JavaScript (ES6), 96 байт

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

darrylyeo
источник
Слова без гласных ( Thx) не должны выводиться; ваш тестовый пример выводит все слово.
Джастин Маринер,
@JustinMariner Исправлено!
darrylyeo
3

Pyth - 19 байт

_jkm<dl@"aeiou"rd0c

Попробуй здесь

Объяснение:

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

Я мог бы иметь 18 байт, если бы не пустая строка:

_sm<dl@"aeiou"rd0c
Мария
источник
1
@DigitalTrauma: я только что добавил объяснение
Мария
1
@- пересечение гораздо лучше, чем регулярное выражение здесь. О, я вижу - у вас есть только одна лямбда / карта по сравнению с моей 2.
Цифровая травма
3

Пиф, 31

Это заняло у меня много времени, и я чувствую, что, возможно, есть лучший подход, но вот что у меня есть:

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

Интернет тест .

                             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
Цифровая травма
источник
> Я чувствую, что, возможно, есть лучший подход - я получил 19 в Pyth
Мария
1
@ Светлана, я исправила это. Спасибо за jkсовет.
Цифровая травма
3

Ом, 13 байт

z:αv_K_σh;0JR

объяснение

  • Сначала (неявный) вход разделяется на пробелы z.
  • Затем запускается цикл foreach ( :) со связанным с ним блоком кода αv_K_σh.
    • av толчки aeiou
    • _ выдвигает текущий повторяющийся элемент
    • Kсчитает вхождения aeiouв_
    • _ элемент снова
    • σhРазбивает элемент на куски длины occurencesи берет первый элемент.
      • Эффективно это занимает первые occurencesсимволы
  • 0J Толкает стек присоединился ''
    • 0Необходимо , потому что это требует аргумент , что будут соединены. Если этот аргумент не массив, он присоединяется к стеку
  • R меняет результат
  • неявная печать TOS
Роман Греф
источник
3

Рубин , 54 59 + 1 = 55 60 байт

Использует -pфлаг для +1 байта.

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

Попробуйте онлайн!

Значение чернил
источник
@nimi Теперь так.
Value Ink
Просто любопытно, почему -pбайт стоит?
Эрик
2
@EricDuminil Посмотрите этот мета-пост, но в основном потому, что ruby -pe '...'он всего на один байт больше ruby -e '...'и -eявляется допустимым способом выполнения скрипта.
Дом Гастингс
3

Japt v2.0a0, 12 10 байт

¸®¯Zè\vìw

Попытайся


объяснение

В значительной степени делает именно то, что описывает спецификация!

        :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.
мохнатый
источник
Хорошо, что я проверил существующие ответы, прежде чем написать свои: P Хороший, я не думаю, что он станет
немного
Кроме того: в Japt 2.0 вы можете теоретически изменить его "%v"на \v(литерал регулярного выражения одного класса, эквивалентный /\v/). Конечно, пока не полезно, поскольку я еще не внедрил v2.0;)
ETHproductions
@ETHproductions, я собирался выбежать за дверь, когда этот вызов всплыл, поэтому я просто написал это быстро, воспринимая его буквально. Может быть, есть более короткий способ сделать это буквально, может быть? Эти изменения в RegEx будут полезны для сохранения нескольких байтов; с нетерпением жду их
Shaggy
2

05AB1E , 14 байтов

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

Попробуйте онлайн!

У Darn 05AB1E нет встроенной функции для AEIOUaeiou ಠ_ಠ

Эрик Outgolfer
источник
1
Подожди ... 05AB1E избили Джапта?
г-н Xcoder
@ Mr.Xcoder Бывает чаще, чем вы думаете.
Эрик Outgolfer
1
#RʒDlžMÃg£R?для 12, вы можете в значительной степени просто нижний регистр dupe, устраняя необходимость AEIOUaeiou. Кроме того, почему, черт возьми, эта работа не будет без ?? Можете ли вы опубликовать объяснение, с которым я незнакомʒ
Волшебная осьминог Урна
@carusocomputing К сожалению, вывод должен быть чувствительным к регистру.
Эрик Outgolfer
2

Mathematica, 145 байт

(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
источник
Я не очень знаком с Mathematica, но неужели пространство между s[[i]]],и {i,Length@s}быть удаленным?
г-н Xcoder
да, конечно, я пропустил это. Я тоже
должен
Есть ли способ привести строку в список в Mathematica? Что то типа "aeiouAEIOU".ToCharArray()?
Caird coinheringaahing
Вы имеете в виду Персонажи []?
J42161217
2

Retina , 49 46 байт

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

Попробуйте онлайн! Ссылка включает тестовый набор. Объяснение: Это приложение балансировочных групп .NET. Голова ищет в слове гласные, которые записаны в группе 2. Затем группа подбирается при совпадении каждой буквы, таким образом фиксируя количество букв, равное количеству гласных в слове. Остальная часть слова и любой завершающий пробел затем игнорируются, так что процесс может начаться снова со следующего слова. Наконец остальные буквы поменялись местами.

Нил
источник
2

C # (.NET Core) , 144 байта

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

Попробуйте онлайн!

Хуже всего то, что обращение stringC в C # возвращает a, IEnumerable<char>которое вы должны преобразовать обратно в a string.

Чарли
источник
2

Python 3 , 83 81 79 77 байтов

  • Мистер Xcoder сэкономил 2 байта
  • Грифон сохранил 2 байта: переключение с Python 3 на 2
  • сэкономлено 2 байта: использование лямбды
lambda z:''.join(i[:sum(y in'aeiouAEIOU'for y in i)]for i in z.split())[::-1]

Попробуйте онлайн!

officialaimm
источник
1
81 байт
Mr. Xcoder
1
перейти на python 2, и вам не нужно ()печатать
Griffin
1
@Griffin В Python 2 вам понадобится raw_input()вместо того, input()чтобы тратить 4 байта.
г-н Xcoder
1
@ Mr.Xcoder, почему ты не можешь просто вводить с кавычками?
Гриффин
1
@ Гриффин А, да. Это в конечном итоге сэкономит 2 байта.
г-н Xcoder
2

Java 8 , 171 151 байт

-20 байт благодаря @Lukas Rotter

Я чувствую, что он все еще нуждается в игре в гольф ... дайте мне знать в комментариях, если у вас есть какие-либо предложения.

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

Попробуйте онлайн!

Сантьяго Бенуа
источник
Java поддерживает (?i)игнорирование регистра в регулярных выражениях. Так (?i)[aeiou]должно и работать.
Лукас Роттер
Вы также можете удалить {}скобки цикла for, так как в нем содержится только одна инструкция.
Лукас Роттер
Вместо того, чтобы вычитать длину строки регулярного выражения, вы также можете просто использовать, ^чтобы найти количество гласных: z+=w.substring(0,w.replaceAll("(?i)[^aeiou]","").length());
Lukas Rotter
1

Common Lisp, 218 байт

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

объяснение

(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
источник
1

sed, 133 (132 + 1) байта

Sed вызывается с -Eфлагом, что, очевидно, означает, что я добавляю один байт.
Примечание: я еще не пытался играть в гольф.

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

Попробуйте онлайн!

zgrep
источник
1

Clojure, 96 94 байта

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

Ну, эта длина довольно смешная. mapcatсохранил два байта.

NikoNyrh
источник
1

Swift 3, 240 байт

Это функция, которую можно использовать с f(s:"Input"). Удивительно, но я не думаю, что это может быть дальше в гольф:

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

Попробуйте это в IBM Sandbox!


источник
2
Действительно, кажется, что у вас есть самый короткий код Swift, возможный для этого представления. Я решил это и в Swift, а также получил 240 байт! Отлично сработано!
г-н Xcoder