Cuando era más joven, tenía un gran mapa de los Estados Unidos pegado en mi pared frente a mi cama. Cuando estaba aburrida, miraba ese mapa y pensaba en cosas. Cosas como el teorema de los cuatro colores, o qué estado limitaba con la mayoría de los otros estados. Para ahorrarme un poco de capacidad mental para contar, voy a inventar una máquina del tiempo y decirme cuántos estados bordean la entrada. Debido a que el tiempo es complicado, esto debe ser lo más corto posible.
La tarea
Dado uno de los 50 estados de EE. UU., Ya sea por su nombre completo o por su abreviatura postal, tal como se encuentra en esta página ( archive.org mirror ), devuelve el número de estados que limita. El siguiente es un mapeo de todas las entradas para nombres de estado completos al número de estados adyacentes, que se encuentran en este sitio web .
Missouri, Tennessee -> 8
Colorado, Kentucky -> 7
Arkansas, Idaho, Illinois, Iowa, Nebraska, New York, Oklahoma, Pennsylvania, South Dakota, Utah, Wyoming -> 6
Arizona, Georgia, Massachusetts, Michigan, Minnesota, Nevada, New Mexico, Ohio, Virginia, West Virginia -> 5
Alabama, Indiana, Kansas, Maryland, Mississippi, Montana, North Carolina, Oregon, Texas, Wisconsin -> 4
California, Connecticut, Delaware, Louisiana, New Hampshire, New Jersey, North Dakota, Rhode Island, Vermont -> 3
Florida, South Carolina, Washington -> 2
Maine -> 1
Alaska, Hawaii -> 0
Las normas
- Su programa puede manejar el nombre completo del estado o el código postal; no puede usar una combinación.
- Puede especificar el caso de la entrada, pero no puede eliminar espacios en blanco en la entrada.
- No tiene que manejar Washington, DC ni nada que no sea uno de los 50 estados.
- El número de estados delimitados no incluye el estado de entrada.
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
Si bien sé que puede ser quien tenga la mejor compresión o encuentre el mejor patrón de expresión regular por número, si obtengo demasiadas de esas respuestas, otorgaré una recompensa por una respuesta que genere un mapa de los EE. UU. Y la use para calcular el número de estados limítrofes.
inb4
Mathematica incorporadoRespuestas:
Gelatina ,
7365 bytesPruébalo en línea!
Construidos? ¿Quién los necesita? (
ʂÞiƬ
en el suelo con asco).Toma la entrada como nombre completo, como
"Idaho"
.Cómo funciona
fuente
OS%168
en cada uno de los estados, que directamente arrojó la lista. Encontré la constante 168 al forzar todas las posibilidades con menos de 250, verificando cada una de ellas para poder diferenciar realmente entre diferentes números de fronteras.168
funcionó (entre algunos otros) y tuvo el beneficio adicional de tener que codificar48
valores debido a colisiones.Mathematica,
112111 bytes-5 bytes gracias a Mark S. y LegionMammal978 !
-22 bytes (y notando un problema con la salida) gracias a ngenisis !
Por supuesto, hay un Mathematica incorporado para ello. Incluye DC en el recuento.
fuente
AdministrativeDivision
es tan increíblemente largo que guardaría un byte con Length [x = "AdministrativeDivision" ~ Entity ~ StringDelete [""] @ # ~ ToExpression [x <> "Data"] ~ "BorderingStates"] &ToExpression
puede ser reemplazado conSymbol
, si no recuerdo mal.AdministrativeDivisionData
, simplemente pase"BorderingStates"
como argumento a la entidad; por ejemploEntity["AdministrativeDivision","Alaska"]["BorderingStates"]
Tr[1^...]
en lugar deLength@...
guardar otro byte.JavaScript (ES6),
115113 bytesEditar: ahorró 2 bytes tomando prestadas 2 optimizaciones de cadena más de la respuesta de Step Hen Python . Los extrañé en mi intento inicial.
Toma códigos postales como entrada.
¿Cómo?
Un argumento no RegExp pasado al
.match()
método se convierte implícitamente en un objeto RegExp. Entonces, estamos probando la expresión regular/.\D*{{input}}/
en nuestra cadena codificada. Esto corresponde a un dígito (1) , seguido de 0 a N caracteres no dígitos, seguido de la entrada.Por ejemplo: si la entrada es
"NH"
(New Hampshire), la cadena coincidente será"3CACTNDELANH"
. Simplemente conservamos el primer carácter de esta cadena, o regresamos"6"
por defecto si no hubo coincidencia.(1): En
.
realidad, coincide con cualquier carácter, pero la cadena se construye de tal manera que lo que se encuentra antes de un grupo de letras siempre es un dígito.Manifestación
Mostrar fragmento de código
Versión hash, 115 bytes
Mismo formato de entrada.
Manifestación
Mostrar fragmento de código
fuente
Python 3 ,
168154153137 bytesPruébalo en línea!
-4 bytes gracias a isaacg
-10 bytes gracias a ETHProductions
-1 byte gracias a notjagen
Ahorró algunos bytes más por defecto a seis, como lo han hecho otras respuestas.
TIO incluye pruebas. Toma entrada como código postal. Genera una lista de los nombres de estado como cadenas para cada conjunto, comprimidos juntos donde sea posible (por ejemplo,
WVVA
se almacena comoWVA
). La función lambda obtiene el índice en la lista cuya cadena contiene la entrada. Puede haber una forma en que no sé sobre el golf, el cuerpo de la función. Salidas como una lista que contiene un entero: agregue[0]
al final de la lambda para generar como entero.fuente
l
una vez, por lo que también podría incluirlo en línea.V , 143 bytes
Pruébalo en línea!
Hexdump:
Escribí esto antes de darme cuenta de que podías tomar la entrada como códigos postales. No estoy seguro de si eso es realmente más corto o no
:shrug:
. Esta respuesta usa expresiones regulares para buscar ciertos estados y luego cambia la entrada a un cierto número si coincide. Sin embargo, a medida que aumenta el número de estados que hemos probado, la búsqueda más pequeña que podemos usar disminuye. Entonces, por ejemplo, no podemos buscarC
porque eso coincidiráColorado
yCalifornia
. (Además de Conneticut y The Carolinas) Sin embargo, una vez que hayamos probado todos los estados que tienen más de 3 límites, podemos buscar comienzos con C porque ya no puede coincidir con uno anterior.Algunos casos de prueba pueden estar equivocados ya que no tengo tiempo para probarlos todos. Avíseme si encuentra resultados incorrectos. :)
fuente
JavaScript, 153 bytes
Encadenamiento variable. Sin embargo, estoy seguro de que hay una mejor manera de hacerlo.
Gracias a una sugerencia de alguien de Discord, el resultado predeterminado es 6, el número más común de estados confinados. 183 bytes a 151 bytes.
Un comentarista señaló que esto falla para AK y HI, por lo que agregué dos bytes para solucionar el problema. 151 a 153 bytes.
fuente
AK
yHI
porque se0||6
evalúa en 6, que es una salida incorrecta.05AB1E ,
7872 bytesPruébalo en línea!
Esto SOLO funciona porque el orden de las abreviaturas de estado permite que NO se produzca ningún estado en la superposición entre estados:
Tardó un tiempo en lograr la disposición correcta ... Luego, al dividir la entrada y contar los espacios en la primera parte, obtenemos el resultado correcto.
Si robo el "valor predeterminado a 6" de las otras respuestas, obtengo 65 bytes:
05AB1E , 65 bytes
Pruébalo en línea!
fuente
Took awhile to get the arrangement right
-> oh, creo que podrías haberlo copiado de mi respuesta (si estoy leyendo esto correctamente)retina ,
106105bytesPruébalo en línea! ¿Alguien dijo regex? Editar: guardado 1 byte gracias a @Arnauld.
fuente
JavaScript (ES6), 195 bytes
Una serie de expresiones regulares, que funcionan en el nombre completo del estado.
Casos de prueba:
Mostrar fragmento de código
fuente
Jalea ,
6159 bytesUn programa completo que toma el nombre completo del estado e imprime el resultado (como un enlace monádico o devuelve una lista que contiene un solo número o el número 6).
Pruébalo en línea! o ver un conjunto de pruebas .
¿Cómo?
es una lista de listas de índices de páginas de códigos:
y se muestra a
“ ... ‘
continuación:fuente
Excel VBA,
177154147 BytesFunción VBE anónima que toma datos, del tipo esperado que
String
representa el código postal de un estado, del rango[A1]
, y devuelve unInteger
que representa el número de estados que bordean ese estado.Versión anterior
154 bytes:
177 bytes:
Formateado para facilitar la lectura
fuente
Python 2,
363218 bytesComencemos con la respuesta codificada
simpleligeramente optimizada. Toma el código postal como entrada.-145 bytes gracias a bfontaine.
fuente
dict(MO=8,TN=8,...)
lugar de{'MO':8,'TN':8,...}
. Luego puede guardar casi 50 bytes utilizando.get(a,6)
y eliminando aquellos estados que bordean otros 6 estados. Puedo llegar a 219 con esos dos trucos..
y haciendosplit()
(creo)dict((i[0]+i[1],int(i[-1])) for i in zip(*[iter("WA2WI4WV5FL2...")]*3))
. Además, probablemente podría dejar deint
lado eso si se le permite tener salida como una cadena.dict((a+b,int(c)) for a,b,c in zip(*[iter("WA2WI4WV5...")]*3))
. Lo siento, soy un poco indeciso: DPowerShell , 187 bytes
Pruébalo en línea!
Estoy seguro de que hay una mejor manera de hacer esto, pero este es el enfoque que se me ocurrió.
Toma datos
$a
y los usa para obtener.IndexOf
su ocurrencia en la larga cadena de combinaciones de estado / borde. Almacena eso$x
y la cadena$b
en el proceso. Luego entra en unaif
declaración que verifica si encontró una coincidencia, y si es así, indexe el dígito y luegoexit
. De lo contrario, somos uno de los6
estados oAK
oHI
, por lo que realizamos algo de lógica para ver si$a
es uno de los0
estados, y restamos si es necesario. En cualquier caso, eso queda en la tubería y la salida es implícita.fuente
Pitón 3, 729
733bytesToma datos como abreviatura postal. Este es mi primer intento en un desafío de golf, y este es el más corto que creo que puedo obtener con este enfoque infernal. Sé que es masivo. Ahora que lo pienso, probablemente hubiera sido mejor con
if-else
declaraciones, pero después de todo ese tiempo y esfuerzo tuve que publicarlo: D.Me acabo de dar cuenta de que me había dado el lujo de un nombre de variable de tres letras: ¡4 bytes menos, 400 por recorrer!
fuente