使弦波


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先生17年

6
不知道为什么我会认为这将是关于弦波(如弦论中)或声场(如场中振荡)的PCG 。也许该睡觉了。
Marc.2377

2
@ Mr.Xcoder:请添加一个带有大写元音的测试用例。谢谢!
nimi

@nimi添加了。无论哪种情况,它都是相同的算法。
Xcoder先生17年

1
@ Mr.Xcoder:是的,但是至少有两个答案弄错了(现在都已修复)。
nimi 2015年

Answers:


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先生17年

我对使用的频率印象深刻æ,似乎还记得它是最近才添加的,它是更有用的命令之一。
nmjcman101

@ nmjcman101是的,我完全同意。æ非常有用的。我应该早就添加了。ø也非常好,这个答案同时使用会很酷。
DJMcMayhem

好像没有第一个|在线尝试!),它就可以工作,这不在您的解释之列。但是我不知道V。需要吗?
CAD97

@ CAD97啊,我的解释中确实没有提到。这确实适用于所有测试用例,但是当单词中有10个或更多的元音时,它会中断(因为<C-a>将光标置于单词的末尾)。tio.run/##K/v//3Cvgv7hTVyHNx1uObzj8OLoxNTM/...
DJMcMayhem

5

Brachylog,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

Perl 6、57字节

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

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:我刚刚添加了一个解释
Maria

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

>我觉得可能有更好的方法-我在佩斯(Pyth)获得19分
玛丽亚(Maria)

1
@Svetlana我固定了。感谢您的jk提示。
Digital Trauma

3

欧姆,13个字节

z:αv_K_σh;0JR

说明

  • 首先,将(隐式)输入用分隔z
  • 然后,开始foreach循环(:),并将其相关的代码块设为αv_K_σh
    • avaeiou
    • _ 推送当前迭代的元素
    • K计算aeiouin 的出现_
    • _ 再次元素
    • σh将元素拆分为多个长度片段,occurences并获取第一个元素。
      • 有效地,这需要第一个occurences字符
  • 0J 将堆栈推入 ''
    • 0之所以必要,是因为它需要一个将要加入的参数。如果该参数不是数组,它将加入堆栈
  • R 反转结果
  • TOS的隐式打印


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好,我认为它不会变得更短(尽管我当然可能是错的...)
ETHproductions 2015年

另外:从理论上讲,在Japt 2.0中,您可以更改"%v"\v(单类正则表达式文字,等效于/\v/)。当然,这还没有帮助,因为我尚未实现v2.0;)
ETHproductions 2015年

@ETHproductions,当这个挑战突然出现时,我已经准备好出门了,所以我很快就写了出来,字面意思。可能有一种更短的方法来减少字面量,也许吗?对RegEx所做的更改将非常方便,以节省一些字节;期待他们
毛茸茸的


2

05AB1E,14个字节

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

在线尝试!

达恩05AB1E尚未内置AEIOUaeiouಠ_ಠ


1
等待... 05AB1E被Japt打败了?
Xcoder先生17年

@ Mr.Xcoder发生的次数比您想象的要多。
暴民埃里克(Erik the Outgolfer)'17年

1
#RʒDlžMÃg£R?对于12,您几乎可以将小写字母替换为小写,从而消除对的需要AEIOUaeiou。另外,为什么没有该功能,这项工作就不会进行??您能发表解释吗,我不熟悉ʒ
Magic Octopus Urn

@carusocomputing不幸的是,输出必须区分大小写。
暴民埃里克(Erik the 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]}]])&

我并不真正熟悉数学,但不能之间的空间s[[i]]],{i,Length@s}被删除?
Xcoder先生17年

是的,我当然想念那个。我也必须打更多的高尔夫球
J42161217

有没有一种方法可以在Mathematica中将字符串转换为列表?像"aeiouAEIOU".ToCharArray()什么?
caird coinheringaahing

你是说字符[]?
J42161217

2

视网膜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())

在线尝试!

最糟糕的是,扭转了string在C#回报IEnumerable<char>,你必须转换回一个string



2

Python 3中83个 81 79 77字节

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先生17年

1
@ Mr.Xcoder为什么不能只输入引号?
格里芬

1
@格里芬啊,对。最终将节省2个字节。
Xcoder先生17年

2

Java的8171个 151字节

@Lukas Rotter,-20个字节

我觉得它仍然需要打高尔夫球...如果您有任何建议,请在评论中告诉我。

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

普通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

斯威夫特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先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.