스트링 웨이브 만들기


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"

명세서

  • 당신은 입력을 받아 의해 출력을 제공 할 수 있는 표준 양식 및 입력과 출력 모두에 대해 허용되는 유일한 데이터 유형은 언어의 기본 문자열 유형입니다. 개별 단어 목록으로 직접 입력하는 것은 허용되지 않습니다.

  • 연속 된 공백이 없음을 보장합니다.

  • 모음은 "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"

채점

각 언어에 대한 가장 짧은 유효한 제출이 이기고 입니다. 행운을 빌고 재미있게 보내!


삭제 된 게시물을 볼 수있는 사용자를위한 샌드 박스


임시 삭제에 대해 죄송합니다.
Mr. Xcoder 2016 년

6
왜 이것이 스트링 ( String Theory ) 에서와 같은 스트링 ( 필드에서의 진동에서와 같이) 에 관한 PCG가 될 것이라고 생각했는지 모르겠다 . 아마도 잠을 잘 시간이다.
Marc.2377

2
@ Mr.Xcoder : 대문자 모음이있는 테스트 케이스를 추가하십시오. 감사!
nimi

@nimi가 추가되었습니다. 경우에 관계없이 동일한 알고리즘입니다.
Mr. Xcoder 2016 년

1
@ Mr.Xcoder : 예, 그러나 적어도 두 가지 대답이 잘못되었습니다 (둘 다 수정되었습니다).
nimi

답변:


7

하스켈, 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

이것은 놀랍게도 읽을 수 있습니다 ... 작동 방식에 대한 단어를 추가 할 수 있습니까?
Mr. Xcoder 2016 년

나는 얼마나 자주 æ사용 되는지 보는 것에 감명을 받았으며 , 최근에 추가 된 것을 기억하는 것처럼 보이며 더 유용한 명령 중 하나입니다.
nmjcman101 2018 년

네, 전적으로 동의합니다. æ이다 매우 유용합니다. 오래 전에 추가 했어야 했어요. ø이 답변이 두 가지를 모두 사용하는 것이 좋습니다.
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

펄 6 , 57 바이트

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

4

Alice , 32 바이트

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

온라인으로 사용해보십시오!

설명

/....
\...@/

이것은 서수 (문자열 처리 모드)에서 선형 코드의 프레임 워크 일뿐입니다. 프로그램을 전개하면 다음과 같은 이점이 있습니다.

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

자바 스크립트 (ES6), 76 바이트

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

테스트 사례



3

자바 스크립트 (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
@-교차는 정규 표현식보다 훨씬 낫습니다.
Digital Trauma

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
@ 스베틀라나는 거기에서 고쳤습니다. 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바이트 가 가치가 있습니까?
Eric Duminil

2
참조 @EricDuminil 이 메타 게시물을 하기 때문에,하지만, 기본적으로 ruby -pe '...'보다 하나 더 바이트 ruby -e '...'-e스크립트를 실행하는 유효한 방법입니다.
Dom Hastings

3

apt 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

따로 : Japt 2.0에서는 이론적 "%v"으로 \v(단일 클래스 정규 표현식 리터럴로 바꿀 수 있음)로 변경할 수 있습니다 /\v/. 물론 v2.0을 아직 구현하지 않았으므로 아직 도움이되지 않습니다.)
ETHproductions

@ETHproductions, 나는이 도전이 나타 났을 때 문을 다 떨어 뜨릴 준비를하고 있었기 때문에 문자 그대로 받아 들였습니다. 말 그대로 덜하는 짧은 방법이있을 수 있습니다. RegEx에 대한 이러한 변경 사항은 몇 바이트를 절약하는 데 유용합니다. 그들을 기대
Shaggy


2

05AB1E , 14 바이트

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

온라인으로 사용해보십시오!

Darn 05AB1E는 AEIOU를위한 내장 기능이 없습니다.


1
잠깐만 요 ... 05AB1E가 Japt에게 맞습니까?
Mr. Xcoder 2016 년

@ Mr.Xcoder는 생각보다 자주 발생합니다.
Outgolfer Erik

1
#RʒDlžMÃg£R?12의 경우, 듀피를 제거하여 거의 소문자를 사용할 수 있습니다 AEIOUaeiou. 또한 도대체 왜이 작업을 수행하지 않았을까요 ?? 설명을 게시 할 수 있습니까? 저는 익숙하지 않습니다ʒ
Magic Octopus Urn

@carusocomputing 불행히도 출력은 대소 문자를 구분해야합니다.
아웃 골퍼 Erik 14

2

수학, 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}제거 할 수 없습니까?
Mr. Xcoder 2016 년

네 물론입니다. 나는 또한 그것을 더 골프해야합니다
J42161217

Mathematica에서 문자열을 목록에 캐스트하는 방법이 있습니까? 같은 것 "aeiouAEIOU".ToCharArray()?
caird coinheringaahing

당신은 문자 []를 의미합니까?
J42161217

2

망막 , 49 46 바이트

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

온라인으로 사용해보십시오! 링크에는 테스트 스위트가 포함되어 있습니다. 설명 : .NET 밸런싱 그룹의 응용 프로그램입니다. lookahead는 그룹 2에서 캡처 된 모음에 대해 단어를 검색합니다. 그러면 각 문자가 일치 할 때 그룹이 팝업되어 단어의 모음 수와 같은 문자 수를 캡처합니다. 그런 다음 나머지 단어와 후행 공백은 무시되어 프로세스가 다음 단어로 다시 시작할 수 있습니다. 마지막으로 나머지 글자가 바뀝니다.


2

C # (. NET 코어) 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 #에서 a를 뒤집 으면 a IEnumerable<char>로 다시 변환해야한다는 것을 반환 한다는 것 string입니다.



2

파이썬 3 , 83 81 79 77 바이트

  • Mr. Xcoder 가 2 바이트를 절약했습니다
  • 그리핀 2 바이트 절약 : 파이썬 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 파이썬 2에서는 4 바이트를 낭비하는 raw_input()대신에 필요 input()합니다.
Mr. Xcoder 2016 년

1
@ Mr.Xcoder 왜 따옴표로 입력 할 수 없습니까?
Griffin

1
@Griffin 아, 맞아. 결국 2 바이트를 절약 할 수 있습니다.
Mr. Xcoder 2018 년

2

자바 8 ,171 151 bytes

@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]도 작동합니다.
Lukas Rotter

{}하나의 명령문 만 포함되므로 for 루프 의 대괄호를 제거 할 수도 있습니다.
Lukas Rotter

정규 표현식 문자열의 길이를 빼는 대신 ^모음의 양을 찾기 위해 사용할 수도 있습니다 . z+=w.substring(0,w.replaceAll("(?i)[^aeiou]","").length());
Lukas Rotter


1

공통 리스프, 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플래그 와 함께 호출되며 분명히 1 바이트를 추가한다는 것을 의미합니다.
참고 : 아직 골프를 시도하지 않았습니다.

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

클로저, 96 94 바이트

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

이 길이는 꽤 말도 안됩니다. mapcat2 바이트를 저장했습니다.


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
Indeed, it seems like you have the shortest Swift code possible for this submission. I have solved it in Swift as well, and also got 240 bytes! Well done!
Mr. Xcoder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.