¿Cuántos estados limito?

20

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 , 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.

Stephen
fuente
11
inb4Mathematica incorporado
DJMcMayhem
@DJMcMayhem uh oh (suena bien al principio, pero mira la actualización ...)
Stephen
@StepHen ¡Oh no, me han expulsado! Estaba trabajando en la respuesta que ahora incorpora esto ...;)
notjagan
Relacionado
geokavel
¿Podemos manejar DC / incluirlo en nuestros recuentos si así lo deseamos?
notjagan

Respuestas:

17

Gelatina , 73 65 bytes

“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘i³OS%168¤$€Tµ’6L?

Prué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

“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘i³OS%168¤$€Tµ’6L?
“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘                   The literal list of code-page index lists  [[85, 91], [154], [33, 28, 50], [8, 143, 133, 93, 83, 116, 143, 125, 75], [167, 20, 105, 152, 5, 46, 20, 114, 13, 117], [52, 30, 40, 128, 102, 87, 103, 63, 153, 100], [147, 6], [19, 98]]
                           €        On each sublist:
                         ¤            Evaluate the hash value:
                 ³                     Input
                   O                   Character values
                    S                  Sum.
                     %                 Modulus.
                      168              168
                i                     Does the sublist contain that nilad?
                            T       Get the sublist which does contain that nilad.
                                 ?  If
                                L     Length.
                                    Then
                             ’        Return the index - 1
                                    Else
                              6      Return 6
fireflame241
fuente
¿Qué proceso usaste para obtener esa lista?
Scott Milner
2
@ScottMilner Ejecuté OS%168en 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. 168funcionó (entre algunos otros) y tuvo el beneficio adicional de tener que codificar 48valores debido a colisiones.
fireflame241
18

Mathematica, 112 111 bytes

-5 bytes gracias a Mark S. y LegionMammal978 !

-22 bytes (y notando un problema con la salida) gracias a ngenisis !

Tr[1^Entity["AdministrativeDivision",#~StringDelete~" "]@"BorderingStates"]+Boole@StringMatchQ[#,"Il*"|"Mic*"]&

Por supuesto, hay un Mathematica incorporado para ello. Incluye DC en el recuento.

notjagan
fuente
3
Esto se siente sucio, pero AdministrativeDivisiones tan increíblemente largo que guardaría un byte con Length [x = "AdministrativeDivision" ~ Entity ~ StringDelete [""] @ # ~ ToExpression [x <> "Data"] ~ "BorderingStates"] &
Mark S.
1
ToExpressionpuede ser reemplazado con Symbol, si no recuerdo mal.
LegionMammal978
1
Además, no necesita usar AdministrativeDivisionData, simplemente pase "BorderingStates"como argumento a la entidad; por ejemploEntity["AdministrativeDivision","Alaska"]["BorderingStates"]
ngenisis
1
@ngenisis Apliqué una solución al primer problema; Afortunadamente, debido a sus sugerencias, no agregó tantos bytes. El último problema que mencionó con respecto a DC no es un problema, ya que le pregunté a OP si esto era válido y la respuesta fue sí.
notjagan
1
@notjagan También puede usar Tr[1^...]en lugar de Length@...guardar otro byte.
ngenisis
13

JavaScript (ES6), 115 113 bytes

Editar: 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.

s=>('7KYCO8MOTN0AKHI1ME2FLSCWA3CACTNDELANHNJRIVT4ALWINCKSMDMSMTXOR5GAZOHMANMIMNVWVA'.match('.\\D*'+s)||'6')[0][0]

¿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


Versión hash, 115 bytes

Mismo formato de entrada.

s=>`04436303035050063062750600644408${6e7}503600300540410005207058036442600400000650035`[parseInt(s,33)%589%180%98]

Manifestación

Arnauld
fuente
Podrías ahorrar muchos bytes btoaing that String
Downgoat el
7

Python 3 , 168 154 153 137 bytes

lambda s:[i for i,S in enumerate('AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA A KYCO MOTN'.split())if s in S]or 6

Prué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, WVVAse almacena como WVA). 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.

Stephen
fuente
Además, solo lo usa luna vez, por lo que también podría incluirlo en línea.
isaacg
@ETHproductions sí, gracias
Stephen
@isaacg gracias, no sé por qué no vi eso
Stephen
-1 byte reorganizando la posición de Texas.
notjagan
@notjagan gracias, me perdí eso
Stephen
4

V , 143 bytes

çourüee/C8
çdoüke/C7
çrküI„sn]üebüOkünnsüSDüUüwy/C6
çzüg„ot]üttüinnüvaüxiüOh/C5
çbüdiüKüMáû5}üNCüOüTüWi/C4
ç^[CDLNRV]/C3
ç[FSW]/C2
çM/C1
ñlS0

