Hora da lição de casa! Encontre o dígito par mais baixo de uma string

12

Outra pergunta brilhante do Stack Overflow se transformou em um desafio de !

Escreva um programa que:

  1. Aceita uma sequência como entrada do usuário (não canalizada ou um argumento de linha de comando). O tipo de dados da entrada deve ser uma sequência, se o idioma avaliar automaticamente na entrada, ele deve ser convertido em uma sequência.
  2. Localiza o índice (com base em 0 ou 1) do primeiro dígito par mais baixo .
  3. Imprime 2 números inteiros , o índice e o dígito par mais baixo .
  4. Se não houver um dígito par , retorne -1 como índice, o segundo número pode ser qualquer coisa.
  5. Para os fins deste zero não é par .

Exemplos de teste, dada a sequência à esquerda, os valores à direita geram:

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

O vencedor: é o programa com a menor contagem de caracteres. Sem bônus, sem penalidades.

edit: (sobre stdin) Eu estraguei a parte de entrada do usuário, basicamente sem dados de canal e sem argumentos de linha de comando. Você deve fornecer um prompt de usuário de algum tipo dentro do próprio programa.

Comunidade
fonte
4
E se o número inteiro par menor tiver dois dígitos? Ok, foi uma piada.
Dr. belisarius
5
O que há de errado com stdin?
precisa
1
@ JanDvorak Porque regras arbitrárias, é por isso.
7
Por que a limitação de zero não é uniforme? Isso parece bastante estranho.
Iszi
3
Seus requisitos de entrada realmente não fazem sentido: para a maioria dos sistemas, a entrada vem do stdin, solicitada ou não pelo programa. Se a entrada é ou não canalizada ou não, não está sob controle do programa. - Se seu objetivo era fazer com que os usuários criassem um programa interativo, você deveria ter sido preciso quanto à entrada e saída (incluindo formatação) e a interação necessária.
usar o seguinte comando

Respostas:

6

Golfscript, 26 (28) caracteres

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

Exemplo:

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

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

teste ao vivo: http://golfscript.apphb.com/?c=Oyc1Mzc3MScKLicyNDYnJjgrJDE8LjA9QD8%3D

Explicação:

  • '#{gets}'é uma fuga ao ruby ​​para satisfazer os requisitos de E / S; STDIN é considerado vazio
  • . clona a entrada
  • '246'&8+localiza quais dígitos pares estão presentes na entrada, exceto que 8é sempre retido
  • $1< classifica a lista e pega o primeiro dígito, mas a mantém como uma sequência
  • .@\?ordena a pilha {dígito, entrada, dígito} e localiza o dígito na entrada; obrigado @peterTaylor por me notar a assinatura [array, array] de ?.

