Tiempo de tarea! Búscame el dígito par más bajo de una cadena

12

¡Otra pregunta brillante de Stack Overflow se convirtió en un desafío de !

Escribe un programa que:

  1. Acepta una cadena como entrada del usuario (no canalizada o un argumento de línea de comando). El tipo de datos de la entrada debe ser una cadena, si el idioma realiza evaluaciones automáticas en la entrada, debe convertirse en una cadena.
  2. Encuentra el índice (basado en 0 o 1) del primer dígito par más bajo .
  3. Imprime 2 enteros , el índice y el dígito par más bajo .
  4. Si no hay un número par , devuelva -1 como índice, el segundo número puede ser cualquier cosa.
  5. A los efectos de este cero no es par .

Ejemplos de prueba, dada la cadena de la izquierda, se muestran los valores de la derecha:

25376  -->  0,2
523726 -->  1,2
583746 -->  4,4
53771  --> -1,0
_4___2 -->  5,2

El ganador: es el programa con el recuento de caracteres más bajo. Sin bonificaciones, sin penalizaciones.

editar: (sobre stdin) Me equivoqué en la parte de entrada del usuario, básicamente no hay datos de tuberías y no hay argumentos de línea de comandos. Debe proporcionar un aviso de usuario de algún tipo dentro del propio programa.

Comunidad
fuente
44
¿Qué pasa si el entero par más bajo tiene dos dígitos? Ok, fue una broma.
Dr. belisarius
55
¿Qué hay de malo con stdin?
John Dvorak
1
@ JanDvorak Debido a reglas arbitrarias, por eso.
77
¿Por qué la limitación de cero no es par? Eso parece bastante extraño.
Iszi
3
Sus requisitos de entrada realmente no tienen sentido: para la mayoría de los sistemas, la entrada proviene de stdin, ya sea que lo solicite el programa o no. Si la entrada se canaliza o no no está bajo el control del programa. - Si su objetivo era que los usuarios crearan un programa interactivo, entonces debería haber sido preciso sobre la entrada y la salida (incluido el formato) y la interacción requerida.
MtnViewMark

Respuestas:

6

Golfscript, 26 (28) caracteres

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

Ejemplo:

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

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

prueba en vivo: http://golfscript.apphb.com/?c=Oyc1Mzc3MScKLicyNDYnJjgrJDE8LjA9QD8%3D

Explicación:

  • '#{gets}'es un escape a ruby ​​para satisfacer los requisitos de E / S; Se supone que STDIN está vacío
  • . clona la entrada
  • '246'&8+encuentra qué dígitos pares están presentes en la entrada, excepto 8que siempre se conserva
  • $1< ordena la lista, luego toma el primer dígito, pero lo mantiene como una cadena
  • .@\?ordena la pila {dígito, entrada, dígito}, luego encuentra el dígito en la entrada; gracias @peterTaylor por notarme la firma [array, array] de ?.

