文字列から母音をクランチ


22

タスクの説明

場合によっては、書いているものを小さなスペースに収める必要があります。母音とwrt lk thsを落とすのは魅力的かもしれません-それに失敗すると、誰が本当にスペースを必要としますか?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文字列には大文字の母音はありません。特に、Unicode、タブ、改行は含まれません。

  • 入力文字列sおよび入力ターゲット長tを呼び出します。0 <t≤length(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発生しません。(大文字/小文字全体は、私が焦点を当てたいものではありません。)明確化を追加しました。
リン

1
とてもいいチャレンジです!
ルイスメンドー

@ edc65忘れないでくださいw(ワード共同で、例えばWwもちろん、この1のために定住しています母音は!ある)、それは母音の集合であることを述べていない場所のためにaeiou、あなたは時々含めるべきであるyw。:-O
corsiKa

ゴルフとは無関係for index, char in enumerate(string)ですが、range(len(str))コンストラクトの代わりに検討してください
ジェレミーワイリッヒ

回答:


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

Perl、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(タブ文字)を使用してバイトを削ると思います。(テストなし)
msh210

@chilemagic:/ $ + /とwhileの間のスペースを削除すると、古いperlでのみ機能します。最近のperlはパーサーを変更して、新しい正規表現修飾子(aw修飾子など)を追加する機能を開いたままにします
Ton Hospel

@ msh210:いくつかの魔法の変数に対しては動作しますが、空白に基づいたものに対しては動作しません
Ton Hospel

6

JavaScript(ES6)、66 61バイト

@Neilのおかげで5バイト節約

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

正規表現はこれ以上ゴルフに適さないと思います。驚いたことに、フロントツーバックを削除するために考えられる最短時間は1バイト長くなります。

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
ゴルフができなくても構いません。それは美しい正規表現です。
ニール

|.$/,"$1$2"5バイトを節約するために使用できることに気づきましたが。
ニール

@Neil先端をありがとう!
ETHproductions

2

sh + gnu 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

Lua、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

Perl、68

右から削除すると、大量の文字が追加されます。これを行うには、もっと良い方法があるかもしれません。

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

-i番号を入力するために使用します。これは、65文字プラス3であるiplコマンドラインです。

で実行:

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

Java 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));};

これは長すぎます。すぐに短くしようとします。javaに文字列を逆にしたり、後方に置換したりする方法があれば、もっと短くなります。

次を使用してテストします。

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この場合、カレーは機能しないようです(s->j->{...})。Javaは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

Scala、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 iはの長さの指標を取得Tの
/¨⊂i複数の要素(3)ブール選択I
1. (t∊'aeiou')ブール母音
2. (' '=t)ブール空間
3. 1すべての ∪∊参加のユニーク(平坦化)3つの選択で、
⌽⎕↓⌽最後に評価入力された文字をドロップします(と同じ(-⎕)↓
⌽i~一部を除去した後、残りのインデックスを逆


元の回答:

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

ええ、ええ、それ 少し読みにくいです。基本的に、OPからAPLへの直接変換:

  1. 逆入力。
  2. 必要な長さが(反転)入力文字列の数以上である場合、反転(反転)引数を返します。
  3. それ以外の場合、引数に母音がある場合は、最初の(つまり最後の)母音を削除し、残っているものを再帰的に呼び出します。
  4. それ以外の場合、引数にスペースがあれば、最初の(つまり最後の)ものを削除し、残っているものを再帰的に呼び出します。
  5. そうでない場合は、最初の(つまり最後の)文字を削除し、残っているものを再帰的に呼び出します。

0

Mathematica、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、169 143バイト

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

* utf8ToInt-> intToUtf8変換なしで書き換えて36バイト節約strstplitしましたpaste0(...,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.