줄에서 모음 모음


22

과업 설명

때때로, 당신은 정말로 당신이 쓰고있는 무언가를 작은 공간에 맞출 필요가 있습니다. 모음을 떨어 뜨리고 유혹을하는 유혹이있을 수 있습니다. 실제로 공간이 필요한 사람은 누구입니까? Thssprfctlrdbl!

이 모음 제거합니다 소문자하는 기능 또는 프로그램을 작성 aeiou하고 공간하고 어떤 문자를 입력 문자열 . 또한 캐릭터를 제거 할 때마다 제거 할 수있는 가장 오른쪽 캐릭터 여야합니다 . 문자열이 주어진 입력 길이보다 길지 않을 때까지이 과정을 반복해야합니다 .

†“이것은 완벽하게 읽을 수 있습니다!”그러나이 각주를 읽고 있다면 아마 실제로는 그렇지 않을 것입니다. :)

여기에서이 프로세스가 더 작은 입력 크기에 적용되는 것을 볼 수 있습니다.

23: Hello, Code Golf World!
22: Hello, Code Golf Wrld!
21: Hello, Code Glf Wrld!
20: Hello, Cod Glf Wrld!
19: Hello, Cd Glf Wrld!
18: Hell, Cd Glf Wrld!
17: Hll, Cd Glf Wrld!
16: Hll, Cd GlfWrld!
15: Hll, CdGlfWrld!
14: Hll,CdGlfWrld!
13: Hll,CdGlfWrld
12: Hll,CdGlfWrl
11: Hll,CdGlfWr
(etc.)

문자열을 17 자로 줄인 후에는 모음이 없어서 제거 할 다음 문자가 가장 오른쪽 공간입니다. 14자를 칠 때 모음 공백을 모두 제거 했으므로 문자열을 오른쪽에서 왼쪽으로 움직이기 시작합니다.

이 문제를 해결 하는 의사 코드 Python 코드 는 다음과 같습니다 .

def crunch_string(string, to_length):
    while len(string) > to_length:
        # Store the best candidate index for deletion here.
        best = None

        # First, find the rightmost vowel's index.
        for i in range(len(string)):
            if string[i] in 'aeiou':
                best = i

        # If there were no vowels, find the rightmost space's index.
        if best is None:
            for i in range(len(string)):
                if string[i] == ' ':
                    best = i

        # If there were no spaces either, use the final index.
        if best is None:
            best = len(string) - 1

        # Remove the selected character from the string.
        string = string[:best] + string[best + 1:]

    # Return the string once `len(string) <= to_length`.
    return string

규칙

  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

  • 입력 문자열은 공백 ( , 10 진수 32)에서 물결표 ( ~, 10 진수 126) 까지 의 인쇄 가능한 ASCII 문자로 구성됩니다 . AEIOU문자열 에는 대문자 모음이 없습니다 . 특히, 유니 코드, 탭 또는 줄 바꿈이 포함되지 않습니다.

  • 입력 문자열 s 및 입력 대상 길이 t를 호출하십시오 . 그런 다음 0 <t ≤ 길이 ( s ) ≤ 10000이 보장됩니다. (특히, 입력 문자열은 절대로 비어 있지 않습니다. t = length ( s )이면 문자열을 수정하지 않고 반환해야합니다.)

테스트 사례

Input:  50, Duis commodo scelerisque ex, ac consectetur metus rhoncus.
Output: Duis commodo scelerisque ex, ac cnscttr mts rhncs.

Input:  20, Maecenas tincidunt dictum nunc id facilisis.
Output: Mcnstncdntdctmnncdfc

Input:  150, golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf
Output: glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glfglfglfglfglfglfglfglfglfglf

5
가요 y모음는?
edc65

1
내가 그것을 설명하는 것을 잊었다 믿을 수 없다! 아니요, aeiou모음 AEIOU은 간단하며 발생하지 않습니다. (전체 대문자 / 소문자는 내가 집중하고 싶은 것이 아닙니다.) 나는 설명을 추가했습니다.
Lynn

1
아주 좋은 도전입니다!
루이스 멘도

@ edc65 잊지 마세요 w(단어 공동, 예를 들어 w , w물론,이 일을 위해 정착 모음은!이다)하지만,이 모음 세트임을 명시되지 않은 어디에 위해 aeiou, 당신은 때때로 포함해야 y하고 w. : -O
코 시카