Pruébalo en línea!

Hexdump:

00000000: e76f 7572 fc65 652f 4338 0ae7 646f fc6b  .our.ee/C8..do.k
00000010: 652f 4337 0ae7 726b fc49 8473 6e5d fc65  e/C7..rk.I.sn].e
00000020: 62fc 4f6b fc6e 6e73 fc53 8144 fc55 fc77  b.Ok.nns.S.D.U.w
00000030: 792f 4336 0ae7 7afc 6784 6f74 5dfc 7474  y/C6..z.g.ot].tt
00000040: fc69 6e6e fc76 61fc 7869 fc4f 682f 4335  .inn.va.xi.Oh/C5
00000050: 0ae7 62fc 6469 fc4b fc4d e1fb 357d fc4e  ..b.di.K.M..5}.N
00000060: 8143 fc4f fc54 fc57 692f 4334 0ae7 5e5b  .C.O.T.Wi/C4..^[
00000070: 4344 4c4e 5256 5d2f 4333 0ae7 5b46 5357  CDLNRV]/C3..[FSW
00000080: 5d2f 4332 0ae7 4d2f 4331 0af1 6c53 30    ]/C2..M/C1..lS0

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 buscar Cporque eso coincidirá Coloradoy California. (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. :)

DJMcMayhem
fuente
3

JavaScript, 153 bytes

MO=TN=8;CO=KY=7;AZ=GA=MA=MI=MN=NV=NM=OH=VA=WV=5;AL=IN=KS=MD=MS=MT=NC=OR=TX=WI=4;CT=DE=LA=NH=NJ=ND=RI=VT=3;FL=WA=2;ME=1;AK=HI="0";alert(self[prompt()]||6)

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.

Eli Richardson
fuente
1
Estoy bastante seguro de que esto falla AKy HIporque se 0||6evalúa en 6, que es una salida incorrecta.
kamoroso94
@ kamoroso94 He actualizado mi código, si crees que hay una solución mejor, házmelo saber.
Eli Richardson
3

05AB1E , 78 72 bytes