Esta vez he sido muy audaz con la interpretación de las especificaciones; a saber:

  • La especificación no ordena en qué orden salen los enteros; Use la sugerencia del otro @ peter :x?xpara arreglar (no me gustan las variables temporales.
  • La especificación no requiere ningún delimitador entre los dos enteros; Como el dígito encontrado es siempre un solo dígito, esto no importa mucho. Si lo hace, agregue n@(que también realiza el intercambio), n\(que no lo hace) o ]`(que formatea la salida como ["8" -1]).
John Dvorak
fuente
No son requisitos locos, son requisitos arbitrarios: P
Además, la especificación requiere que el índice sea el primero, pero no puedo leer GolfScript lo suficientemente bien como para saber si no lo hizo
@LegoStormtroopr el único punto de la especificación que menciona el orden es el # 4: "Si no hay un dígito par, devuelve -1 como índice, el segundo número puede ser cualquier cosa". # 3 no especifica el orden; ¿Qué pasa con la audacia "sin delimitador"?
John Dvorak
Oh chasquido, tienes razón señor! Mencioné los dos números a la salida, pero no el orden. Estoy corregido!
Puede reemplazar .0=@?con .@\?o :x?xpara guardar un personaje y evitar la duda sobre el pedido. Buen uso de 8como alternativa.
Peter Taylor
5

APL (37)

(1 basado por defecto, pero obedece ⎕IO)

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

Explicación:

  • : leer la entrada del usuario
  • m←⍵/⍨⍵∊'2468': elimina todos los caracteres que no son 2468, almacenar en m.
  • ×⍴m: ver si hay alguna
  • :: Si es así:
    • z←⌊/⍎¨m: evalúa cada carácter m, encuentra el número más bajo y lo almacena z.
    • z,⍨⍵⍳⍕z: devuelve el índice de zin , seguido de z.
  • : Si no:
    • ¯1,0: regreso (-1, 0)
marinus
fuente
1
Wow, he vencido a APL (no con la solución J, pero aún así ...)
John Dvorak
¿Explicación? APL se explica por sí mismo ...;)
german_guy
3

Pitón 3, 69

combinando ideas de aquí .

s=input();print(([(s.find(x),x)for x in'2468'if x in s]+[(-1,0)])[0]) 
Wasi
fuente
Me gusta el uso de una cadena en lugar de una lista, y la omisión resultante de las comillas (ahora eliminadas).
SimonT
@boothby Supongo que no te diste cuenta de que estoy usando Python 3. En python 3 input () Acepta una cadena como entrada del usuario.
Wasi
@SimonT `(backticks) no son solo comillas. Es un alias en desuso para repr () en python 2. Pero ya no está disponible en Python 3. Entonces, si quiero usar `` en algo en python 3, tengo que escribir repr (algo) que cuesta 4 caracteres más. Por eso me deshago de él;)
Wasi
@Wasi sí, de hecho, mi error.
stand
@Wasi, sí, gracias. Era consciente de eso y, por "ahora eliminado", en realidad quería decir eliminado como parte del lenguaje por completo. Salud.
SimonT
3

Ruby, 60 caracteres.

x=gets.chars.sort.find{|c|c=~/[2468]/};p x ?$_.index(x):-1,x
  • $_contiene la última entrada leída por gets.
  • pinvoca inspectlos argumentos e imprime los resultados.
pliegue derecho
fuente
3

perl - - 94 - 53 caracteres (o 48)

En lugar del index()enfoque basado en cero, usamos posy comenzamos en uno; sin CPAN. Ejecute esto con perl -nEy esperará la entrada (que también puede recibir STDIN).

La primera //operación match ( ) funciona en el valor predeterminado ( $_) de la entrada, haciendo coincidir los números pares dados, sortcolocando las coincidencias en una matriz y luego almacenándolas en una "lista escalar" ($m). En el contexto escalar, el valor de lista de la matriz ordenada es de un elemento y, por lo tanto, consiste en el dígito par más bajo en el número.

Después de haber aislado el dígito más bajo que coincide, usamos $mpara una segunda operación de coincidencia que encontrará la primera aparición del valor de $men la cadena original. Todavía estamos usando el valor predeterminado aquí $_y estamos guardando la coincidencia con el contenido de $min $1(el motivo de la ()vuelta $men la segunda declaración). Después de eso, posy sayhaz el resto (y en menos caracteres que indexy print).

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

Si el orden de salida o las comas no importan, entonces es posible acortar estos 5 caracteres:

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

En mi intento anterior, corrí e hice un error: solo quería vencer a Python y Ruby (pero fallé) ... suspiro.

Felicidades al ganador y a los demás participantes por sus soluciones geniales, especialmente a perl6:-) Una posible adaptación de Perl6 de este enfoque podría usar " .comb(sugerido en Freenode por Masak et.al. ).