Fui muito ousado com a interpretação das especificações dessa vez; nomeadamente:

  • A especificação não determina em que ordem os números inteiros são emitidos; Use a sugestão do outro @ Peter :x?xpara corrigir (não gosto de variáveis ​​temporárias.
  • A especificação não requer nenhum delimitador entre os dois números inteiros; como o dígito encontrado é sempre um dígito, isso não importa muito. Se isso acontecer, acrescente n@(que também executa a troca), n\(que não) ou ]`(que formata a saída como ["8" -1]).
John Dvorak
fonte
Eles não são requisitos malucos, são requisitos arbitrários: P
Além disso, a especificação exige que o índice seja o primeiro, mas não consigo ler o GolfScript suficientemente bem para saber se você não
@LegoStormtroopr o único ponto da especificação que menciona a ordem é o número 4: "Se não houver um dígito par, retorne -1 como índice, o segundo número pode ser qualquer coisa". # 3 não especifica o pedido; e a ousadia "sem delimitador"?
John Dvorak
Oh snap, você está correto, senhor! Mencionei os dois números para saída, mas não a ordem. Eu estou corrigido!
Você pode substituir .0=@?por .@\?ou :x?xsalvar um caractere e evitar dúvidas sobre o pedido. Uso agradável 8como substituto.
Peter Taylor
5

APL (37)

(Com base em 1 por padrão, mas obedece ⎕IO)

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

Explicação:

  • : ler entrada do usuário
  • m←⍵/⍨⍵∊'2468': remova todos os caracteres que não são 2468, armazene m.
  • ×⍴m: veja se há algum
  • :: Se então:
    • z←⌊/⍎¨m: avalie cada caractere m, encontre o número mais baixo e armazene-o z.
    • z,⍨⍵⍳⍕z: retorna o índice de zin , seguido por z.
  • : Se não:
    • ¯1,0: Retorna (-1, 0)
marinus
fonte
1
Uau, eu tenho batida APL (não com a solução de J, mas ainda assim ...)
John Dvorak
Explicação? APL é tão auto-explicativo ...;)
german_guy
3

Python 3, 69

combinando idéias daqui .

s=input();print(([(s.find(x),x)for x in'2468'if x in s]+[(-1,0)])[0]) 
Wasi
fonte
Gosto mais do uso de uma string do que de uma lista e da omissão resultante das aspas (agora removidas) `.
SimonT
@ boothby Acho que você não percebeu que estou usando o python 3. No python 3 input () Aceita uma string como entrada do usuário.
Wasi
@SimonT `(backticks) não são apenas aspas. É um alias reprovado para repr () no python 2. Mas não está mais disponível no Python 3. Portanto, se eu quiser usar `` algo em python 3, tenho que escrever repr (algo) que custa mais 4 caracteres. É por isso que me livrei dele;)
Wasi
@ Wasi sim, de fato, meu erro.
Boothby
@ Wasi, sim, obrigado. Eu estava ciente disso e por "agora removido" eu realmente quis dizer removido como parte da linguagem. Felicidades.
SimonT
3

Ruby, 60 caracteres

x=gets.chars.sort.find{|c|c=~/[2468]/};p x ?$_.index(x):-1,x
  • $_contém a última entrada lida por gets.
  • pchama inspectos argumentos e imprime os resultados.
destro
fonte
3

perl - - 94 - 53 caracteres (ou 48)

Em vez da index()abordagem baseada em zero, usamos pose começamos em uma; sem CPAN. Execute isso com perl -nEe ele aguardará a entrada (da qual também pode receber STDIN).

A primeira //operação match ( ) funciona com o valor padrão ( $_) da entrada, correspondendo aos números pares fornecidos, sortinserindo as correspondências em uma matriz e armazenando-as em uma "lista escalar" ($m). No contexto escalar, o valor da lista da matriz classificada é um item e, portanto, consiste no dígito par correspondente mais baixo do número.

Depois de isolar o dígito correspondente mais baixo, usamos então $mpara uma segunda operação de correspondência que encontrará a primeira ocorrência do valor $mna string original. Ainda estamos usando o valor padrão aqui $_e estamos salvando a correspondência com o conteúdo de $min $1(o motivo da ()inversão $mna segunda instrução). Depois disso, pose sayfazer o resto (e em menos caracteres do que indexe print).

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

Se a ordem de saída ou vírgulas não importarem, é possível reduzir esses 5 caracteres:

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

Na minha tentativa anterior, corri e cometi um erro - eu só queria vencer python e ruby ​​(mas falhei) ... suspiro.

Parabéns ao vencedor e aos outros participantes por suas soluções legais - especialmente para perl6:-) Uma possível adaptação do .combPerl6 dessa abordagem poderia ser usada " (sugerida no freenode por Masak et.al. ).

$_=get;my $n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
G. Cito
fonte
Estava tão focado em vencer o python / ruby ​​que postei um liner que não funcionava quando não havia números pares: ansiosamente usando uma versão anterior do anterior da minha $SHELLhistória para a "vitória". Esta versão de trabalho é ridiculamente longa e embaraçosa. Não me falha: vai encurtar mais tarde para vergonha evitar :-(
G. Cito
hack mais antigo:if(/[2468]/){for$i(2,4,6,8){if(index($_,$i)>-1){say$i,",",index($_,$i)+1;last}}}else{say"0,-1"}
G. Cito 17/04
2
Bom, mas ainda resta espaço para golfe: ($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"(47 + 1 bytes, o AFAIK -ncusta um byte adicional).
Heiko Oberdiek
NB posretorna o deslocamento. Então, com efeito, ele está retornando um índice baseado em 1 no seu exemplo.
draegtun
@draegtun oopsie :-) obrigado. @ Heiko verdade que: os interruptores devem contar caso contrário perlos -Mvenceria todas as vezes ;-)
G. Cito
3

Perl 6, 37 55 60 caracteres

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

Edição: Eu entendi mal a pergunta pela primeira vez. Esta atualização deve estar correta. Ele encontra o número mais baixo de 2,4,6 ou 8 que a entrada contém e, em seguida, uma regex corresponde à entrada com esse número mais baixo. $/.fromobtém a posição da correspondência e ',', $/.Inté uma vírgula mais a correspondência em si, ou 0 se o texto não corresponder.

Enquanto você estiver aqui, suba a votação G. Cito , que me ajudou a consertar minha entrada nos comentários e no irc :)

Mouq
fonte
1
Infelizmente, isso imprime o primeiro número par (2468) encontrado e não o mais baixo :( NB. Também há um problema em $/.fromque nada é encontrado (isso talvez seja um bug na minha versão antiga do Rakudo). Aqui está uma variação da sua solução que funciona ( ! para mim) my$x=get;for 2,4,6,8 ->$n{if $x~~/$n/ {say $/.from,",$/";exit}};say "-1 0"; vem em 75 caracteres, mas eu tenho certeza que uma solução perl6 mais curto pode ser feita.
draegtun
@draegtun ... Cometi um erro semelhante com minha tentativa de perl5 ontem (veja abaixo). Minha correção adicionou 70 caracteres! Acabei de atualizá-lo com uma versão de ~ 50 caracteres - que parece funcionar. Eu acho que se você classificar todos os dígitos pares do número, poderá fazer uma correspondência usando o (agora) primeiro dígito na classificação e verifique se possui o menor e o primeiro. Estou certo?
G. Cito 17/04
@ G.Cito Parece bom para mim e já marcou sua resposta com +1. Posso ver uma maneira de cortar alguns caracteres, mas vejo a Heiko como ainda melhor do que o que eu ia sugerir!
draegtun
@draegtun Oh, nossa, eu não entendi completamente a questão então :( Muito obrigado eu vou atualizar esta ASAP!
Mouq
@mouq Aqui está uma abordagem que usa a mesma abordagem que o exemplo perl5 eu postei abaixo: my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/". Eu aprendi cerca de .comb20 minutos atrás e eu já gosto :-)
G. Cito
2

J, 44 caracteres

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

gera o último caractere da entrada se nenhum dígito for encontrado

Exemplo:

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

Explicação:

  • echo ... i=.1!:1]1é entrada / saída. Muito mais tempo do que eu quero. A entrada também é escondida i.
  • '2468'i.~ localiza a primeira ocorrência de cada dígito par na entrada, retornando o comprimento da entrada se o dígito não puder ser encontrado
  • (#~(#i)&>)lê "selecione pelo tamanho da entrada maior que isso"; em outras palavras, selecione os índices que apontam para a entrada. Muito mais tempo do que eu quero.
  • _1,~acrescenta -1 à parte de trás. Sublinhado é a maneira de J representar valores negativos.
  • {. seleciona o primeiro elemento
  • (;{&i)concatena-o com o caractere de entrada nessa posição em duas caixas; como concatenamos um número com um caractere, a concatenação sem boxe ( ,) não funciona. Se a exibição sem caixa for desejada, o índice precisará ser formatado ( ":) primeiro a um custo de dois caracteres.
John Dvorak
fonte
2

Python 2.7 - 76

Uma resposta de referência que espero ser derrotada. Mas para começar as pessoas:

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

fonte
3
você pode raspar um personagem mudando indexpara find; você também pode mudar [2,4,6,8]para 2,4,6,8(com espaço na frente).
Justin
4
Mais curto:print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
grc
4
Eu acho que você quebrou sua própria regra ... Desde quando raw_input não é stdin?
quer
1
print[(s.index(c),c)for c in'2468'if c in s][0]or(-1,0)
22413 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])

Exemplos (em R, o índice começa em 1):

_4_502
6  2

_3_501
-1 0 

583746
5  4
Sven Hohenstein
fonte
2

Powershell, 76 73 71

$s=read-host;2,4,6,8|%{if($i=$s.indexof("$_")+1){"$i,$_";break}};"-1,0"
  • $s=read-host armazena a entrada do usuário em $s
  • 2,4,6,8|%{...} corre o que está dentro {} dos dígitos 2,4,6 e 8
  • $i=$s.indexof("$_")+1 define o $iíndice baseado em 1 de um dígito em$s ou 0se o dígito não for encontrado
  • if( $i=... ){...} a condição será verdadeira quando $i não for0
  • "$i,$_";break gera o índice e o dígito e interrompe a execução
  • "-1,0" caso contrário, gera -1,0
Danko Durbić
fonte
Isso não gera o índice adequado. No PowerShell, como nos casos de teste fornecidos para a pergunta, os índices começam em zero.
Iszi
1
A regra 2 diz que o índice pode ser baseado em 0 ou 1.
Danko Durbić
Oh Não percebi isso. De qualquer maneira, aqui está uma variante baseada em zero, com apenas 5 caracteres a mais. $s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
Iszi
Além disso, tenho certeza de que os parênteses 2,4,6,8são desnecessários.
Iszi
A variante baseada em zero pode ter 2 caracteres a mais, se você alterar a condição if para:if(1+($i=$s.indexof("$_")))
Danko Durbić
2

C ++ 11, 173 (incluindo dois caracteres de nova linha)

Aqui está a versão compactada:

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

Aqui está a versão legível:

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

Aqui está uma versão mais antiga:

C ++ 11, 175 (incluindo dois caracteres de nova linha)

Aqui está a versão compactada:

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

Aqui está a versão legível:

#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";
}
Sapato
fonte
Tente #define o std::cout<<. Eu acho que ele corta seu código em 1 caractere.
@ user2509848, não, na verdade, são 2 caracteres a mais. Mas obrigado de qualquer maneira :)
Shoe
k==c?std::cout<<(...),throw 0:0;- o operador condicional pode substituir if, quando tudo que você precisa são expressões. throwé uma expressão e também um caractere menor 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
fonte
1

C # - 124

Estou um pouco atrasado para a festa

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

Haskell, 79 caracteres

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

Isso funciona um pouco rápido e solto com a formatação de saída:

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

PowerShell: 145 103

Alterações do
quelch de erro removido original por comentário do solicitante .

Código:

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

Passo a passo:

"... "Tudo dentro das aspas será incluído na saída.

$(...) Tudo entre parênteses será tratado como um comando, e a saída desse código será incluída em vez dos próprios comandos.

[array]::IndexOf(... )Isso é usado para obter o índice de um elemento com a matriz. Seu primeiro parâmetro é o objeto de matriz a ser pesquisado. O segundo parâmetro é o objeto a ser encontrado. Isso gera apenas o índice do primeiro elemento correspondente. Tentei simplesmente usar um IndexOfmétodo diretamente contra $s(por exemplo:, $s.IndexOf($x)mas isso falha por algum motivo, ainda não descobri - ele afirma que o método não existe nesse objeto.

(... A )expressão entre parênteses será o primeiro parâmetro para IndexOf.

$s= $ s será uma variável para armazenar a entrada do usuário.

(read-host)-split'' Obtém a entrada do usuário e a divide em uma matriz de caracteres.

|?{$_}Filtra os elementos extras vazios da matriz gerados por -split''.

,(... A )expressão entre parênteses será o segundo parâmetro para IndexOf.

$x= $ s será uma variável para armazenar o dígito par mais baixo da entrada do usuário.

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

|?{$_-gt0} Invalida zero.

|sort Classifica os objetos restantes, a ordem padrão é crescente.

|select -f 1 Seleciona o primeiro objeto, que agora será o dígito par mais baixo.

,$xO código acima produzirá o índice do nosso dígito par mais baixo. Isso adiciona uma vírgula e gera o próprio dígito.

Notas:

Talvez essa seja a regra # 4 de alongamento um pouco. Se não houver um dígito par, a saída não incluirá um segundo número.

Além disso, isso gerará alguns erros sem terminação se a entrada incluir elementos não numéricos. O script ainda será executado e fornecerá a saída adequada, mas você pode definir $ErrorActionPreferencecomo 'SilentlyContinue'antes de executá-lo.

Iszi
fonte
@ DankoDurbić Agora que você me derrotou profundamente, você se importaria de me ajudar a descobrir por que eu não poderia usar $s.IndexOfaqui? Ele estava me dando um erro dizendo que o método não existia para esse objeto, mesmo que tenha $s|gmdito. Funciona no sistema em que estou agora, mas não no que eu estava tentando fazer hoje mais cedo. É um problema de compatibilidade de versão? O sistema anterior era PSv2, a atual é PSv4.
Iszi
Você $sé string[]e $s.indexofnão funciona porque ...[System.String[]] doesn't contain a method named 'indexOf', o que parece razoável (estou executando o PS 2.0). $s|gmretorna membros de System.String, não System.String[]. Não sei por que isso acontece.
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

Cheira um pouco porque está explorando a configuração dinâmica do VB. Opção Explícita Desativada e Importação System.Console .

Adam Speight
fonte
0

VB.net (193c) usando LINQ

Este está utilizando principalmente uma 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
fonte
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
  • Verifique se não há nada 0na entrada (não é par, quem disse que isso deveria ser estranho?)
  • Obter entrada para L1 (lista 1)
  • Módulo de localização de loop de 2 para cada valor
  • Classifique L1 do menor para o maior
  • Exiba o índice (-1 ou a soma acumulada) e o menor número
Timtech
fonte
0

Casca de Bourne (sh), 88 caracteres

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

Eu pensei em fazer um processo de processamento de string por diversão. Tecnicamente, ele lê a partir de stdin, mas se você o executar interativamente, solicitará a entrada do usuário, pois o teclado é o fluxo stdin padrão. Utiliza comandos básicos do shell para dividir a entrada nas linhas e numerá-las (usando o nome desconhecido)nl utilitário ), filtrar as linhas que atendem aos critérios, classificá-las e gerar o dígito mais baixo. Imprime 88 -1se nenhum dígito foi encontrado.

FireFly
fonte
0

C ++ - 223 221 Personagens:

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

Versão legível:

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

É longo, mas não tão ruim quanto o Java.


fonte
Na verdade, é 221 + 2 (caracteres de nova linha), caso contrário não será compilado.
Shoe
Oh Palavra detectada apenas 221, vou alterá-lo.
0

Javascript 93 caracteres

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

Obtenha todos os números de eventos, classifique a matriz e imprima o primeiro dígito.

Felipe Miosso
fonte
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
fonte
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 precisa de uma maneira mais curta de obter informações para jogar golfe. Contei a definição de fe uma chamada para f. Uma indexação baseada é por que as respostas são diferentes dos exemplos.

gggg
fonte
0

JavaScript - 53 caracteres

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

Lê a entrada do prompt e gera (para o console) o caractere par mais baixo e, sem delimitador, o primeiro índice desse caractere; se não houver caracteres pares diferentes de zero, ele será exibido 8-1.

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

ungolfed:

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
fonte
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]]

Lê o valor, itera através de cada caractere, se a representação numérica mod 2 for igual a 0 e o número for menor que o que já está armazenado b, substitua os valores emb

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

Ruby 55

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

JavaScript / jQuery 149

Golfe

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

Fonte 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
fonte