L'heure des devoirs! Trouvez-moi le plus petit chiffre pair d'une chaîne

12

Une autre question brillante de Stack Overflow s'est transformée en un défi de !

Écrivez un programme qui:

  1. 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.
  2. Recherche l'index (basé sur 0 ou 1) du premier chiffre pair le plus bas .
  3. Imprime 2 entiers , l'index et le chiffre pair le plus bas .
  4. S'il n'y a pas de chiffre pair , retournez -1 comme index, le deuxième nombre peut être n'importe quoi.
  5. 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.

Communauté
la source
4
Et si l'entier pair le plus bas a deux chiffres? Ok, c'était une blague.
Dr belisarius
5
Quel est le problème avec stdin?
John Dvorak
1
@JanDvorak Parce que des règles arbitraires, c'est pourquoi.
7
Pourquoi la limitation du zéro n'étant pas pair? Cela semble plutôt étrange.
Iszi
3
Vos exigences d'entrée n'ont vraiment aucun sens: pour la plupart des systèmes, l'entrée provient de stdin, qu'elle soit demandée par le programme ou non. Que l'entrée soit raccordée ou non n'est pas sous le contrôle du programme. - Si votre objectif était d'amener les utilisateurs à créer un programme interactif, vous devriez avoir été précis sur les entrées et sorties (y compris le formatage) et l'interaction requise.
MtnViewMark

Réponses:

6

Golfscript, 26 (28) caractères

'#{gets}'.'246'&8+$1<.@\?

Exemple:

;'583746'
.'246'&8+$1<.@\?
#44

;'53771'
.'246'&8+$1<.@\?
#8-1

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'il 8est 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:

  • La spécification ne prescrit pas dans quel ordre les entiers sont sortis; Utilisez la suggestion :x?xde l'autre @ peter pour corriger (je n'aime pas les variables temporaires.
  • La spécification ne nécessite aucun délimiteur entre les deux entiers; puisque le chiffre trouvé est toujours un seul chiffre, cela n'a pas beaucoup d'importance. Si c'est le cas, ajoutez n@(qui effectue également l'échange), n\(qui ne le fait pas) ou ]`(qui formate la sortie comme ["8" -1]).
John Dvorak
la source
Ce ne sont pas des exigences folles, ce sont des exigences arbitraires: P
De plus, la spécification nécessite que l'index soit le premier, mais je ne peux pas lire suffisamment GolfScript pour dire si vous ne l'avez pas fait
@LegoStormtroopr le seul point de la spécification qui mentionne l'ordre est # 4: "S'il n'y a pas de chiffre pair, retournez -1 comme index, le deuxième nombre peut être n'importe quoi". # 3 ne spécifie pas la commande; qu'en est-il de l'audace "sans délimiteur"?
John Dvorak
Oh snap, vous avez raison monsieur! J'ai mentionné les deux nombres à sortir, mais pas l'ordre. Je me suis trompé!
Vous pouvez remplacer .0=@?par .@\?ou :x?xpour enregistrer un caractère et éviter le doute sur la commande. Belle utilisation 8comme solution de rechange.
Peter Taylor
5

APL (37)

(Basé sur 1 par défaut, mais obéit ⎕IO)

{×⍴m←⍵/⍨⍵∊'2468':z,⍨⍵⍳⍕z←⌊/⍎¨m⋄¯1,0}⍞

Explication:

  • : lire l'entrée utilisateur
  • m←⍵/⍨⍵∊'2468': supprimez tous les caractères qui ne le sont pas 2468, stockez-les m.
  • ×⍴m: voir s'il y en a
  • :: Si c'est le cas:
    • z←⌊/⍎¨m: évaluez chaque caractère dans m, trouvez le nombre le plus bas et enregistrez-le z.
    • z,⍨⍵⍳⍕z: retourne l'index de zin , suivi de z.
  • : Si non:
    • ¯1,0: revenir (-1, 0)
marinus
la source
1
Wow, j'ai battu APL (pas avec la solution J, mais quand même ...)
John Dvorak
Explication? APL est tellement explicite ...;)
german_guy
3

Python 3, 69

combinant des idées d' ici .

s=input();print(([(s.find(x),x)for x in'2468'if x in s]+[(-1,0)])[0]) 
Étais-je
la source
J'aime l'utilisation d'une chaîne plutôt que d'une liste, et l'omission résultante des guillemets `(maintenant supprimés)`.
SimonT
@boothby Je suppose que vous n'avez pas remarqué que j'utilise python 3. En python 3 input () Accepte une chaîne comme entrée utilisateur.
Wasi
@SimonT `(backticks) ne sont pas seulement des guillemets. C'est un alias obsolète pour repr () en python 2. Mais ce n'est plus disponible en Python 3. Donc, si je veux utiliser `` sur quelque chose en python 3, je dois écrire repr (quelque chose) qui coûte 4 caractères de plus. C'est pourquoi je m'en débarrasse;)
Wasi
@ Wasi oui en effet, mon erreur.
stand
@Wasi, oui merci. J'étais conscient de cela et par "maintenant supprimé", je voulais dire en fait supprimé en tant que partie du langage. À votre santé.
SimonT
3

