Rozbij samogłoski z łańcucha

22

Opis zadania

Czasami naprawdę musisz zmieścić coś, co piszesz na małej przestrzeni. Kuszące może być upuszczanie samogłosek i pisanie tego - a jeśli nie, kto tak naprawdę potrzebuje przestrzeni? Thssprfctlrdbl!

Napisz funkcję lub program, który usuwa samogłoski pisane małymi literami aeiou, a następnie spacje, a następnie dowolne znaki z ciągu wejściowego . Co więcej, za każdym razem, gdy usuwasz postać, musi ona być najbardziej prawą postacią , która może zostać usunięta . Musi powtarzać ten proces, dopóki łańcuch nie będzie dłuższy niż określona długość wejściowa .

† „Jest to doskonale czytelne!” Ale jeśli czytasz ten przypis, prawdopodobnie nie jest, naprawdę ... :)

Przykłady

Tutaj możesz zobaczyć, że ten proces jest stosowany dla kolejno mniejszych rozmiarów wejściowych:

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.)

Po ściśnięciu sznurka do 17 znaków zabrakło samogłosek do usunięcia, więc następny znak, który usuwamy, jest najdalej po prawej stronie; kiedy trafiliśmy 14 znaków, usunęliśmy wszystkie samogłoski i spacje, więc po prostu zaczynamy przeszukiwać strunę od prawej do lewej.

Oto kod pseudokodu, który rozwiązuje to wyzwanie:

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

Zasady

  • To jest , więc wygrywa najkrótszy kod w bajtach.

  • Łańcuch wejściowy będzie się składał z drukowalnych znaków ASCII od spacji ( dziesiętna liczba 32) aż do tyldy (włącznie ~dziesiętna liczba 126). W AEIOUłańcuchu nie będzie samogłosek wielkich liter . W szczególności nie będzie dotyczył Unicode, tabulatorów ani nowych linii.

  • Wywołaj ciąg wejściowy s , a docelową długość wejściową t . Wówczas gwarantowana jest 0 <t ≤ długość ( -y ) ≤ 10000. (W szczególności, ciąg wejściowy nigdy nie będzie pusty. Jeśli t = długość ( y ), należy po prostu powrócić ciąg niezmodyfikowanej).

Przypadki testowe

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
Lynn
źródło
5
Czy yjest samogłoska?
edc65
1
Nie mogę uwierzyć, że zapomniałem to wyjaśnić! Nie, aeiousą samogłoski i AEIOUnie będą występować dla uproszczenia. (Cała wielka / mała litera nie jest tym, na czym chcę się skupić.) Dodałem wyjaśnienie.
Lynn,
1
Bardzo fajne wyzwanie!
Luis Mendo
@ edc65 Nie zapomnij w(na przykład, w co słowo wagowo , wto samogłoska!) Oczywiście, że załatwione na ten jeden, ale dla których nie stwierdził, że zestaw samogłosek jest aeiou, trzeba czasami to yi w. : -O
corsiKa
Nie ma związku z golfem, ale rozważ for index, char in enumerate(string)zamiast range(len(str))konstrukcji
Jeremy Weirich,

Odpowiedzi:

6

MATL , 20 bajtów

t11Y2mEG32=+K#Si:)S)

Wypróbuj online!

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
Luis Mendo
źródło
11

Perl, 48 45 43 bajtów

Obejmuje +4 dla -Xlpi(-X można pominąć, ale pozostawia brzydkie ostrzeżenia na STDERR)

Uruchom z liczbą po -iopcji i danymi wejściowymi na STDIN (obsługuje również wiele linii). na przykładperl -Xlpi50 crunch.pl <<< "Duis commodo scelerisque ex, ac consectetur metus rhoncus."

crunch.pl:

s/.*\K[aeiou]|.*\K |.$// while pos=-$^I
Ton Hospel
źródło
Nie potrzebujesz odstępu między /$+/iwhile
hmatt1
Myślę, że golisz bajt, używając ^ I (tabulatora) zamiast „^ I”. (Nietestowane.)
msh210
@chilemagic: upuszczanie spacji między / $ + / i podczas gdy działa tylko ze starszymi perlami. Ostatnie perle zmieniły parser, aby zachować możliwość dodawania nowych modyfikatorów
wyrażeń
@ msh210: Działa z niektórymi magicznymi zmiennymi, ale nie z tymi opartymi na białych
znakach
6

JavaScript (ES6), 66 61 bajtów

Zaoszczędź 5 bajtów dzięki @Neil

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

Nie sądzę, aby regex był bardziej golfowy. Zaskakujące jest to, że najkrótszy, jaki mogę wymyślić, aby usunąć przód-tył to bajt dłuższy:

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

