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 golf golfowy , 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). WAEIOU
ł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
y
jest samogłoska?aeiou
są samogłoski iAEIOU
nie będą występować dla uproszczenia. (Cała wielka / mała litera nie jest tym, na czym chcę się skupić.) Dodałem wyjaśnienie.w
(na przykład, w co słowo wagowo ,w
to samogłoska!) Oczywiście, że załatwione na ten jeden, ale dla których nie stwierdził, że zestaw samogłosek jestaeiou
, trzeba czasami toy
iw
. : -Ofor index, char in enumerate(string)
zamiastrange(len(str))
konstrukcjiOdpowiedzi:
MATL , 20 bajtów
Wypróbuj online!
źródło
Perl,
484543 bajtówObejmuje +4 dla
-Xlpi
(-X można pominąć, ale pozostawia brzydkie ostrzeżenia na STDERR)Uruchom z liczbą po
-i
opcji 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
:źródło
/$+/
iwhile
JavaScript (ES6),
6661 bajtówZaoszczędź 5 bajtów dzięki @Neil
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:
Bardziej interesująca próba (ES7), 134 bajty
Wykorzystuje to podejście podobne do odpowiedzi MATL.
źródło
|.$/,"$1$2"
aby zapisać 5 bajtów.sh + gnu sed,
7861Podaj ciąg znaków
STDIN
jako długość jako pierwszy argument.źródło
Lua, 120 bajtów
Pobiera dane wejściowe jako argumenty wiersza polecenia, w formacie
lua crunch.lua 10 "This is a string"
, z danymi wyjściowymiThs sstrng
.Wyjaśnienie:
źródło
Perl, 68
Usunięcie z prawej strony dodaje ton postaci, być może istnieje lepszy sposób, aby to zrobić.
Użyj,
-i
aby wprowadzić liczbę. Jest 65 znaków dodaniem 3 dlai
,p
orazl
w wierszu poleceń.Biegnij z:
źródło
y///c
zamiastlength
i możesz przesunąć pętlę while do końca:s///||s///||s///while$^I<y///c
Java 8, 303 bajtów
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ą:
źródło
s->j->{...}
). Myślę, że albo Java nie obsługuje go zbyt dobrze, albo źle go konfiguruję.C #, 180 bajtów
Próbnik:
źródło
Scala, 160 bajtów
Próbnik:
źródło
Dyalog APL,
774542 bajtówt[
…]
Litery tz indeksami ...t←⌽⍞
t pobiera odwrócone wprowadzanie tekstui←⍳⍴t
i otrzymuje indeksy długości t/¨⊂i
wielokrotności (3) logicznych wyborów elementów i :1.
(t∊'aeiou')
boolean gdzie samogłoska2.
(' '=t)
boolean gdzie spacja3.
1
wszystkie∪∊
unikalne z podanego ( spłaszczony) 3 pozycje⌽⎕↓⌽
upuszczają ostatnio ocenione znaki (tak samo jak(-⎕)↓
)⌽i~
odwracają pozostałe wskaźniki po usunięciu niektórychOryginalna odpowiedź:
Ehm, tak, to to trochę trudne do odczytania. Zasadniczo bezpośrednie tłumaczenie OP na APL:
źródło
Mathematica, 201 bajtów
Musi być lepszy sposób niż ten ...
źródło
R,
169143 bajtów* edycja zapisanych 36 bajtów poprzez przepisanie z
utf8ToInt
->intToUtf8
konwersjami niestrstplit
ipaste0(...,collapse)
niemiłosierny z wyjaśnieniem
źródło