Ruby, 60 caractères

x=gets.chars.sort.find{|c|c=~/[2468]/};p x ?$_.index(x):-1,x
  • $_contient la dernière entrée lue par gets.
  • pappelle inspectles arguments et affiche les résultats.
à droite
la source
3

perl - - 94 - 53 caractères (ou 48)

Au lieu de index()l'approche basée sur zéro, nous utilisons poset commençons à un; pas de CPAN. Exécutez ceci avec perl -nEet il attendra l'entrée (dont il peut également recevoir STDIN).

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, sortles 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 $mpour une deuxième opération de correspondance qui trouvera la première occurrence de la valeur de $mdans la chaîne d'origine. Nous utilisons toujours la valeur par défaut ici $_et nous enregistrons la correspondance par rapport au contenu de $min $1(la raison du ()contour $mdans la deuxième instruction). Après cela, poset sayfaites le reste (et en moins de caractères que indexet print).

perl -nE'($m)=sort/[2468]/g;/($m)/g;$1?say pos.",$1":say"-1,0"'
33467
3,4

Si l'ordre de sortie ou les virgules n'ont pas d'importance, il est possible de raccourcir ces 5 caractères:

($m)=sort/[2468]/g;/($m)/g;$1?say$1.pos:say"-10"

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

$_=get;my $n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
G. Cito
la source
Était tellement concentré sur battre python / rubis que j'ai posté une doublure qui ne fonctionnait pas quand aucun nombre pair n'était présent: en utilisant avec impatience une version antérieure de ce qui précède de mon $SHELLhistoire pour la "victoire". Cette version de travail est ridiculement longue et embarrassante. Me sert bien: raccourcira plus tard pour éviter la honte :-(
G. Cito
piratage plus ancien:if(/[2468]/){for$i(2,4,6,8){if(index($_,$i)>-1){say$i,",",index($_,$i)+1;last}}}else{say"0,-1"}
G. Cito
2
Bon, mais il reste de la place pour le golf: ($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"(47 + 1 octets, AFAIK -ncoûte un octet supplémentaire).
Heiko Oberdiek
NB. posrenvoie le décalage. Donc, en fait, il renvoie un index basé sur 1 dans votre exemple.
draegtun
@draegtun oopsie :-) merci. @Heiko vrai que: les interrupteurs doivent compter autrement perl« s -Mgagneraient à chaque fois ;-)
G. Cito
3

Perl 6, 37 55 60 caractères

$_=get;say m/<{~.comb(/<[2468]>/).min}>/.from//-1,',',$/.Int

EDIT: 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. $/.fromobtient la position de la correspondance et ',', $/.Intest 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 :)

Mouq
la source
1
Malheureusement, cela affiche le premier nombre pair (2468) trouvé et pas le plus bas :( NB. Il y a aussi un problème avec $/.fromquand 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.
draegtun
@draegtun ... J'ai fait une erreur similaire avec ma tentative perl5 hier (voir ci-dessous). Ma correction a ajouté 70 caractères! Je viens de le mettre à jour avec une version ~ 50 caractères - qui semble fonctionner. Je pense que si vous triez tous les chiffres pairs du nombre, vous pouvez ensuite faire une correspondance en utilisant le (maintenant) premier chiffre du tri et être sûr que vous avez le plus bas et le premier. Ai-je raison?
G. Cito
@ G.Cito Me semble bien et j'ai déjà attribué +1 à votre réponse. Je peux voir comment raser quelques caractères, mais je vois que Heiko est encore mieux que ce que j'allais suggérer!
draegtun
@draegtun Oh, bon sang, j'ai complètement mal compris la question alors :( Merci beaucoup! Je mettrai à jour dès que possible
Mouq
@mouq Voici une approche qui utilise la même approche que l'exemple perl5 que j'ai posté ci - dessous: my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/". J'ai appris il y a .combenviron 20 minutes et je l'aime déjà :-)
G. Cito
2

J, 44 caractères

echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1

renvoie le dernier caractère de l'entrée si aucun chiffre pair n'est trouvé

Exemple:

   echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1
523726
+-+-+
|1|2|
+-+-+
   echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1
53771
+--+-+
|_1|1|
+--+-+

Explication:

  • echo ... i=.1!:1]1est entrée / sortie. Bien plus longtemps que je ne le souhaite. L'entrée est également cachée i.
  • '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.