Bardziej interesująca próba (ES7), 134 bajty

(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``

Wykorzystuje to podejście podobne do odpowiedzi MATL.

ETHprodukcje
źródło
1
Nie obchodzi mnie, czy to nie jest gra w golfa, to piękny regex.
Neil
Chociaż właśnie zauważyłem, że możesz użyć, |.$/,"$1$2"aby zapisać 5 bajtów.
Neil
@Neil Dzięki za wskazówkę!
ETHproductions
2

sh + gnu sed, 78 61

Podaj ciąg znaków STDINjako długość jako pierwszy argument.

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
Rainer P.
źródło
2

Lua, 120 bajtów

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())

Pobiera dane wejściowe jako argumenty wiersza polecenia, w formacie lua crunch.lua 10 "This is a string", z danymi wyjściowymi Ths sstrng.

Wyjaśnienie:

-- 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())
Jesse Paroz
źródło
1

Perl, 68

Usunięcie z prawej strony dodaje ton postaci, być może istnieje lepszy sposób, aby to zrobić.

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

Użyj, -iaby wprowadzić liczbę. Jest 65 znaków dodaniem 3 dla i, porazl w wierszu poleceń.

Biegnij z:

echo 'Hello, Code Golf World!' | perl -i13 -ple'$_=reverse;while(length>$^I){s/[aeiou]//||s/ //||s/.//}$_=reverse'
hmatt1
źródło
Możesz użyć y///czamiast lengthi możesz przesunąć pętlę while do końca:s///||s///||s///while$^I<y///c
andlrc
1

Java 8, 303 bajtów

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

To jest DROGA za długo. Niedługo spróbuję go skrócić. Byłoby znacznie krócej, gdyby java dysponowała metodą odwracania ciągów i zastępowania wstecz.

Przetestuj za pomocą:

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);
}
GamrCorps
źródło
1
Przytłaczająca większość w meta mówi, że możesz zaoszczędzić bajt dzięki
curry
@Cyoce wydaje się, że curry nie działa w tym przypadku ( s->j->{...}). Myślę, że albo Java nie obsługuje go zbyt dobrze, albo źle go konfiguruję.
GamrCorps
Skompilowane języki prawdopodobnie mają trudności z curry ze względu na funkcje pierwszej klasy
CalculatorFeline
@GrrCorps Sprawdzę i zobaczę, czy uda mi się sprawić, że wrócę do domu
Cyoce
1

C #, 180 bajtów

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

Próbnik:

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;
    }
}
DW.com
źródło
1

Scala, 160 bajtów

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]")," "),".")}

Próbnik:

val t="Hello, Code Golf World!"
println((t.size to 11 by -1).map(f(t,_)).mkString("\n"))
polana
źródło
1

Dyalog APL, 77 45 42 bajtów

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

t[]Litery tz indeksami ...
t←⌽⍞ t pobiera odwrócone wprowadzanie tekstu
i←⍳⍴t i otrzymuje indeksy długości t
/¨⊂i wielokrotności (3) logicznych wyborów elementów i :
1. (t∊'aeiou')boolean gdzie samogłoska
2. (' '=t)boolean gdzie spacja
3. 1wszystkie ∪∊unikalne z podanego ( spłaszczony) 3 pozycje
⌽⎕↓⌽ upuszczają ostatnio ocenione znaki (tak samo jak (-⎕)↓)
⌽i~odwracają pozostałe wskaźniki po usunięciu niektórych


Oryginalna odpowiedź:

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

Ehm, tak, to to trochę trudne do odczytania. Zasadniczo bezpośrednie tłumaczenie OP na APL:

  1. Odwrotne wejście.
  2. Jeśli wymagana długość jest dłuższa lub równa liczbie (odwróconych) ciągów wejściowych, wówczas zwracany jest argument odwrócony (odwrócony).
  3. W przeciwnym razie, jeśli argument ma dowolną samogłoskę, usuń pierwszą (tj. Ostatnią) i wywołuj rekurencyjnie resztę.
  4. W przeciwnym razie, jeśli argument ma jakąkolwiek spację, usuń pierwszą (tj. Ostatnią) i wywołuj rekurencyjnie na tym, co pozostało.
  5. W przeciwnym razie usuń pierwszą (tj. Ostatnią) postać i wywołuj rekurencyjnie resztę.
Adám
źródło
0

Mathematica, 201 bajtów

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&]

Musi być lepszy sposób niż ten ...

Simmons
źródło
0

R, 169 143 bajtów

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

* edycja zapisanych 36 bajtów poprzez przepisanie z utf8ToInt-> intToUtf8konwersjami nie strstplitipaste0(...,collapse)

niemiłosierny z wyjaśnieniem

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))])}
mnel
źródło