골프와는 관련이 없지만 for index, char in enumerate(string), range(len(str))구조 대신에 고려
Jeremy Weirich

답변:


6

MATL , 20 바이트

t11Y2mEG32=+K#Si:)S)

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

t       % implicitly input string. Duplicate
11Y2    % predefined literal 'aeiou'
m       % ismember. Gives true for input characters that are vowels
E       % multiply by 2
G       % push input string again
32      % ASCII for space
=       % gives true for input characters that are spaces
+       % add: gives 2 for vowels, 1 for space, 0 for non-vowels-and-non space
K#S     % sort and push only the indices of the sorting. Sorting is stable, so first 
        % will be non-vowels-and-non space characters in their original order, then
        % spaces in their original order, then vowels in their original order
i       % input number n of characters that should be kept
:       % range [1,2,...,n]
)       % index with that: keep first n indices of the sorting
S       % sort those indices to restore their original order
)       % index into input string to keep only those characters. Implicitly display

11

펄, 48 45 43 바이트

에 +4 포함 -Xlpi(-X는 제외 할 수 있지만 STDERR에 못생긴 경고는 남음)

뒤에 숫자로 실행 -i옵션 와 STDIN의 입력으로 (여러 줄도 지원). 예 :perl -Xlpi50 crunch.pl <<< "Duis commodo scelerisque ex, ac consectetur metus rhoncus."

crunch.pl:

s/.*\K[aeiou]|.*\K |.$// while pos=-$^I

/$+/while
hmatt1