John Dvorak
la source
2

Python 2.7 - 76

Une réponse de référence que je m'attends à être battue. Mais pour commencer les gens:

s=raw_input()
print[(s.index(`e`),e)for e in[2,4,6,8]if`e`in s][:1]or(-1,0)

la source
3
vous pouvez raser un personnage en changeant indexen find; vous pouvez également passer [2,4,6,8]à 2,4,6,8(avec espace devant).
Justin
4
Plus court:print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
grc
4
Je pense que vous avez enfreint votre propre règle ... Depuis quand raw_input n'est-il pas stdin?
Cruncher
1
print[(s.index(c),c)for c in'2468'if c in s][0]or(-1,0)
Eric
2

R, 104

y=as.integer(strsplit(scan(,""),"")[[1]]);z=which(!y%%2&y);a=z[which.min(y[z])];cat(a,"-1 0"[!sum(a)],y[a])

Exemples (dans R, l'index commence à 1):

_4_502
6  2

_3_501
-1 0 

583746
5  4
Sven Hohenstein
la source
2

Powershell, 76 73 71

$s=read-host;2,4,6,8|%{if($i=$s.indexof("$_")+1){"$i,$_";break}};"-1,0"
  • $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' $iindex basé sur 1 d'un chiffre dans $sou 0si le chiffre n'est pas trouvé
  • if( $i=... ){...} la condition sera vraie quand $in'est pas0
  • "$i,$_";break renvoie l'index et le chiffre et arrête l'exécution
  • "-1,0" sinon sorties -1,0
Danko Durbić
la source
Cela ne produit pas l'index approprié. Dans PowerShell, comme dans les cas de test donnés pour la question, les index commencent à zéro.
Iszi
1
La règle n ° 2 indique que l'index peut être basé sur 0 ou 1.
Danko Durbić
Oh. Je n'ai pas repéré ça. Quoi qu'il en soit, voici une variante à base zéro qui ne fait que 5 caractères de plus. $s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
Iszi
De plus, je suis presque sûr que les parenthèses ne 2,4,6,8sont pas nécessaires.
Iszi
La variante à base zéro peut être if(1+($i=$s.indexof("$_")))
allongée de
2

C ++ 11, 173 (dont deux caractères de nouvelle ligne)

Voici la version compressée:

#include<iostream> 
#include<string> 
int main(){std::string s;std::cin>>s;for(char c:"2468")for(char&k:s)if(k==c){std::cout<<(&k-&s[0])<<','<<c;return 0;}std::cout<<"-1,8";}

Voici la version lisible:

#include<iostream>
#include<string>
int main() {
    std::string s; // auto s = ""s; (since C++14: -3 characters)
    std::cin >> s;
    for (char c : "2468")
        for (char& k : s)
            if (k == c) {
                std::cout << (&k - &s[0]) << ',' << c;
                return 0;
            }
    std::cout << "-1,8";
}

Voici une ancienne version:

C ++ 11, 175 (y compris deux caractères de nouvelle ligne)

Voici la version compressée:

#include<iostream>
#include<string>
int main(){std::string s;std::cin>>s;for(char c:"2468"){int i=s.find(c);if(i<s.size()){std::cout<<i<<','<<c;return 0;}}std::cout<<"-1,8";}

Voici la version lisible:

#include<iostream>
#include<string>
int main() {
    std::string s;
    std::cin >> s;
    for (char c : "2468") {
        int i = s.find(c);
        if (i < s.size()) {
            std::cout << i << ',' << c; 
            return 0;
        }
    }
    std::cout << "-1,8";
}
Chaussure
la source
Essayez #define o std::cout<<. Je pense que cela coupe votre code d'un caractère.
@ user2509848, non, c'est en fait 2 caractères de plus. Mais merci quand même :)
Chaussure
k==c?std::cout<<(...),throw 0:0;- l'opérateur conditionnel peut remplacer if, lorsque vous n'avez besoin que d'expressions. throwest une expression et également un caractère plus court que return.
MSalters
1

C, 80 caractères

main(){char a[81],b=strcspn((gets(a),a),"2468");printf("%d,%c",a[b]?b:-1,a[b]);}
Makarov
la source
1

C # - 124

Je suis un peu en retard à la fête

void Main(string[]a){var x=a[0].Where(w=>char.IsDigit(w));var y=x.Min();Console.Write(y%2==0?a[0].IndexOf(y)+","+y:"-1,0");}
jzm
la source
0

Haskell, 79 caractères

s&d=filter((==d).snd)$zip[-1..]$'0':s
main=interact$show.head.("24680">>=).(&)

Cela fonctionne un peu vite et avec la mise en forme de sortie:

& echo 523726 | runhaskell 16083-LowEven.hs 
(1,'2')
& echo 583746 | runhaskell 16083-LowEven.hs 
(4,'4')
& echo 53771 | runhaskell 16083-LowEven.hs 
(-1,'0')
& echo _4___2 | runhaskell 16083-LowEven.hs 
(5,'2')
& echo 25376 | runhaskell 16083-LowEven.hs 
(0,'2')
MtnViewMark
la source
0

PowerShell: 145 103

Changements par rapport à l'
erreur d'origine supprimée par commentaire du demandeur.

Code:

"$([array]::IndexOf(($s=(read-host)-split''|?{$_}),($x=$s|?{$_%2-eq0}|?{$_-gt0}|sort|select -f 1))),$x"

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 une IndexOfmé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 pour IndexOf.

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

,$xLe 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.

Iszi
la source
@ DankoDurbić Maintenant que vous m'avez profondément battu, cela vous dérangerait-il de m'aider à comprendre pourquoi je ne pouvais pas l'utiliser $s.IndexOfici? Cela me donnait une erreur disant que la méthode n'existait pas pour cet objet, même si $s|gmelle 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.
Iszi
Votre $sest string[]et $s.indexofne fonctionne pas parce que ...[System.String[]] doesn't contain a method named 'indexOf', ce qui semble raisonnable (j'utilise PS 2.0). $s|gmrenvoie les membres de System.String, non System.String[]. Je ne sais pas pourquoi il fait ça.
Danko Durbić
0

