Description de la tâche
Parfois, vous devez vraiment adapter quelque chose que vous écrivez dans un petit espace. Il peut être tentant de laisser tomber les voyelles et les mots - et à défaut, qui a vraiment besoin d'espaces? Thssprfctlrdbl! †
Écrivez une fonction ou un programme qui supprime les voyelles minuscules aeiou
, puis les espaces, puis tous les caractères d'une chaîne d'entrée . De plus, chaque fois que vous supprimez un personnage, il doit être le personnage le plus à droite éligible pour la suppression. Il doit répéter ce processus jusqu'à ce que la chaîne ne dépasse pas une certaine longueur d'entrée donnée .
† "C'est parfaitement lisible!" Mais si vous lisez cette note, ce n'est probablement pas vraiment ... :)
Exemples
Ici, vous pouvez voir ce processus appliqué pour des tailles d'entrée successivement plus petites:
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.)
Après avoir réduit la chaîne à 17 caractères, nous manquons de voyelles à supprimer, donc le caractère suivant que nous supprimons est l'espace le plus à droite; lorsque nous frappons 14 caractères, nous avons supprimé toutes les voyelles et les espaces, donc nous commençons simplement à grignoter la chaîne de droite à gauche.
Voici un code Python pseudocode qui résout ce défi:
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
Règles
Il s'agit de code-golf , donc le code le plus court en octets l'emporte.
La chaîne d'entrée sera constituée des caractères ASCII imprimables de l'espace (
, décimal 32) jusqu'au tilde inclus (
~
, décimal 126). Il n'y aura pas de voyelles majusculesAEIOU
dans la chaîne. En particulier, aucun Unicode, onglet ou nouvelle ligne ne sera impliqué.Appelez la chaîne d'entrée s et la longueur cible d'entrée t . Alors 0 <t ≤ longueur ( s ) ≤ 10000 est garanti. (En particulier, la chaîne d'entrée ne sera jamais vide. Si t = longueur ( s ), vous devez simplement renvoyer la chaîne non modifiée.)
Cas de test
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
une voyelle?aeiou
sont des voyelles, etAEIOU
ne se produiront pas, pour plus de simplicité. (Le tout en majuscules / minuscules n'est pas ce sur quoi je veux me concentrer.) J'ai ajouté une clarification.w
(par exemple, dans le mot co w ,w
est une voyelle!) Bien sûr, c'est réglé pour celle-ci, mais pour les cas où il n'est pas indiqué que l'ensemble des voyelles estaeiou
, vous devez parfois inclurey
etw
. : -Ofor index, char in enumerate(string)
place de larange(len(str))
constructionRéponses:
MATL , 20 octets
Essayez-le en ligne!
la source
Perl,
484543 octetsComprend +4 pour
-Xlpi
(-X peut être omis mais laisse des avertissements moches sur STDERR)Exécutez avec le numéro après l'
-i
option et l'entrée sur STDIN (prend également en charge plusieurs lignes). par exempleperl -Xlpi50 crunch.pl <<< "Duis commodo scelerisque ex, ac consectetur metus rhoncus."
crunch.pl
:la source
/$+/
etwhile
JavaScript (ES6),
6661 octets5 octets enregistrés grâce à @Neil
Je ne pense pas que le regex soit jouable au golf plus loin. Étonnamment, le plus court que je puisse trouver pour supprimer l'avant-arrière est un octet plus long:
Tentative plus intéressante (ES7), 134 octets
Cela utilise une approche similaire à la réponse MATL.
la source
|.$/,"$1$2"
pour économiser 5 octets.sh + gnu sed,
7861Fournissez la chaîne à
STDIN
, la longueur comme premier argument.la source
Lua, 120 octets
Prend l'entrée comme arguments de ligne de commande, au format
lua crunch.lua 10 "This is a string"
, avec la sortieThs sstrng
.Explication:
la source
Perl, 68
Supprimer à droite ajoute une tonne de personnages, peut-être y a-t-il une meilleure façon de le faire.
Utilisez
-i
pour saisir le numéro. Il est de 65 caractères plus 3 pour lai
,p
etl
sur la ligne de commande.Courir avec:
la source
y///c
place delength
et vous pouvez déplacer la boucle while à la fin:s///||s///||s///while$^I<y///c
Java 8, 303 octets
C'est bien trop long. J'essaierai de le raccourcir bientôt. Ce serait beaucoup plus court si java avait une méthode pour inverser les chaînes et les remplacements en arrière.
Testez avec les éléments suivants:
la source
s->j->{...}
). Je pense que Java ne le supporte pas très bien ou je le configure mal.C #, 180 octets
Testeur:
la source
Scala, 160 octets
Testeur:
la source
Dyalog APL,
774542 octetst[
…]
Lettres de t avec indices ...t←⌽⍞
t obtient une entrée de texte inverséei←⍳⍴t
i obtient des indices de longueur de t/¨⊂i
multiples (3) sélections booléennes des éléments de i :1.
(t∊'aeiou')
booléen où voyelle2.
(' '=t)
booléen où espace3.
1
tout∪∊
unique de l'enrôlé ( aplati) 3 sélections⌽⎕↓⌽
suppriment les derniers caractères évalués en entrée (les mêmes que(-⎕)↓
)⌽i~
inversent les indices restants après avoir supprimé certainsRéponse originale:
Ehm, oui, c'est un peu difficile à lire. Fondamentalement, la traduction directe d'OP en APL:
la source
Mathematica, 201 octets
Il doit y avoir un meilleur moyen que cela ..
la source
R,
169143 octets* modifier les 36 octets enregistrés par réécriture avec
utf8ToInt
->intToUtf8
pas de conversionsstrstplit
etpaste0(...,collapse)
non golfé avec explication
la source