Tiré directement du Concours de programmation d'hiver ACM 2013. Vous êtes une personne qui aime prendre les choses au pied de la lettre. Par conséquent, pour vous, la fin du Monde est finie; les dernières lettres de "The" et "World" concaténées.
Créez un programme qui prend une phrase et affichez la dernière lettre de chaque mot de cette phrase dans le moins d'espace possible (le moins d'octets). Les mots sont séparés par autre chose que des lettres de l'alphabet (65 - 90, 97 - 122 sur la table ASCII.) Cela signifie que les traits de soulignement, les tildes, les tombes, les accolades, etc. sont des séparateurs. Il peut y avoir plus d'un séparateur entre chaque mot.
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
-> flvmrp
pigs, eat dogs; eat Bob: eat pigs
-> ststbts
looc si siht ,gnitirw esreveR
-> citwR
99_bottles_of_beer_on_the_wall
->sfrnel
Réponses:
Perl 5, 18 octets
Nécessite un
-p
commutateur de ligne de commande. La propriété nomméeL
correspond uniquement aux caractères de lettreA-Za-z
. Il existe plusieurs centaines de ces propriétés nommées, mais quand il s'agit de texte ASCII, très peu d'entre elles sont intéressantes. En outre\pL
, la seule autre note réelle est\pP
qui correspond à la ponctuation.Essayez-le en ligne!
Perl 5, 17 octets
Une amélioration d'un octet par Dom Hastings
Nécessite
-n
(et-l
pour prendre en charge plusieurs entrées).Essayez-le en ligne!
Exemple d'utilisation
la source
\w
correspond également aux chiffres et aux traits de soulignement.|.
n'était pas évidente (du moins pour moi).-1
inprint/\pL*(\pL)/g
, semble produire la même chose pour vos cas de test!ed, 35 caractères
Ainsi, le monde se termine en éd. Comme j'aime être trop littéral, j'ai décidé d'écrire pour écrire la solution avec ed - et apparemment c'est en fait un langage de programmation . C'est étonnamment court, même si de nombreuses solutions plus courtes existent déjà dans ce fil. Ce serait plus agréable si je pouvais utiliser autre chose que
[a-zA-Z]
, mais étant donné que ed n'est pas un langage de programmation, il est en fait assez bon.Tout d'abord, je voudrais dire que cela analyse uniquement la dernière ligne du fichier. Il serait possible d'analyser davantage, il suffit de taper
,
au début des deux premières lignes (cette plage "tout" spécifiée, par opposition à la plage de dernière ligne standard), mais cela augmenterait la taille du code à 37 caractères.Maintenant pour des explications. La première ligne fait exactement ce que fait la solution Perl (sauf sans prise en charge des caractères Unicode). Je n'ai pas copié la solution Perl, j'ai juste inventé quelque chose de similaire par hasard.
La deuxième ligne imprime la dernière ligne, vous pouvez donc voir la sortie. La troisième ligne force à quitter - je dois le faire, sinon
ed
j'imprimerais?
pour vous rappeler que vous n'avez pas enregistré le fichier.Maintenant, comment l'exécuter. Eh bien, c'est très simple. Exécutez simplement
ed
le fichier contenant le cas de test, tout en canalisant mon programme, comme ça.-s
est silencieuse. Cela empêcheed
de sortir une taille de fichier laide au début. Après tout, je l'utilise comme script, pas comme éditeur, donc je n'ai pas besoin de métadonnées. Si je ne le faisais pas, ed montrerait la taille du fichier que je ne pourrais pas empêcher autrement.la source
Javascript, 49
Il utilise une expression régulière pour supprimer tous les caractères qui précèdent une lettre, ainsi que tous les caractères non-lettre. Ensuite, nous nous retrouvons avec la dernière lettre de chaque mot.
Merci à tomsmeding pour une belle amélioration.
la source
alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))
C, 78
Golfé:
Avec espace:
Sortie:
la source
c
:main(c,s)char**s;{for
GNU Sed,
403837Essai
Exécutez sed:
Sortie:
Explication
La première substitution remplace toutes les limites de mots, qui sont précédées par le groupe de correspondance souhaité, par une nouvelle ligne. Cela facilite la suppression de tous les caractères étrangers dans la deuxième substitution.
modifier
la source
sed
de »s
la commande ai
drapeau pour les cas correspondant insensible:s/[a-z]\b/&\n/gi
.\b
considère_
s comme des lettres, donc s'il y a des mots dans le test FIN avec_
, la dernière lettre de ce mot n'est pas incluse dans la sortieGrep and Paste,
363428Si une nouvelle ligne finale est nécessaire, remplacez-la
tr -d \\n
parpaste -sd ''
.modifier
tr
au lieu depaste
(-4), merci manatwork .la source
paste -sd ''
, maistr -d \\n
c'est plus court. En ce qui concernegrep
, il a le-i
sens de l' interrupteur « ignorer la casse », ce qui peut le rendre plus court:grep -io '[a-z]\b'
.tr
supprimez également la nouvelle ligne finale. Le mode insensible à la casse est bien sûr plus court, merci.sed, 37 caractères
Longueur égale à la réponse de Thor , mais, je pense, plus simple.
La logique est assez banale - remplacez les séquences de lettres par leur dernière lettre, puis supprimez toutes les non-lettres.
la source
Mathematica, 39
Tester:
la source
LetterQ
devrait être appeléLettersQ
:) Je n'y ai pas pensé pour tester des chaînes entières.K, 49
.
la source
Scala, 59 (ou 43)
En supposant que la chaîne est déjà dans
s
:Si vous devez lire à partir d'une invite et imprimer plutôt que d'utiliser la sortie REPL, convertissez
s
enreadLine
et encapsulezprintln()
pour 59.la source
x86: 54 octets
Supposons une routine cdecl avec la signature
void world_end(char *input, char *output)
:la source
Xi, 32
Xi est un langage encore dans sa phase bêta, mais il semble bien fonctionner avec le code golf alors j'ai pensé que je pourrais aussi bien montrer une autre solution courte et fonctionnelle (et annoncer un peu le langage :-)).
la source
Mathematica
625752Essai
la source
Python3, 59 caractères
Traite correctement les majuscules et les soulignements. Le 2 est de passer
re.sub
lere.IGNORECASE
drapeau sans avoir à utiliserre.I
.la source
Python, 76 caractères
import re;print "".join(re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",raw_input()))
la source
print
.import re;print(*re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",input()),sep='')
Python 3.x, 64 octets
la source
for
.Lua, 42
Exemple d'utilisation:
lua script.lua "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
la source
Mathematica
71474561Retour à la planche à dessin, après que @belisarius a trouvé une erreur dans le code.
Essai
la source
\\w
matchs_
, donc cela ne fonctionne pas pour (par exemple)"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
Row@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
me donneflvmrp
, mais#~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
revientfvmrp
ici. Obtenons-nous les mêmes résultats ??Python 2,
88 80 75 6968Contribution:
435_ASDC__uio;|d re;fG o55677jkl..f
Sortie:
CodeGolf
Cette solution peut être raccourcie à 67 caractères si vous autorisez la sortie à inclure des caractères de retour arrière (code ASCII 8) au début. La sortie sera visuellement identique.
Même entrée, (visuellement) même sortie.
<BS>
est censé être le caractère de retour arrière.la source
C #
Méthode, 105 octets: (suppose des utilisations pour System, System.Text.RegularExpressions et System.Linq)
Programme, 211 octets:
la source
VBA, 147
161la source
Ruby 2.0, 25 (+1) caractères
Doit être exécuté avec le
-p
commutateur:la source
ruby
version. 1.9.2 affiche «# <Enumerator: 0x9f65e10> # <Enumerator: 0x9f65d98> # <Enumerator: 0x9f65d34> # <Enumerator: 0x9f65cd0>».ruby 2.0.0p0 (2013-02-24 revision 39474
). Lors de l'exécution du programme avec la version 1.8.7, il génère une valeur ASCII! Je ne savais pas qu'il y avait tant de différences entre les versions.gsub(/(\w+)\W*/){$1[-1]}
.Rétine , 16 octets
Essayez-le en ligne!
Explication
la source
Rétine , 20 octets
Essayez-le en ligne
Ce programme est compatible avec la version 0.8.2
la source
Java 8, 43 octets
Port de la réponse Retina de @ mbomb007 .
Explication:
Essayez-le en ligne.
Explication supplémentaire pour l'expression régulière:
la source
(?i)
pour le drapeau.Smalltalk , Squeak / Pharo flaveur
122 caractères avec une mise en forme traditionnelle pour cette méthode ajoutée à String:
62 caractères dans Pharo 1.4, avec regex et formatage bizarre
la source
J: 60 caractères (ou 38 caractères pour une version moins correcte)
Si nous voulons laisser le programme s'arrêter chaque fois qu'il y a des mots se terminant par deux points ou un trait de soulignement, nous pouvons simplifier cela à 38 caractères.
Exemple d'exécution:
la source
(#~[:2&|64 90 96 122&I.@(u:inv)){:&>;:
, ou 43 octets pour une version non explicite:(#~[:2&|64 90 96 122&I.@(u:inv))@:({:@>)@;:
. Celui-ci utilise le verbe d'index d'intervalleI.
, qui interprète64 90 96 122
comme l'ensemble d'intervalles(__, 64] (64, 90], (90, 96], (96, 122], (122, _)
, et renvoie l'index de l'iterval auquel appartient son argument, le code ascii du caractère. Si cet index est impair, il n'est pas alphabétique.;:
interpretsabc_
as one word since variable names can contain underscores. +10 bytes to add(#~~:&'_')
, probably an inefficient fix'_'-.~
or something similar.It's in PHP. 197 bytes :( I'm beginner
EDITED Now it's 171 bytes
la source
foreach((' ',preg_replace('/(\W|_)+/',' ',$_GET['line'])) as $d){$a=substr($d,-1,1);$o=ORD();if(($o>=97 && $o<=122) || ($o>=65 && $o<=90)){echo $a;}}
is 149, if it works.\W|_
excludes digits; so you should add\d
to your regex or use/[^a-z]+/i
K 30
la source
Japt v2, 16 bytes
Try it
la source
f"%l(?!%l)" q
(doesn't work in v2 because the parser doesn't like the(?
)