vb.net (108c)

Sub Main()
t=ReadLine()                          '12c
For Each c In "2468"                  '20c  
i=t.IndexOf(c)                        '14c
If i>=0 Then Exit For                 '21c
Next                                  ' 4c
WriteLine("{0},{1}",i,If(i<0,0,t(i))) '37c
End Sub

Sent légèrement car il exploite le réglage dynamique de VB. Option Explicit Off and Imports System.Console .

Adam Speight
la source
0

VB.net (193c) utilisant LINQ

Celui-ci utilise principalement une requête LINQ.

Dim r = From d In "2468" Group Join q In ReadLine.Select(Function(c, p) New With {.c = c, .i = p})
                              On d Equals q.c Into g = Group
                                        Skip While g.Count = 0 ' 138c
WriteLine(If(r.Any,r(0).g(0).i&","&r(0).g(0).c,"-1,0"))        '  55c
Adam Speight
la source
0

Golf-Basic 84, 91 caractères

:L1/L1_L2i`L1:fpart(L1,2)2_L1:SortA(L1)@cumSum(L1)=length(L1):Thend`-1#d`cumSum(L1):Endd`L1
  • Assurez-vous qu'il n'y a pas 0d'entrée (ce n'est même pas, qui a dit que ça devait être bizarre?)
  • Obtenir une entrée dans L1 (liste 1)
  • Module de recherche de boucle de 2 pour chaque valeur
  • Trier L1 du plus petit au plus élevé
  • Afficher l'index (-1 ou la somme cumulée) et le plus petit nombre
Timtech
la source
0

Bourne shell (sh), 88 caractères

(echo 88;sed 's/./\n&/g')|nl -v-1|awk '{print $2,$1}'|sed '/^[^2468]/d'|sort -n|head -n1

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' nlutilitaire mal connu ), filtrer les lignes correspondant aux critères, les trier et produire le chiffre le plus bas. Imprime 88 -1si aucun chiffre pair n'a été trouvé.

