¡Otra pregunta brillante de Stack Overflow se convirtió en un desafío de código de golf !
Escribe un programa que:
- 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.
- Encuentra el índice (basado en 0 o 1) del primer dígito par más bajo .
- Imprime 2 enteros , el índice y el dígito par más bajo .
- Si no hay un número par , devuelva -1 como índice, el segundo número puede ser cualquier cosa.
- 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.
Respuestas:
Golfscript, 26 (28) caracteres
Ejemplo:
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, excepto8
que 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:
:x?x
para arreglar (no me gustan las variables temporales.n@
(que también realiza el intercambio),n\
(que no lo hace) o]`
(que formatea la salida como["8" -1]
).fuente
.0=@?
con.@\?
o:x?x
para guardar un personaje y evitar la duda sobre el pedido. Buen uso de8
como alternativa.APL (37)
(1 basado por defecto, pero obedece
⎕IO
)Explicación:
⍞
: leer la entrada del usuariom←⍵/⍨⍵∊'2468'
: elimina todos los caracteres que no son2468
, almacenar enm
.×⍴m
: ver si hay alguna:
: Si es así:z←⌊/⍎¨m
: evalúa cada carácterm
, encuentra el número más bajo y lo almacenaz
.z,⍨⍵⍳⍕z
: devuelve el índice dez
in⍵
, seguido dez
.⋄
: Si no:¯1,0
: regreso(-1, 0)
fuente
Pitón 3, 69
combinando ideas de aquí .
fuente
Ruby, 60 caracteres.
$_
contiene la última entrada leída porgets
.p
invocainspect
los argumentos e imprime los resultados.fuente
perl - -
94- 53 caracteres (o 48)En lugar del
index()
enfoque basado en cero, usamospos
y comenzamos en uno; sin CPAN. Ejecute esto conperl -nE
y esperará la entrada (que también puede recibirSTDIN
).La primera
//
operación match ( ) funciona en el valor predeterminado ($_
) de la entrada, haciendo coincidir los números pares dados,sort
colocando 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
$m
para una segunda operación de coincidencia que encontrará la primera aparición del valor de$m
en la cadena original. Todavía estamos usando el valor predeterminado aquí$_
y estamos guardando la coincidencia con el contenido de$m
in$1
(el motivo de la()
vuelta$m
en la segunda declaración). Después de eso,pos
ysay
haz el resto (y en menos caracteres queindex
yprint
).Si el orden de salida o las comas no importan, entonces es posible acortar estos 5 caracteres:
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. ).fuente
$SHELL
historial 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 :-(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 bytes, AFAIK-n
cuesta un byte adicional).pos
Devuelve el desplazamiento. Entonces, en efecto, está devolviendo un índice basado en 1 en su ejemplo.perl
's-M
ganarían cada vez ;-)Perl 6,
375560 caracteresEDITAR: 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.
$/.from
obtiene la posición de la coincidencia y',', $/.Int
es 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 :)
fuente
$/.from
cuando 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.my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
. Aprendí hace.comb
unos 20 minutos y ya me gusta :-)J, 44 caracteres
genera el último carácter de la entrada si no se encuentra ningún dígito par
Ejemplo:
Explicación:
echo ... i=.1!:1]1
es entrada / salida. Mucho más de lo que quiero. La entrada también se guardai
.'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.fuente
Python 2.7 - 76
Una respuesta de referencia que espero ser golpeado. Pero para empezar a la gente:
fuente
index
afind
; También puede cambiar[2,4,6,8]
a2,4,6,8
(con espacio al frente).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
Ejemplos (en R, el índice comienza en 1):
fuente
Powershell,
767371$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$i
en un índice basado en 1 de un dígito en$s
o0
si no se encuentra el dígitoif( $i=... ){...}
la condición será verdadera cuando$i
no lo sea0
"$i,$_";break
genera el índice y el dígito, y detiene la ejecución"-1,0"
de lo contrario salidas-1,0
fuente
$s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
2,4,6,8
son innecesarios.if(1+($i=$s.indexof("$_")))
C ++ 11, 173 (incluidos dos caracteres de nueva línea)
Aquí está la versión comprimida:
Aquí está la versión legible:
Aquí hay una versión anterior:
C ++ 11, 175 (incluidos dos caracteres de nueva línea)
Aquí está la versión comprimida:
Aquí está la versión legible:
fuente
#define o std::cout<<
. Creo que recorta su código por 1 carácter.k==c?std::cout<<(...),throw 0:0;
- El operador condicional puede reemplazarif
, cuando todo lo que necesita son expresiones.throw
es una expresión y también un carácter más corto quereturn
.C, 80 caracteres
fuente
C # - 124
Llego un poco tarde a la fiesta
fuente
Haskell, 79 caracteres
Esto se ejecuta un poco rápido y suelto con el formato de salida:
fuente
PowerShell:
145103Código:
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 unIndexOf
mé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 paraIndexOf
.$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 paraIndexOf
.$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.,$x
El 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
$ErrorActionPreference
para'SilentlyContinue'
antes de ejecutarlo.fuente
$s.IndexOf
aquí? Me estaba dando un error al decir que el método no existía para ese objeto, aunque$s|gm
dijo 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.$s
esstring[]
, y$s.indexof
no funciona porque...[System.String[]] doesn't contain a method named 'indexOf'
, lo que parece razonable (estoy ejecutando PS 2.0).$s|gm
devuelve miembros deSystem.String
, noSystem.String[]
. No estoy seguro de por qué hace eso.vb.net (108c)
Huele un poco porque está explotando la configuración dinámica de VB. Opción Explicit Off e Importaciones System.Console .
fuente
VB.net (193c) usando LINQ
Este utiliza principalmente una consulta LINQ.
fuente
Golf-Basic 84, 91 caracteres
0
entrada (no es par, ¿quién dijo que tenía que ser extraño?)fuente
Bourne shell (sh), 88 caracteres
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
nl
utilidad poco conocida ), filtrar las líneas que se ajustan a los criterios, ordenarlas y generar el dígito más bajo. Imprime88 -1
si no se encontró un dígito par.fuente
C ++ - 223
221Caracteres:Versión legible:
Es largo, pero no tan malo como Java.
fuente
Javascript 93 caracteres
Obtenga todos los números de eventos, ordene la matriz e imprima el primer dígito.
fuente
Mathematica, 157 caracteres
fuente
Julia, 84
Julia realmente necesita una forma más corta de obtener información para jugar al golf. Conté la definición de
f
y una llamada af
. Una indexación basada es por qué las respuestas son diferentes de los ejemplos.fuente
JavaScript: 53 caracteres
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
.fuente
C, 110 caracteres
sin golf:
fuente
Javascript, 69
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
fuente
Rebol, 69
fuente
Rubí 55
fuente
JavaScript / jQuery 149
Golfed
Fuente completa
fuente