$_=get;my $n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
G. Cito
fuente
Estaba tan concentrado en vencer a Python / Ruby que publiqué un solo trazador de líneas que no funcionó cuando no había números pares presentes: usando ansiosamente una versión anterior de lo anterior de mi $SHELLhistorial para la "victoria". Esta versión de trabajo es ridículamente larga y vergonzosa. Me sirve bien: se acortará más tarde para evitar la vergüenza :-(
G. Cito
pirateo más antiguo: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
Bien, pero queda espacio para más golf: ($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"(47 + 1 bytes, AFAIK -ncuesta un byte adicional).
Heiko Oberdiek
NÓTESE BIEN. posDevuelve el desplazamiento. Entonces, en efecto, está devolviendo un índice basado en 1 en su ejemplo.
draegtun
@draegtun oopsie :-) gracias. @Heiko cierto que: interruptores deben contar por lo demás perl's -Mganarían cada vez ;-)
G. Cito
3

Perl 6, 37 55 60 caracteres

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

EDITAR: no entendí la pregunta la primera vez. Esta actualización debe ser correcta. Encuentra el número más bajo de 2,4,6 u 8 que contiene la entrada, y luego hace una coincidencia de expresiones regulares contra la entrada con ese número más bajo. $/.fromobtiene la posición de la coincidencia y ',', $/.Intes una coma más la coincidencia misma, o 0 si el texto no coincide.

Mientras estás aquí, vota a G. Cito , quien me ayudó a arreglar mi entrada en los comentarios y en irc :)

Mouq
fuente
1
Desafortunadamente, esto imprime el primer número par (2468) encontrado y no el más bajo :( NB. También hay un problema con $/.fromcuando no se encuentra nada (esto puede ser un error en mi versión anterior de Rakudo). Aquí hay una variación de su solución que funciona ( para mí!) my$x=get;for 2,4,6,8 ->$n{if $x~~/$n/ {say $/.from,",$/";exit}};say "-1 0"; Viene en 75 caracteres pero estoy seguro de que se puede hacer una solución perl6 más corta.
draegtun
@draegtun ... Ayer cometí un error similar con mi intento de perl5 (ver más abajo). ¡Mi arreglo agregó 70 caracteres! Simplemente lo actualicé con una versión de ~ 50 caracteres, que parece funcionar. Creo que si ordena todos los dígitos pares en el número, puede hacer una coincidencia utilizando el (ahora) primer dígito en la clasificación y asegúrese de tener el más bajo y el primero. Estoy en lo cierto?
G. Cito
@ G.Cito Se ve bien para mí y ya hice +1 en tu respuesta. ¡Puedo ver la forma de eliminar algunos caracteres pero veo a Heiko como mejor aún de lo que iba a sugerir!
draegtun
@draegtun Oh, Dios, entendí completamente mal la pregunta entonces :( ¡Muchas gracias! Actualizaré esto lo antes posible
Mouq
@mouq He aquí un método que utiliza el mismo enfoque que el ejemplo perl5 he publicado a continuación: my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/". Aprendí hace .combunos 20 minutos y ya me gusta :-)
G. Cito
2

J, 44 caracteres

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

genera el último carácter de la entrada si no se encuentra ningún dígito par

Ejemplo:

   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|
+--+-+

Explicación:

  • echo ... i=.1!:1]1es entrada / salida. Mucho más de lo que quiero. La entrada también se guarda i.
  • '2468'i.~ encuentra la primera ocurrencia de cada dígito par en la entrada, devolviendo la longitud de entrada si el dígito no se puede encontrar
  • (#~(#i)&>)lee "seleccionar por la longitud de entrada que es mayor que esto"; en otras palabras, seleccione los índices que apuntan a la entrada. Mucho más de lo que quiero.
  • _1,~agrega -1 a la parte posterior. El subrayado es la forma en que J representa los valores negativos.
  • {. selecciona el primer elemento
  • (;{&i)lo concatena con el carácter de entrada en esa posición en dos cuadros; Como estamos concatenando un número con un carácter, la concatenación sin boxeo ( ,) no funcionará. Si se desea la visualización sin caja, el índice debe formatearse ( ":) primero a un costo de dos caracteres.
John Dvorak
fuente
2

Python 2.7 - 76

Una respuesta de referencia que espero ser golpeado. Pero para empezar a la gente:

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

fuente
3
puedes afeitar a un personaje cambiando indexa find; También puede cambiar [2,4,6,8]a 2,4,6,8(con espacio al frente).
Justin
44
Más corto:print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
grc
44
Creo que rompiste tu propia regla ... ¿Desde cuándo raw_input no es estándar?
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])

Ejemplos (en R, el índice comienza en 1):

_4_502
6  2

_3_501
-1 0 

583746
5  4
Sven Hohenstein
fuente
2

Powershell, 76 73 71

$s=read-host;2,4,6,8|%{if($i=$s.indexof("$_")+1){"$i,$_";break}};"-1,0"
  • $s=read-host almacena la entrada del usuario en $s
  • 2,4,6,8|%{...} ejecuta lo que hay dentro {}para los dígitos 2,4,6 y 8
  • $i=$s.indexof("$_")+1 se establece $ien un índice basado en 1 de un dígito en $so 0si no se encuentra el dígito
  • if( $i=... ){...} la condición será verdadera cuando $ino lo sea0
  • "$i,$_";break genera el índice y el dígito, y detiene la ejecución
  • "-1,0" de lo contrario salidas -1,0
Danko Durbić
fuente
Esto no genera el índice adecuado. En PowerShell, como en los casos de prueba dados para la pregunta, los índices comienzan en cero.
Iszi
1
La regla n. ° 2 dice que el índice puede estar basado en 0 o 1.
Danko Durbić
Oh. No lo vi. De cualquier manera, aquí hay una variante basada en cero que solo tiene 5 caracteres más. $s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
Iszi
Además, estoy bastante seguro de que los paréntesis 2,4,6,8son innecesarios.
Iszi
La variante basada en cero puede tener 2 caracteres más, si cambia la condición if a:if(1+($i=$s.indexof("$_")))
Danko Durbić
2

C ++ 11, 173 (incluidos dos caracteres de nueva línea)

Aquí está la versión comprimida:

#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";}

Aquí está la versión legible:

#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";
}

Aquí hay una versión anterior:

C ++ 11, 175 (incluidos dos caracteres de nueva línea)

Aquí está la versión comprimida:

#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";}

Aquí está la versión legible:

#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";
}
Zapato
fuente
Tratar #define o std::cout<<. Creo que recorta su código por 1 carácter.
@ user2509848, no, en realidad son 2 caracteres más largos. Pero gracias de todos modos :)
Zapato
k==c?std::cout<<(...),throw 0:0;- El operador condicional puede reemplazar if, cuando todo lo que necesita son expresiones. throwes una expresión y también un carácter más corto que return.
MSalters
1