"^ I"대신 ^ I (탭 문자)를 사용하여 바이트를 면도한다고 생각합니다. (테스트되지
않음

@chilemagic : / $ + / 사이의 공간을 줄이면서 오래된 perls에서만 작동합니다. 최근의 perls는 파서를 변경하여 새로운 정규 표현식 수정 자 (aw 수정 자)를 추가 할 수 있도록했습니다
Ton Hospel

@ msh210 : 일부 마법 변수에는 작동하지만 공백에 기반한 변수에는 작동하지 않습니다
Ton Hospel

6

자바 스크립트 (ES6), 66 61 바이트

@Neil 덕분에 5 바이트 절약

f=(s,n)=>s[n]?f(s.replace(/(.*)[aeiou]|(.*) |.$/,"$1$2"),n):s

정규식이 더 골프화 될 수 있다고 생각하지 않습니다. 놀랍게도, 앞뒤로 제거하는 데 가장 짧은 것은 바이트가 더 깁니다.

f=(s,n)=>s[n]?f(s.replace(/(.*?)[aeiou]|(.*?) |./,"$1$2"),n):s

더 흥미로운 시도 (ES7), 134 바이트

(s,n,i=0)=>[for(c of s)[/[aeiou]/.test(c)*2+(c<'!'),i++,c]].sort(([x],[y])=>x-y).slice(0,n).sort(([,x],[,y])=>x-y).map(x=>x[2]).join``

이것은 MATL 답변과 비슷한 접근법을 사용합니다.


1
골프를 타지 않아도 상관 없습니다. 아름다운 정규 표현식입니다.
Neil

방금 |.$/,"$1$2"5 바이트를 절약 하는 데 사용할 수 있음을 알았습니다 .
Neil

@Neil 팁 주셔서 감사합니다!
ETHproductions 2016 년

2

sh + 너 sed, 78 61

STDIN첫 번째 인수로 길이 인에 문자열을 제공 하십시오.

rev|sed -r ":                       # reverse + invoke sed + jump label ":"
/..{$1}/!q                          # if the length is not greater $1, quit
p                                   # print
s/[aeiou]//                         # delete the first vowel
t                                   # if successful, start over at ":"
s/ //                               # delete the first space
t                                   # if successful, start over at ":"
s/.//                               # delete the first character
t"|rev                              # if successful, start over at ":" + reverse

2

루아, 120 바이트

s=arg[2]:reverse()a=s:len()-arg[1]s,n=s:gsub('[aeiou]','',a)s,m=s:gsub(' ','',a-n)print(s:gsub('.','',a-n-m):reverse())

lua crunch.lua 10 "This is a string"output을 형식으로 입력하여 명령 행 인수로 사용합니다 Ths sstrng.

설명:

-- Set 's' to the reverse of the string
s=arg[2]:reverse()
-- Set 'a' to the number of characters to be removed
a=s:len()-arg[1]
-- Remove 'a' vowels, set 'b' to the number of substitutions
s,b=s:gsub('[aeiou]','',a)
-- Remove 'a-b' spaces, set 'c' to the number of substitutions
s,c=s:gsub(' ','',a-b)
-- Remove 'a-b-c' characters, and print the now un-reversed string
print(s:gsub('.','',a-b-c):reverse())

1

펄, 68

오른쪽에서 제거하면 많은 문자가 추가되지만 더 좋은 방법이 있습니다.

$_=reverse;while(length>$^I){s/[aeiou]//||s/ //||s/.//}$_=reverse

-i숫자를 입력 할 때 사용 합니다. 그것은 65 개 문자 플러스에 3 i, pl 명령 줄에서.

로 실행 :

echo 'Hello, Code Golf World!' | perl -i13 -ple'$_=reverse;while(length>$^I){s/[aeiou]//||s/ //||s/.//}$_=reverse'

y///c대신에 사용할 length수 있고 while 루프를 끝으로 옮길 수 있습니다.s///||s///||s///while$^I<y///c
andlrc

1

자바 8, 303 바이트

(s,j)->{String t="";for(int i=s.length()-1;i>=0;t+=s.charAt(i--));while(t.length()>j&&t.matches(".*[aeiou].*"))t=t.replaceFirst("[aeiou]","");while(t.length()>j&&t.contains(" "))t=t.replaceFirst("\\s","");s="";for(int i=t.length()-1;i>=0;s+=t.charAt(i--));return s.substring(0,Math.min(t.length(),j));};

너무 길다. 곧 줄이려고합니다. 자바가 문자열을 역으로 바꾸고 역으로 대체하는 방법이 있다면 훨씬 짧을 것입니다.

다음을 사용하여 테스트하십시오.

public class StringCruncher {
    public static void main(String[] args) {
        Tester test = (s,j)->{String t="";for(int i=s.length()-1;i>=0;t+=s.charAt(i--));while(t.length()>j&&t.matches(".*[aeiou].*"))t=t.replaceFirst("[aeiou]","");while(t.length()>j&&t.contains(" "))t=t.replaceFirst("\\s","");s="";for(int i=t.length()-1;i>=0;s+=t.charAt(i--));return s.substring(0,Math.min(t.length(),j));};
        System.out.println(test.crunch("golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf", 150));
    }
}
interface Tester {
    String crunch(String s, int j);
}

1
메타의 압도적 다수는 카레로 바이트를 절약 할 수 있다고 말합니다
Cyoce

@Cyoce이 경우 커리가 작동하지 않는 것 같습니다 ( s->j->{...}). Java가 잘 지원하지 않거나 잘못 설정했다고 생각합니다.
GamrCorps

컴파일 된 언어는 아마도 일급 함수 때문에 카레 링에 어려움을 겪을 것입니다.
CalculatorFeline

@GamrCorps 나는 집에 돌아 왔을 때 내가 일을 할 수 있는지 확인하고 볼 것이다
Cyoce

1

C #, 180 바이트

string c(int l,string s){while(s.Length>l){int i=0;Func<string,bool>f=t=>(i=s.LastIndexOfAny(t.ToCharArray()))!=-1;if(!(f("aeiou")||f(" ")))i=s.Length-1;s=s.Remove(i,1);}return s;}

시험 장치:

using System;
class Crunch
{
    static int Main()
    {
        var x = new Crunch();
        Console.WriteLine(x.c(50, "Duis commodo scelerisque ex, ac consectetur metus rhoncus."));
        Console.WriteLine(x.c(20, "Maecenas tincidunt dictum nunc id facilisis."));
        Console.WriteLine(x.c(150, "golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf"));
        Console.Read();
        return 0;
    }
    string c(int l,string s){while(s.Length>l){int i=0;Func<string,bool>f=t=>(i=s.LastIndexOfAny(t.ToCharArray()))!=-1;if(!(f("aeiou")||f(" ")))i=s.Length-1;s=s.Remove(i,1);}return s;}

    static string crunch(int len, string str)
    {
        Console.WriteLine($"{str.Length}: {str}");
        while (str.Length > len) {
            int idx=0;
            Func<string,bool> f = s => (idx = str.LastIndexOfAny(s.ToCharArray()))!= -1;
            if (!(f("aeiou") || f(" "))) idx = str.Length-1;
            str = str.Remove(idx,1);
            Console.WriteLine($"{str.Length}: {str}");
        }
        return str;
    }
}

1

스칼라, 160 바이트

type S=String;def f(s:S,l:Int)={def r(s:S,p:S):S=if(s.size>l){val j=s.replaceFirst("(?s)(.*)"+p,"$1");if(j==s)s else r(j,p)}else s;r(r(r(s,"[aeiou]")," "),".")}

시험 장치:

val t="Hello, Code Golf World!"
println((t.size to 11 by -1).map(f(t,_)).mkString("\n"))

1

Dyalog APL, 77 45 42 바이트

t[⌽i~⌽⎕↓⌽∪∊(t∊'aeiou')(' '=t)1/¨⊂i←⍳⍴t←⌽⍞]

t[... ]글자 t 인덱스와 ...
t←⌽⍞ t는 반전 텍스트 입력 얻는다
i←⍳⍴t 의 길이의 지수 취득 t의
/¨⊂i 복수의 요소 (3) 부울 선택 I :
1. (t∊'aeiou')부울 모음
2. (' '=t)부울 공간
3. 1모든 ∪∊입대 고유 ( flattened) 3 개의 선택 항목
⌽⎕↓⌽이 마지막으로 평가 된 입력 문자 를 제거하고 (와 동일 (-⎕)↓)
⌽i~일부를 제거한 후 나머지 색인을 반전시킵니다.


원래 답변 :

⎕{⍺≥≢⍵:⌽⍵⋄∨/⍵∊⍨v←'aeiou':⍺∇⍵/⍨~<\(⍳⍴⍵)∊⍵⍳v⋄' '∊⍵:⍺∇⍵/⍨~<\(⍳⍴⍵)=⍵⍳' '⋄⍺∇1↓⍵}⌽⍞

흠, 그래, 그 입니다 조금 읽기 어렵다. 기본적으로 OP를 APL로 직접 변환합니다.

  1. 역 입력.
  2. 필요한 길이가 (역전 된) 입력 문자열의 수보다 길거나 같으면 역전 된 (역전 된) 인수를 반환합니다.
  3. 그렇지 않은 경우, 인수에 모음이 있으면 첫 번째 (즉, 마지막) 모음을 제거하고 남은 항목을 재귀 적으로 호출하십시오.
  4. 그렇지 않으면, 인수에 공백이 있으면 첫 번째 (즉 마지막) 것을 제거하고 남아있는 것을 재귀 적으로 호출하십시오.
  5. 그렇지 않으면, 첫 번째 (즉, 마지막) 문자를 제거하고 남아있는 것을 재귀 적으로 호출하십시오.

0

수학, 201 바이트

f@x_:=StringReplaceList[x,"a"|"e"|"i"|"o"|"u"->""];g@x_:=StringReplaceList[x," "->""];x_~l~y_:=NestWhile[If[f@#!={},Last@f@#,If[g@#!={},Last@g@#,Last@StringReplaceList[#,_->""]]]&,x,StringLength@#!=y&]

이보다 더 좋은 방법이 있어야합니다 ..


0

R, 169143 바이트

function(x,y){d=utf8ToInt(x);o=c(rev(which(d%in%utf8ToInt('aeiou'))),rev(which(d==32)));intToUtf8(d[sort(tail(c(o,setdiff(nchar(x):1,o)),y))])}

* 편집과 재 작성을 통해 36 바이트를 저장 utf8ToInt-> intToUtf8변환하지 strstplitpaste0(...,collapse)

설명이없는

function(x,y){d=utf8ToInt(x);         # convert string (x) to integer
o=c(
 rev(which(d%in%utf8ToInt('aeiou'))), # index of vowels (reversed)
 rev(which(d==32)));                  # index of spaces
 intToUtf8(d[                         # convert subset back to character
   sort(tail(                         # return the first y index of 
                                      # "left over" characters
   c(o,setdiff(nchar(x):1,o))         # combine vowels, spaces and 
                                      # other indices in appropriate order
  ,y))])}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.