줄에서 모음 모음 Cd Glf Wrld! 17: Hll, Cd

과업 설명

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


답변

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

답변

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

답변

자바 스크립트 (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 답변과 비슷한 접근법을 사용합니다.


답변

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

답변

루아, 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())

답변

펄, 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'

답변

자바 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);
}