Pautas
Tarea
Escriba un método que tome una matriz de letras consecutivas (crecientes) como entrada y que devuelva la letra que falta en la matriz (listas en algunos idiomas).
Reglas
- Este es el código de golf, por lo que gana la respuesta más corta en bytes.
- Siempre obtendrás una matriz válida
- Siempre habrá exactamente una letra faltante
- La longitud de la matriz siempre será al menos 2.
- La matriz siempre contendrá letras en un solo caso (mayúsculas o minúsculas)
- Debe generar en el mismo caso (mayúsculas o minúsculas) que la entrada es
- La matriz siempre irá solo una letra por vez (omitiendo la letra que falta)
- La longitud de la matriz estará entre 2 y 25
- El primer o el último elemento de la matriz nunca faltará
Ejemplos
['a','b','c','d','f'] -> 'e'
['O','Q','R','S'] -> 'P'
['x','z'] -> 'y'
['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','w','x','y','z'] -> 'v'
code-golf
array-manipulation
alphabet
Amorris
fuente
fuente
['a','b','c','d','f','g']
, salida['e']
, si esoRespuestas:
Pyth , 5 bytes
Pruébalo en línea!
fuente
C # (.NET Core) ,
48 4746 bytes, entrada como matriz de caracteresPruébalo en línea!
Explicación: el primer elemento de la matriz se incrementa, así como un puntero que itera los siguientes elementos. Cuando tanto el primer elemento como el elemento actual son diferentes, devuelve el primer elemento.
C # (.NET Core) ,
58 5650 bytes, entrada como cadenaPruébalo en línea!
Solución anterior de 58 bytes (mencionada en el primer comentario):
Algoritmos que usan System.Linq
Los siguientes algoritmos deben agregar
using System.Linq;
(18 bytes) al recuento de bytes y, por lo tanto, son más largos.Este me gustó bastante (52 + 18 bytes):
Y también tiene una solución de una línea (45 + 18) bytes:
Y una solución muy inteligente (37 + 18) bytes, cortesía de Ed'ka:
fuente
s[i]-s[0]
, bastante inteligente!for
ciclo no tiene una condición de detención, por lo que seguirá iterando hasta que laif
condición se evalúe comotrue
.a=>{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}
(cuando toma la entrada comochar[]
). No gracias a mí por cierto, gracias al comentario de @Nevay sobre mi respuesta de Java 8 .s=>s.Select(e=>++e).Except(s).First()
Alice , 10 bytes
Pruébalo en línea!
Explicación
Esto es solo un marco para programas lineales que operan completamente en modo Ordinal (procesamiento de cadenas):
El código lineal real es entonces:
Que hace:
fuente
Haskell ,
3330 bytesPruébalo en línea!
fuente
until
guarda un byte:f(a:b)=until(`notElem`a:b)succ a
Ruby, 21 caracteres
Devuelve una matriz de un solo elemento, de acuerdo con el comentario del propietario de la pregunta .
Ejecución de muestra:
Pruébalo en línea!
fuente
Java 8,
7057564846 bytes-14 (70 → 56) y -2 (48 → 46) bytes gracias a @CarlosAlejo .
-8 (56 → 48) bytes gracias a @Nevay .
Explicación:
Pruébalo aquí
fuente
a->{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}
.C (gcc) , 33
35364860 60bytesTodas las optimizaciones deben desactivarse y solo en GCC de 32 bits.
Toma la entrada como una cadena.
Pruébalo en línea!
fuente
foo(char*a){return*a+1==a[1]?foo(a+1):++*a;}
es bastante bueno; Solo 1 char más corto que el más naturalfoo(char*a){while(*a+1==a[1])a++;return++*a;}
Python 3 ,
7462584440 bytes-12 bytes gracias a Erik the Outgolfer. -18 bytes gracias a Leaky Nun. -4 bytes gracias a musicman523.
Toma la entrada como una cadena de bytes.
Pruébalo en línea!
Otra solución genial:
fuente
.difference({*s})
->-{*s}
Mathematica, 46 bytes
fuente
Min@Complement[CharacterRange@@#[[{1,-1}]],#]&
salvaría un byte.JavaScript (ES6), 70 bytes
Entrada como una matriz de caracteres
Menos golf
Prueba
fuente
PHP> = 7.1, 46 bytes
Tomar entrada como cadena
PHP Sandbox en línea
fuente
Retina ,
3325 bytesPruébalo en línea! Funciona con cualquier rango de caracteres ASCII. Editar: guardado 8 bytes gracias a @MartinEnder. Explicación: La primera etapa duplica la entrada. El segundo disminuye todos los caracteres de la copia en 1 punto de código. La tercera etapa elimina todos los caracteres de la copia que aún aparecen en el original. Esto solo deja la entrada original, el carácter que precede al primer carácter de la entrada original y el carácter que falta. La última etapa simplemente coincide con el personaje que falta.
fuente
SWI Prolog, 124 bytes
Ejemplos:
Pequeña explicación:
El
m
es el procedimiento "principal",n
produce el siguiente carácter esperado en la lista. Lac
comparación sí: si las expectativas coinciden con el siguiente elemento, continúe, de lo contrario imprima el carácter esperado y salte por la ventana.fuente
fail
:0=1
.C ++ 14, biblioteca estándar, tipo de contenedor genérico (
8786 bytes)::std
Se supone el tipo de contenedor del espacio de nombres (por ejemplostd::string
,std::list
ostd::vector
. De lo contrariousing namespace std;
, se supondría algo similar.Míralo Live On Coliru
C ++ 14 sin biblioteca estándar (todavía genérico,
6463 bytes)Nuevamente, debe ayudar a buscar nombres solo si el tipo de contenedor no es del espacio de nombres
::std
(o está asociado con él)Live On Coliru para
std::string
ej.Live On Colirupor
char const[]
ej.fuente
Carbón , 18 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Toma la entrada como una cadena. Funciona con cualquier secuencia casi contigua de caracteres ASCII.
fuente
C #, 104 bytes
Versión completa / formateada:
fuente
s=>s.Select(e=>++e).Except(s).First()
MATL,
87 bytes1 byte guardado gracias a @Luis
Pruébalo en MATL Online
Explicación
fuente
Excel, 110 + 2 = 112 bytes
Debe ingresarse como una fórmula de matriz ( Ctrl+ Shift+ Enter) que agrega llaves
{ }
en cada extremo, agregando dos bytes. La entrada es como una cadena de entradaA1
, lo cual está bien por OP .Esta no es la respuesta más corta con diferencia (Excel rara vez lo es) pero me gusta ver si se puede hacer.
fuente
Rexx (Regina) , 56 bytes
Pruébalo en línea!
Finalmente, uno que permite a REXX usar su fuerte manipulación de cadenas.
fuente
CJam , 6 bytes (programa completo) / 7 bytes (bloque de código)
Pruébalo en línea!
Este es un programa completo de CJam que lee la cadena de entrada desde la entrada estándar e imprime la letra que falta en la salida estándar. CJam en realidad no tiene "métodos", que es lo que pide el desafío, pero lo más cercano probablemente sería un bloque de código ejecutable, como este:
Pruébalo en línea!
Este bloque de código, cuando se evalúa, toma la entrada como una cadena (es decir, una matriz de caracteres) en la pila y devuelve el carácter faltante también en la pila.
Explicación: en el programa completo,
q
lee la cadena de entrada y la coloca en la pila.)
luego saca el último carácter de la cadena de entrada, y el operador de rango lo,
convierte en una matriz que contiene todos los caracteres con puntos de código debajo (incluidas todas las letras anteriores en el alfabeto). Así, por ejemplo, si la entrada fuecdfgh
, entonces después de),
la pila contendría las cadenascdfg
(es decir, la entrada con la última letra eliminada) y...abcdefg
, donde...
representa un grupo de caracteres con códigos ASCII a continuacióna
(es decir, todos los caracteres debajo de la última entrada eliminada carta).El operador de diferencia de conjunto simétrico
^
combina estas cadenas en una sola cadena que contiene exactamente los caracteres que aparecen en una de las cadenas, pero no en ambas. Conserva el orden en que aparecen los caracteres en las cadenas, por lo que para la entrada de ejemplocdfg
, el resultado posterior),^
será...abe
, donde...
nuevamente representa un grupo de caracteres con los códigos ASCII a continuacióna
. Finalmente,W=
solo extrae el último carácter de esta cadena, que es exactamente el carácter faltantee
que queríamos encontrar (y descarta el resto). Cuando finaliza el programa, el intérprete de CJam imprime implícitamente el contenido de la pila.Bonus: GolfScript , 6 bytes (programa completo)
Pruébalo en línea!
Resulta que casi el mismo código también funciona en GolfScript. Guardamos un byte en la versión completa del programa debido a la entrada implícita de GolfScript, pero perdemos un byte porque, a diferencia de CJam
W
, GolfScript no tiene una variable útil de una sola letra inicializada en -1.Además, CJam tiene tipos enteros y de caracteres separados (y las cadenas son solo matrices que contienen caracteres), mientras que GolfScript solo tiene un tipo entero único (y tiene un tipo de cadena especial que se comporta de manera algo diferente de las matrices normales). El resultado de todo esto es que, si queremos que el intérprete de GolfScript imprima la letra faltante real en lugar de su número de código ASCII, debemos devolver una cadena de un solo carácter en lugar de solo el carácter en sí. Afortunadamente, hacer ese cambio aquí solo requiere reemplazar el operador de indexación
=
con el operador de truncamiento izquierdo de la matriz / cadena>
.Por supuesto, gracias a la E / S implícita de GolfScript, el código anterior también se puede usar como un fragmento que lee una cadena de la pila y devuelve una cadena de un solo carácter que contiene la letra que falta. O, mejor dicho, cualquier fragmento que tome una sola cadena en la pila como argumento, y devuelva su salida como una cadena imprimible en la pila, también es un programa completo de GolfScript.
fuente
q
(programa) o{...}
(bloque). +1 para el enfoque sin embargoCasco , 6 bytes
Pruébalo en línea!
Esta función toma una cadena (lista de caracteres) como entrada y devuelve un carácter como salida.
Explicación
fuente
Python 2 - 76 bytes
Pierde a la solución existente de Python 2, pero es un enfoque ligeramente diferente, así que pensé en publicarlo de todos modos:
fuente
8vo , 99 bytes
Razón fundamental
Si la distancia entre letras es mayor que dos, entonces falta una letra. La distancia entre letras se obtiene calculando la diferencia entre el código ASCII de cada letra.
Código
Versión sin golf
Uso y ejemplos
fuente
JavaScript (ES6), 64 bytes
Toma la entrada como una cadena.
¿Cómo?
Inicialización: Comenzamos con n = 0 y p = 0 y llamamos a la función recursiva g () .
Paso # 1: Incrementamos n hasta que
c = String.fromCharCode(n)
sea igual al primer carácter de la cadena de entrada s [0] .Paso # 2: Ahora que estamos sincronizados, incrementamos tanto n como p al mismo tiempo hasta que
c = String.fromCharCode(n)
ya no sea igual a s [p] .Paso 3: devolvemos c : el carácter esperado que no se encontró.
Casos de prueba
Mostrar fragmento de código
fuente
J, 20 bytes
a.e.
máscara booleana para las letras de entrada en el conjunto de caracteres ascii1 0 1&E.
nueva máscara booleana que indica si la secuencia101
comienza en ese índice, es decir, encuentra cualquier lugar donde comienza una secuencia de "omisión"I.
el índice de esa coincidencia, es decir, el carácter anterior al omitido>:
incremente en 1, es decir, el índice del carácter omitido dentro del conjunto de caracteres ascii{&a.
seleccione ese índice del conjunto de caracteres ascii, es decir, devuelva el carácter omitidoPruébalo en línea!
fuente
ES6, 125 bytes:
http://jsbin.com/vasoqidawe/edit?console
La función devuelta debe llamarse con una matriz
uno podría guardar otros 9 bytes eliminando .join ("") y pasando una cadena:
ES6, 108 bytes:
http://jsbin.com/tudiribiye/edit?console
fuente
a.join("")
podría sera.join``
Lisp común, 88 bytes
Pruébalo en línea!
fuente
Python 2 , 69 bytes
Pruébalo en línea!
Algunas explicaciones Como conocemos el primer y el último elemento de la lista, podemos calcular fácilmente la suma de los códigos de todos los caracteres en
list + the missed char
(usando fórmulas de resumen de progresión aritmética ). La diferencia entre esta suma y la suma de los códigos de todos los caracteres en ellist
da el código de la letra perdida.fuente
05AB1E ,
97 bytesPruébalo en línea!
fuente
2
que estamos usando el mismo algoritmo, aunque apenas sé 05AB1E :)APL (Dyalog) , 17 bytes
Pruébalo en línea!
⎕AV∘∊
Boole: cada carácter de la A Tomic V ector (conjunto de caracteres) miembro de la discusión?(
...)
aplique la siguiente función tácita:⊃
el primer elemento de⎕AV
la A tomic V ector (el juego de caracteres)/⍨
cual∨\
sigue la inicial (miembro del argumento)∧
pero~
no es (un miembro del argumento)fuente