.•n£þuγ{çâ/₁=èó[nK™ΩFîÀî˜Çʒ÷¿ηZ¬³ã®ÿΣÔ¢*5ŠÜ‚!¶Ö¾#}ê(Ûø‰¢þL[Æ₁cgIkö•s¡¬ð¢

Pruébalo en línea!


.•n£þuγ{çâ/₁=èó[nK™ΩFîÀî˜Çʒ÷¿ηZ¬³ã®ÿΣÔ¢*5ŠÜ‚!¶Ö¾#}ê(Ûø‰¢þL[Æ₁cgIkö•
# Push the string: akhi me flscwa cactdelanhnjndrivt alinksmdmsncmtortxwi azgamamimnnvnmvaohwv idilianarenyokpnsdutwy kyco motn

s¡    # Split on input.
  ¬   # Get head.
   ð¢ # Count number of spaces.

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:

a[kh]i 
me 
f[ls][cw]a 
c[ac][td][el][an][hn][jn][dr][iv]t 
a[li][nk][sm][dm][sn][cm][to][rt][xw]i 
a[zg][am][am][im][nn][vn][mv][ao][hw]v 
i[di][li][an][ar][en][yo][kp][ns][du][tw]y 
k[yc]o 
m[ot]n

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

.•3θ0ÔÕ—ú^?D§:‚A†ǝλα“i›p‚ιCöΔƒñPŠ J€ŽãB»ΣUƤÆuhÃgŠ¦,Y²•s¡¬ð¢D9Qi6

Pruébalo en línea!

Urna de pulpo mágico
fuente
Took awhile to get the arrangement right-> oh, creo que podrías haberlo copiado de mi respuesta (si estoy leyendo esto correctamente)
Stephen
@Stephen Bueno, no obtuve la idea de ninguna otra publicación, si nos fijamos en el "algoritmo de hashing sucky" estaba jugando con ideas aleatorias para hashing durante una hora, luego pensé en los espacios, descubrí que no podía supera esa implementación sin importar cuánto lo intente.
Urna de pulpo mágico
@Stephen ahora que leí el tuyo, desearía haber pensado también en el valor predeterminado de 6 xD.
Urna mágica de pulpo
1
No lo pensé, lo vi primero en esta respuesta , así que siéntase libre de tomarlo: P
Stephen
2

retina , 106105 bytes

MO|TN
8
CO|KY
7
AK|HI
0
ME
1
FL|WA
2
[CDLR].|N[HJD]|VT
3
.[CSX]|AL|IN|MD|MT|OR|WI
4
[GMV].|.[HMVZ]
5
..
6

Pruébalo en línea! ¿Alguien dijo regex? Editar: guardado 1 byte gracias a @Arnauld.

Neil
fuente
2

JavaScript (ES6), 195 bytes

s=>/las|ii/[t='test'](s)?0:/ai/[t](s)?1:/Fl|Wa|S.*C/[t](s)?2:/fo|ct|de|ui|mp|er|^N.+ak/i[t](s)?3:/do|ck/[t](s)?7:/ur|ee/[t](s)?8:/iz|gi|ch|ev|xi|hi|es/[t](s)?5:/rk|ah|oi|ow|br|om|lv|ak/[t](s)?6:4

Una serie de expresiones regulares, que funcionan en el nombre completo del estado.

Casos de prueba:

Rick Hitchcock
fuente
2

Jalea ,  61  59 bytes

OP%⁽/r%101eЀ“¿=“þ“(7“¡¦ðø,0@L“€ç÷<CMZa“Ø!)5HNV““1^“¥+‘Tȯ7’

Un 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?

“¿=“þ“(7“¡¦ðø,0@L“€ç÷<CMZa“Ø!)5HNV““1^“¥+‘

es una lista de listas de índices de páginas de códigos:

[[11,61],[31],[40,55],[0,5,24,29,44,48,64,76],[12,23,28,60,67,77,90,97],[18,33,41,53,72,78,86],[],[49,94],[4,43]]

y se muestra a “ ... ‘continuación:

OP%⁽/r%101eЀ“ ... ‘Tȯ7’ - Main link: list of characters, stateName  e.g. Ohio
O                        - cast to ordinals                   [79,104,105,111]
 P                       - product                                    95757480
   ⁽/r                   - base 250 literal                              12865
  %                      - modulo by 12865                                3285
      %101               - modulo by 101                                    53
             “ ... ‘     - list of lists of code-page indices
          eЀ            - map: exists in?                 [0,0,0,0,0,1,0,0,0]
                    T    - truthy indices (if none yields an empty list)   [6]
                     ȯ7  - logical or with 7 (replace empty list with 7)   [6]
                       ’ - decrement                                       [5]
                         - implicit print (Jelly's representation of a list of
                         -                 one item is just that item)       5
Jonathan Allan
fuente
1

Excel VBA, 177 154 147 Bytes

Función VBE anónima que toma datos, del tipo esperado que Stringrepresenta el código postal de un estado, del rango [A1], y devuelve un Integerque representa el número de estados que bordean ese estado.

For i=0To 8:r=r+IIf(Instr(1,Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN")(i),[A1]),i,0):Next:?IIf(r,r,6)

Versión anterior

154 bytes:

For Each s in Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN"):r=r+IIf(Instr(1,s,[A1]),i,0):i=i+1:Next:?IIf(r,r,6)

177 bytes:

[2:2]=Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA A KYCO MOTN"):[3:3]="=IfError(If(Find($A1,A2),Column(A3)),"""")":[B1]="=Sum(3:3)":?[If(B1,B1,6)]

Formateado para facilitar la lectura

[2:2]=Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN")
[3:3]="=IfError(If(Find($A1,A2),Column(A3)-1),"""")"
[B1]="=Sum(3:3)"
?[If(B1,B1,6)]
Taylor Scott
fuente
1

Python 2, 363 218 bytes

lambda a:dict(WA=2,WI=4,WV=5,FL=2,NH=3,NJ=3,NM=5,NC=4,ND=3,RI=3,NV=5,CO=7,CA=3,GA=5,CT=3,OH=5,KS=4,SC=2,KY=7,OR=4,DE=3,HI=0,TX=4,LA=3,TN=8,VA=5,AK=0,AL=4,VT=3,IN=4,AZ=5,ME=1,MD=4,MA=5,MO=8,MN=5,MI=5,MT=4,MS=4).get(a,6)

Comencemos con la respuesta codificada simple ligeramente optimizada. Toma el código postal como entrada.

-145 bytes gracias a bfontaine.

pppery
fuente
44
Puede guardar casi 100 bytes utilizando en 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.
bfontaine
@Mitch ahorra un poco más usando el espacio en lugar de .y haciendo split()(creo)
Stephen
@ Mitch, ¿necesitas los períodos? ¿Hay algún método para dividir una lista en grupos de 2?
Urna mágica de pulpo
Creo que puede guardar algunos bytes más usando dict((i[0]+i[1],int(i[-1])) for i in zip(*[iter("WA2WI4WV5FL2...")]*3)). Además, probablemente podría dejar de intlado eso si se le permite tener salida como una cadena.
Izaak van Dongen
En realidad, si usa desempacar, podría hacerlo dict((a+b,int(c)) for a,b,c in zip(*[iter("WA2WI4WV5...")]*3)). Lo siento, soy un poco indeciso: D
Izaak van Dongen
1

PowerShell , 187 bytes

param($a)$x=($b=" MO8TN8CO7KY7AZ5GA5MA5MI5MN5NV5NM5OH5VA5WV5AL4IN4KS4MD4MS4MT4NC4OR4TX4WI4CA3CT3DE3LA3NH3NJ3ND3RI3VT3FL2SC2WA2ME1").IndexOf($a);if($x+1){$b[$x+2];exit}6-6*($a-in'AK','HI')

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 $ay los usa para obtener .IndexOfsu ocurrencia en la larga cadena de combinaciones de estado / borde. Almacena eso $xy la cadena $ben el proceso. Luego entra en una ifdeclaración que verifica si encontró una coincidencia, y si es así, indexe el dígito y luego exit. De lo contrario, somos uno de los 6estados o AKo HI, por lo que realizamos algo de lógica para ver si $aes uno de los 0estados, y restamos si es necesario. En cualquier caso, eso queda en la tubería y la salida es implícita.

AdmBorkBork
fuente
1

Pitón 3, 729 733 bytes

Toma 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-elsedeclaraciones, pero después de todo ese tiempo y esfuerzo tuve que publicarlo: D.

lambda s:sum((i-32)*96**j for j,i in enumerate(b'`*g$<#?wP\\.=)kuDbk$yvv\\D:Nh:cd/Pj, e*[_yXGz6lR<$jMo0qUU*7(Dua3-ThO}iX6VWRYDv=<K$8mVbYK9ld);TFB/m\'NE3ow4./pUsI5yJrwYrM4@e6\\kHJ%q8NA3>fb!~-rtwsRW=RBni}Y7T^gD\\IoxzJf.%|1.&4*"$%Q+).|8p(vcJ]cLRGUyC2eF:<Q4!_)y\\<`tr2A[z7re6OaR["2PRv\x7f,bRE [XrvtA<R<UlS23on?Byym&uy{XuB\x7fIMfh<y&waHElg-vk:4*on\x7f@?Ai5=2swfZSBF.PjkL{,|=,M<Bw"w,e@f`aKnmh\'xgg1#b4En\x7f+*\'g_ZRoeN*Q]mX\'>RoGc~ZP~e&{Hwo6bd<](hV)=l9#[f<Gj,#Ea!nJnL=9k"M,`bP2PsP6(eJoGEU>GA?,BpS}"RzzdMRtL[cre;\\tld^xT\':pry\'Nu_*R}eYg_U!Ld{p7<f:95lD]OBMX(r"Jg\'|%Cq"`Qy9g0aNrtYP9dnPRRr3\'yT(CE~\\&@5#tMLZ+a:V5NNXVp+Uy61s9$=Vb99(!ga7f7x}#=*]q.\x7f0R+f[*m:i^qe#D 8M&W\x7faGmCNCU9"~1Pj!]2r5 H>rYPqwfg4cFG*3-(z'))>>(5*int(s,36)-1850)&15

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!

Izaak van Dongen
fuente
Bienvenido a PPCG! A veces, las soluciones más simples son más cortas, como lo muestran las otras respuestas de Python: P
Stephen
Sí, me encanta todo el esfuerzo que pones en esto, considerando que tu placer culpable es "hacer que tu código sea tan conciso que sea ilegible", encajarás perfectamente.
Zacharý