C, 80 caracteres

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

C # - 124

Llego un poco tarde a la fiesta

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
fuente
0

Haskell, 79 caracteres

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

Esto se ejecuta un poco rápido y suelto con el formato de salida:

& 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
fuente
0

PowerShell: 145 103

Cambios del
error de eliminación original eliminado por comentario del autor de la pregunta.

Código:

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

Tutorial:

"... "Todo dentro de las comillas se incluirá en la salida.

$(... )Todo lo que esté entre paréntesis se tratará como un comando, y la salida de ese código se incluirá en lugar de los comandos en sí.

[array]::IndexOf(... )Esto se utiliza para obtener el índice de un elemento con la matriz. Su primer parámetro es el objeto de matriz a buscar. El segundo parámetro es el objeto que se encuentra. Esto solo genera el índice del primer elemento coincidente. Intenté simplemente usar un IndexOfmétodo directamente en contra $s(p. Ej. $s.IndexOf($x), Pero esto falla por alguna razón que aún no he descubierto: afirma que el método no existe en ese objeto.

(... La )expresión dentro del paréntesis será el primer parámetro para IndexOf.

$s= $ s será una variable para almacenar la entrada del usuario.

(read-host)-split'' Obtiene la entrada del usuario y la divide en una matriz de caracteres.

|?{$_}Filtra elementos de matriz vacíos adicionales generados por -split''.

,(... La )expresión dentro del paréntesis será el segundo parámetro para IndexOf.

$x= $ s será una variable para almacenar el dígito par más bajo de la entrada del usuario.

$s|?{$_%2-eq0} Saca los números pares de $ s.

|?{$_-gt0} Invalida cero.

|sort Ordena los objetos restantes, el orden predeterminado es ascendente.

|select -f 1 Selecciona el primer objeto, que ahora será el dígito par más bajo.

,$xEl código anterior generará el índice de nuestro dígito par más bajo. Esto agrega una coma y luego genera el dígito mismo.

Notas:

Tal vez esto es un poco estirar la regla # 4. Si no hay un dígito par, la salida no incluirá un segundo número.

Además, esto arrojará algunos errores sin terminación si la entrada incluye elementos no numéricos. El guión todavía va a correr y dar salida adecuada, pero es posible que desee establecer $ErrorActionPreferencepara 'SilentlyContinue'antes de ejecutarlo.

Iszi
fuente
@ DankoDurbić Ahora que me has derrotado por completo, ¿te importaría ayudarme a descubrir por qué no podría usarlo $s.IndexOfaquí? Me estaba dando un error al decir que el método no existía para ese objeto, aunque $s|gmdijo que sí. Funciona en el sistema en el que estoy ahora, pero no en el que estaba tratando de hacerlo hoy. ¿Es un problema de compatibilidad de versiones? El sistema anterior era PSv2, el actual es PSv4.
Iszi
Tu $ses string[], y $s.indexofno funciona porque ...[System.String[]] doesn't contain a method named 'indexOf', lo que parece razonable (estoy ejecutando PS 2.0). $s|gmdevuelve miembros de System.String, no System.String[]. No estoy seguro de por qué hace eso.
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

Huele un poco porque está explotando la configuración dinámica de VB. Opción Explicit Off e Importaciones System.Console .

Adam Speight
fuente
0

VB.net (193c) usando LINQ

Este utiliza principalmente una consulta 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
fuente
0

Golf-Basic 84, 91 caracteres

:L1/L1_L2i`L1:fpart(L1,2)2_L1:SortA(L1)@cumSum(L1)=length(L1):Thend`-1#d`cumSum(L1):Endd`L1
  • Asegúrese de que no haya 0entrada (no es par, ¿quién dijo que tenía que ser extraño?)
  • Obtener entrada en L1 (Lista 1)
  • Módulo de búsqueda de bucle de 2 para cada valor
  • Ordenar L1 de menor a mayor
  • Mostrar el índice (-1 o la suma acumulativa) y el número más pequeño
Timtech
fuente
0

Bourne shell (sh), 88 caracteres

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

Pensé en hacer algo de procesamiento de cadenas por diversión. Técnicamente, se lee desde stdin, pero si lo ejecuta de forma interactiva, solicitará al usuario que ingrese, ya que el teclado es la secuencia de stdin predeterminada. Utiliza comandos de shell básicos para dividir la entrada en las líneas, numerarlas (utilizando la nlutilidad poco conocida ), filtrar las líneas que se ajustan a los criterios, ordenarlas y generar el dígito más bajo. Imprime 88 -1si no se encontró un dígito par.

Luciérnaga
fuente
0

C ++ - 223 221 Caracteres:

#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;}

Versión legible:

#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;
}

