Une autre question brillante de Stack Overflow s'est transformée en un défi de code-golf !
Écrivez un programme qui:
- Accepte une chaîne comme entrée utilisateur (non canalisée ou argument de ligne de commande). Le type de données de l'entrée doit être une chaîne, si la langue effectue des évaluations automatiques en entrée, elle doit être convertie en chaîne.
- Recherche l'index (basé sur 0 ou 1) du premier chiffre pair le plus bas .
- Imprime 2 entiers , l'index et le chiffre pair le plus bas .
- S'il n'y a pas de chiffre pair , retournez -1 comme index, le deuxième nombre peut être n'importe quoi.
- Aux fins de ce zéro, ce n'est même pas .
Exemples de test, étant donné la chaîne de gauche, affichez les valeurs de droite:
25376 --> 0,2
523726 --> 1,2
583746 --> 4,4
53771 --> -1,0
_4___2 --> 5,2
Le gagnant: est le programme avec le plus petit nombre de caractères. Pas de bonus, pas de pénalités.
edit: (à propos de stdin) J'ai foiré la partie entrée utilisateur, essentiellement aucune donnée de tuyauterie et aucun argument de ligne de commande. Vous devez fournir une invite utilisateur quelconque dans le programme lui-même.
Réponses:
Golfscript, 26 (28) caractères
Exemple:
test en direct: http://golfscript.apphb.com/?c=Oyc1Mzc3MScKLicyNDYnJjgrJDE8LjA9QD8%3D
Explication:
'#{gets}'
est une évasion vers ruby pour satisfaire les exigences d'E / S; STDIN est supposé être vide.
clone l'entrée'246'&8+
trouve quels chiffres pairs sont présents dans l'entrée, sauf qu'il8
est toujours conservé$1<
trie la liste, puis prend le premier chiffre, mais le conserve sous forme de chaîne.@\?
ordonne la pile {chiffre, entrée, chiffre}, puis trouve le chiffre dans l'entrée; merci @peterTaylor de m'avoir remarqué la signature [array, array] de?
.J'ai été très audacieuse avec l'interprétation des spécifications cette fois; à savoir:
:x?x
de l'autre @ peter pour corriger (je n'aime pas les variables temporaires.n@
(qui effectue également l'échange),n\
(qui ne le fait pas) ou]`
(qui formate la sortie comme["8" -1]
).la source
.0=@?
par.@\?
ou:x?x
pour enregistrer un caractère et éviter le doute sur la commande. Belle utilisation8
comme solution de rechange.APL (37)
(Basé sur 1 par défaut, mais obéit
⎕IO
)Explication:
⍞
: lire l'entrée utilisateurm←⍵/⍨⍵∊'2468'
: supprimez tous les caractères qui ne le sont pas2468
, stockez-lesm
.×⍴m
: voir s'il y en a:
: Si c'est le cas:z←⌊/⍎¨m
: évaluez chaque caractère dansm
, trouvez le nombre le plus bas et enregistrez-lez
.z,⍨⍵⍳⍕z
: retourne l'index dez
in⍵
, suivi dez
.⋄
: Si non:¯1,0
: revenir(-1, 0)
la source
Python 3, 69
combinant des idées d' ici .
la source
Ruby, 60 caractères
$_
contient la dernière entrée lue pargets
.p
appelleinspect
les arguments et affiche les résultats.la source
perl - -
94- 53 caractères (ou 48)Au lieu de
index()
l'approche basée sur zéro, nous utilisonspos
et commençons à un; pas de CPAN. Exécutez ceci avecperl -nE
et il attendra l'entrée (dont il peut également recevoirSTDIN
).La première
//
opération match ( ) fonctionne sur la valeur par défaut ($_
) de l'entrée, la correspondance avec les nombres pairs donnés,sort
les correspondances dans un tableau, puis les stocke dans une "liste scalaire"($m)
. Dans un contexte scalaire, la valeur de la liste du tableau trié est longue d'un élément et se compose donc du chiffre pair le plus bas du nombre.Après avoir isolé le plus petit chiffre apparié, nous utilisons ensuite
$m
pour une deuxième opération de correspondance qui trouvera la première occurrence de la valeur de$m
dans la chaîne d'origine. Nous utilisons toujours la valeur par défaut ici$_
et nous enregistrons la correspondance par rapport au contenu de$m
in$1
(la raison du()
contour$m
dans la deuxième instruction). Après cela,pos
etsay
faites le reste (et en moins de caractères queindex
etprint
).Si l'ordre de sortie ou les virgules n'ont pas d'importance, il est possible de raccourcir ces 5 caractères:
Dans ma tentative précédente, je me suis précipité et j'ai fait une erreur - je voulais juste battre le python et le rubis (mais j'ai échoué) ... soupir.
Félicitations au gagnant et aux autres participants pour leurs solutions intéressantes - en particulier pour
perl6
:-) Une adaptation Perl6 possible de cette approche pourrait être utilisée ".comb
(suggéré sur freenode par Masak et.al. ).la source
$SHELL
histoire pour la "victoire". Cette version de travail est ridiculement longue et embarrassante. Me sert bien: raccourcira plus tard pour éviter la honte :-(if(/[2468]/){for$i(2,4,6,8){if(index($_,$i)>-1){say$i,",",index($_,$i)+1;last}}}else{say"0,-1"}
($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"
(47 + 1 octets, AFAIK-n
coûte un octet supplémentaire).pos
renvoie le décalage. Donc, en fait, il renvoie un index basé sur 1 dans votre exemple.perl
« s-M
gagneraient à chaque fois ;-)Perl 6,
375560 caractèresEDIT: J'ai mal compris la question la première fois. Cette mise à jour devrait être correcte. Il trouve le plus petit nombre de 2,4,6 ou 8 que l'entrée contient, puis fait une correspondance regex avec l'entrée avec ce nombre le plus bas.
$/.from
obtient la position de la correspondance et',', $/.Int
est une virgule plus la correspondance elle-même, ou 0 si le texte ne correspond pas.Pendant que vous êtes ici, allez voter G. Cito , qui m'a aidé à corriger mon entrée dans les commentaires et sur irc :)
la source
$/.from
quand rien n'est trouvé (c'est peut-être un bug dans mon ancienne version de Rakudo). Voici une variante de votre solution qui fonctionne ( pour moi!)my$x=get;for 2,4,6,8 ->$n{if $x~~/$n/ {say $/.from,",$/";exit}};say "-1 0";
Livré à 75 caractères mais je suis sûr qu'une solution perl6 plus courte peut être faite.my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
. J'ai appris il y a.comb
environ 20 minutes et je l'aime déjà :-)J, 44 caractères
renvoie le dernier caractère de l'entrée si aucun chiffre pair n'est trouvé
Exemple:
Explication:
echo ... i=.1!:1]1
est entrée / sortie. Bien plus longtemps que je ne le souhaite. L'entrée est également cachéei
.'2468'i.~
trouve la première occurrence de chaque chiffre pair dans l'entrée, renvoyant la longueur d'entrée si le chiffre est introuvable(#~(#i)&>)
lit "sélectionner par la longueur d'entrée étant supérieure à cela"; en d'autres termes, sélectionnez les indices qui pointent vers l'entrée. Bien plus longtemps que je ne le souhaite._1,~
ajoute -1 à l'arrière. Le soulignement est la façon dont J représente les valeurs négatives.{.
sélectionne le premier élément(;{&i)
le concatène avec le caractère saisi à cette position dans deux cases; puisque nous concaténons un nombre avec un caractère, la concaténation sans boxe (,
) ne fera pas l'affaire. Si un affichage sans boîte est souhaité, l'index doit d'abord être formaté (":
) au coût de deux caractères.la source
Python 2.7 - 76
Une réponse de référence que je m'attends à être battue. Mais pour commencer les gens:
la source
index
enfind
; vous pouvez également passer[2,4,6,8]
à2,4,6,8
(avec espace devant).print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
print[(s.index(c),c)for c in'2468'if c in s][0]or(-1,0)
R, 104
Exemples (dans R, l'index commence à 1):
la source
Powershell,
767371$s=read-host
stocke les entrées utilisateur dans$s
2,4,6,8|%{...}
exécute ce qui est à l'intérieur{}
pour les chiffres 2,4,6 et 8$i=$s.indexof("$_")+1
définit l'$i
index basé sur 1 d'un chiffre dans$s
ou0
si le chiffre n'est pas trouvéif( $i=... ){...}
la condition sera vraie quand$i
n'est pas0
"$i,$_";break
renvoie l'index et le chiffre et arrête l'exécution"-1,0"
sinon sorties-1,0
la source
$s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
2,4,6,8
sont pas nécessaires.if(1+($i=$s.indexof("$_")))
C ++ 11, 173 (dont deux caractères de nouvelle ligne)
Voici la version compressée:
Voici la version lisible:
Voici une ancienne version:
C ++ 11, 175 (y compris deux caractères de nouvelle ligne)
Voici la version compressée:
Voici la version lisible:
la source
#define o std::cout<<
. Je pense que cela coupe votre code d'un caractère.k==c?std::cout<<(...),throw 0:0;
- l'opérateur conditionnel peut remplacerif
, lorsque vous n'avez besoin que d'expressions.throw
est une expression et également un caractère plus court quereturn
.C, 80 caractères
la source
C # - 124
Je suis un peu en retard à la fête
la source
Haskell, 79 caractères
Cela fonctionne un peu vite et avec la mise en forme de sortie:
la source
PowerShell:
145103Code:
Procédure pas à pas:
"
..."
Tout dans les guillemets sera inclus dans la sortie.$(
...)
Tout ce qui se trouve entre les parenthèses sera traité comme une commande et la sortie de ce code sera incluse à la place des commandes elles-mêmes.[array]::IndexOf(
...)
Ceci est utilisé pour obtenir l'index d'un élément avec le tableau. Son premier paramètre est l'objet tableau à rechercher. Le deuxième paramètre est l'objet à trouver. Cela ne produit que l'index du premier élément correspondant. J'ai essayé simplement d'utiliser uneIndexOf
méthode directement contre$s
(par exemple:,$s.IndexOf($x)
mais cela échoue pour une raison que je n'ai pas encore compris - il prétend que la méthode n'existe pas sur cet objet.(
... L')
expression entre parenthèses sera le premier paramètre pourIndexOf
.$s=
$ s sera une variable pour stocker l'entrée utilisateur.(read-host)-split''
Obtient une entrée utilisateur et la divise en un tableau de caractères. »|?{$_}
Filtre les éléments de tableau vides supplémentaires générés par-split''
.,(
... L')
expression entre parenthèses sera le deuxième paramètre pourIndexOf
.$x=
$ s sera une variable pour stocker le plus petit chiffre pair de l'entrée utilisateur.$s|?{$_%2-eq0}
Extrait les nombres pairs de $ s.|?{$_-gt0}
Invalide zéro.|sort
Trie les objets restants, l'ordre par défaut est croissant.|select -f 1
Prend le premier objet, qui sera désormais le chiffre pair le plus bas.,$x
Le code ci-dessus affichera l'index de notre chiffre pair le plus bas. Cela ajoute une virgule, puis génère le chiffre lui-même.Remarques:
Il s'agit peut-être d'étirer un peu la règle n ° 4. S'il n'y a pas de chiffre pair, la sortie n'inclura pas de deuxième chiffre.
En outre, cela générera des erreurs non terminales si l'entrée comprend des éléments non numériques. Le script continue à fonctionner et donner une bonne sortie, mais vous pouvez définir
$ErrorActionPreference
à'SilentlyContinue'
avant de l' exécuter.la source
$s.IndexOf
ici? Cela me donnait une erreur disant que la méthode n'existait pas pour cet objet, même si$s|gm
elle le faisait. Cela fonctionne sur le système sur lequel je suis actuellement, mais pas sur celui sur lequel j'essayais de le faire plus tôt aujourd'hui. Est-ce un problème de compatibilité de version? Le système antérieur était PSv2, le courant est PSv4.$s
eststring[]
et$s.indexof
ne fonctionne pas parce que...[System.String[]] doesn't contain a method named 'indexOf'
, ce qui semble raisonnable (j'utilise PS 2.0).$s|gm
renvoie les membres deSystem.String
, nonSystem.String[]
. Je ne sais pas pourquoi il fait ça.vb.net (108c)
Sent légèrement car il exploite le réglage dynamique de VB. Option Explicit Off and Imports System.Console .
la source
VB.net (193c) utilisant LINQ
Celui-ci utilise principalement une requête LINQ.
la source
Golf-Basic 84, 91 caractères
0
d'entrée (ce n'est même pas, qui a dit que ça devait être bizarre?)la source
Bourne shell (sh), 88 caractères
Je pensais que je ferais une chose de traitement de chaîne pour le plaisir. Techniquement, il lit à partir de stdin, mais si vous l'exécutez de manière interactive, il demandera à l'utilisateur d'entrer car le clavier est le flux stdin par défaut. Utilise les commandes de base du shell pour diviser les entrées sur les lignes, les numéroter (à l'aide de l'
nl
utilitaire mal connu ), filtrer les lignes correspondant aux critères, les trier et produire le chiffre le plus bas. Imprime88 -1
si aucun chiffre pair n'a été trouvé.la source
C ++ - 223
221Personnages:Version lisible:
C'est long, mais pas aussi mauvais que Java.
la source
Javascript 93 caractères
Obtenez tous les numéros d'événements, triez le tableau et imprime le premier chiffre.
la source
Mathematica, 157 caractères
la source
Julia, 84
Julia a vraiment besoin d'un moyen plus court pour obtenir des informations sur le golf. J'ai compté la définition de
f
et un appel àf
. Une indexation basée est la raison pour laquelle les réponses sont différentes des exemples.la source
JavaScript - 53 caractères
Lit l'entrée de l'invite et sort (vers la console) le plus petit caractère pair puis (sans délimiteur) le premier index de ce caractère; s'il n'y a pas de caractères pairs non nuls alors il sort
8-1
.la source
C, 110 caractères
non golfé:
la source
Javascript, 69
Lit la valeur, parcourt chaque caractère, si la représentation numérique mod 2 est égale à 0 et que le nombre est inférieur à ce qui est déjà stocké dans
b
, remplacez les valeurs dansb
la source
Rebol, 69
la source
Rubis 55
la source
JavaScript / jQuery 149
Golfé
Source complète
la source