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


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

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

Это удивительно читабельно ... Можете ли вы добавить несколько слов о том, как это работает?
г-н 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"


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

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



3

JavaScript (ES6), 96 байт

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


Слова без гласных ( 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 ಠ_ಠ


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

Я не очень знаком с 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]

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



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

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

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


1

Clojure, 96 94 байта

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

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.