Es largo, pero no tan malo como Java.


fuente
En realidad, es 221 + 2 (nuevos caracteres de línea) de lo contrario no se compilará.
Zapato
Oh. Word solo detectó 221, lo cambiaré.
0

Javascript 93 caracteres

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

Obtenga todos los números de eventos, ordene la matriz e imprima el primer dígito.

Felipe Miosso
fuente
0

Mathematica, 157 caracteres

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
fuente
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 realmente necesita una forma más corta de obtener información para jugar al golf. Conté la definición de fy una llamada a f. Una indexación basada es por qué las respuestas son diferentes de los ejemplos.

gggg
fuente
0

JavaScript: 53 caracteres

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

Lee la entrada del indicador y las salidas (a la consola) del carácter par más bajo y luego (sin delimitador) el primer índice de ese carácter; si no hay caracteres pares distintos de cero, se genera 8-1.

MT0
fuente
0

C, 110 caracteres

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);}

sin 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
fuente
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]]

Lee el valor, itera a través de cada carácter, si la representación numérica mod 2 es igual a 0 y el número es menor que lo que ya está almacenado b, reemplace los valores enb

Danny
fuente
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
fuente
0

Rubí 55

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

JavaScript / jQuery 149

Golfed

$(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);
});

Fuente completa

<!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
fuente