Luciole
la source
0

C ++ - 223 221 Personnages:

#include<iostream>
#include<string>using namespace std;
int main(){int s=9;int p=-1;string x;cout<<"Enter characters: ";cin>>x;for(int i=0;i<x.length();i++){int n=x[i]-48;if(n%2==0&n<s){s=n;p=i;}}cout<<p<<", "<<s;return 0;}

Version lisible:

#include<iostream>
#include<string>
using namespace std;

int main() {
    int s = 9;
    int p= - 1;
    string x;

    cout << "Enter characters: ";
    cin >> x;

    for (int i = 0; i < x.length(); i++) {
        int n = x[i] - 48;

        if (n % 2 == 0 & n < s) {
            s = n;
            p = i;
        }
    }

    cout << p << ", " << s;

    return 0;
}

C'est long, mais pas aussi mauvais que Java.


la source
Il s'agit en fait de 221 + 2 (nouveaux caractères de ligne) sinon il ne sera pas compilé.
Chaussure
Oh. Word n'a détecté que 221, je vais le changer.
0

Javascript 93 caractères

b=prompt();((r=b.match(/[2468]/g)||[-1]).sort(function(a,b){return a-b})[0])+","+b.indexOf(r)

Obtenez tous les numéros d'événements, triez le tableau et imprime le premier chiffre.

Felipe Miosso
la source
0

Mathematica, 157 caractères

f = Row@{If[(x = Min@#) == Infinity, -1, Position[#, x][[1, 1]]],
      ",", x} &[IntegerDigits@ToExpression@StringReplace[#,
       {"0" -> "1", x_?DigitQ :> x, _ -> "1"}] /. _?OddQ -> Infinity] &

inputs = {"25376", "523726", "583746", "53771", "_4___2"}

f /@ inputs // Column

1,2

2,2

5,4

-1, ∞

6,2

Chris Degnen
la source
0

Julia, 84

julia> f(a)=(for i=2:2:8;(k=search(a,'0'+i))==0||return(k,i);end;(-1,0))
julia> f(readline(STDIN))
583746
(5,4)
julia> f(readline(STDIN))
_4___2
(6,2)

Julia a vraiment besoin d'un moyen plus court pour obtenir des informations sur le golf. J'ai compté la définition de fet un appel à f. Une indexation basée est la raison pour laquelle les réponses sont différentes des exemples.

gggg
la source
0

JavaScript - 53 caractères

for(y=prompt(x=0);x<8&&(i=y.indexOf(x+=2))<0;);x+''+i

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.

MT0
la source
0

C, 110 caractères

i,f,r,c,m=9;main(){while(r=getchar()>31){c=r-48;i++;if(c>=0&&~c&1&&c<m)m=c,f=i;}printf("%i,%i",m>8?-1:f-1,m);}

non golfé:

i,f,r,c,m=9;
main(){
  while(r=getchar()>31){
    c=r-48;
    i++;
    if(c>=0&&~c&1&&c<m) m=c,f=i;
  }
  printf("%i,%i",m>8?-1:f-1,m);
}
MarcDefiant
la source
0

Javascript, 69

a=prompt(),b=[-1,9];for(i in a)if(+a[i]%2==0&&+a[i]<b[1])b=[+i,+a[i]]

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

Danny
la source
0

Rebol, 69

s: input for n 2 8 2[if f: find s n[print[index? f f/1]q]]print[-1 0]
draegtun
la source
0

Rubis 55

p gets.chars.sort*''=~/[2468]/?[$_.index($&),$&]:[-1,0]
daniero
la source
0

JavaScript / jQuery 149

Golfé

$(function(){
var i=prompt(),k=-1,n=0,c,e="2468";
while(n<i.length){c=i.charAt(n);k=e.indexOf(c);if(k>=0){break;}n++;}$('#d').append(k+","+n);
});

Source complète

<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<div id="d"></div>
<script type="text/javascript">
$(function(){
var i=prompt();
var k=-1;
var n=0;
var c;
var e="2468";
while(n<i.length){
c=i.charAt(n);
k=e.indexOf(c);
if(k>=0){
break;
}
n++;
}
$('#d').append(k+","+n);
});
</script>
</body>
</html>
bacchusbeale
la source