Quand j'étais plus jeune, j'avais une grande carte des États-Unis collée sur mon mur en face de mon lit. Quand je m'ennuyais, je regardais cette carte et pensais à des trucs. Des trucs comme le théorème des quatre couleurs, ou quel état borde la plupart des autres états. Pour m'économiser plus jeune, je vais inventer une machine à remonter le temps et me dire combien d'États bordent l'entrée. Parce que le temps est capricieux, cela doit être aussi court que possible.
La tâche
Étant donné l'un des 50 États américains, soit par son nom complet, soit par son abréviation postale, comme indiqué sur cette page ( miroir archive.org ), renvoyez le nombre d'États qu'il borde. Ce qui suit est un mappage de toutes les entrées pour les noms d'états complets avec le nombre d'états adjacents, trouvés sur ce site 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
Les règles
- Votre programme peut gérer le nom complet de l'État ou le code postal - il ne peut pas utiliser une combinaison.
- Vous pouvez spécifier la casse de l'entrée, mais vous ne pouvez pas supprimer d'espaces dans l'entrée.
- Vous n'avez pas à gérer Washington, DC ou tout ce qui ne fait pas partie des 50 États.
- Le nombre d'états bordés n'inclut pas l'état d'entrée.
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Bien que je sache que c'est peut-être celui qui a la meilleure compression ou qui trouve le meilleur motif d'expression régulière par nombre, si j'obtiens trop de ces réponses, j'attribuerai une prime à une réponse qui génère une carte des États-Unis et l'utilise pour calculer le nombre d'États limitrophes.
inb4
Mathematica Built-inRéponses:
Gelée ,
7365 octetsEssayez-le en ligne!
Builtins? Qui en a besoin? (
ʂÞiƬ
sur le terrain avec dégoût).Prend l'entrée comme nom complet, tel que
"Idaho"
.Comment ça fonctionne
la source
OS%168
sur chacun des états, ce qui a donné directement la liste. J'ai trouvé la constante 168 en forçant brutalement toutes les possibilités à moins de 250, en vérifiant chacune d'elles pour pouvoir réellement différencier différents nombres de frontières.168
travaillé (parmi quelques autres) et avait l'avantage supplémentaire de n'avoir à coder en dur que les48
valeurs en raison de collisions.Mathematica,
112111 octets-5 octets grâce à Mark S. et LegionMammal978 !
-22 octets (et constat d'un problème de sortie) grâce à ngenisis !
Bien sûr, il y a un Mathematica intégré pour cela. Inclut DC dans le décompte.
la source
AdministrativeDivision
est si incroyablement long que vous enregistrez un octet avec la longueur [x = "AdministrativeDivision" ~ Entity ~ StringDelete [""] @ # ~ ToExpression [x <> "Data"] ~ "BorderingStates"] &ToExpression
peut être remplacé parSymbol
, si je me souviens bien.AdministrativeDivisionData
, passez simplement"BorderingStates"
comme argument à l'entité; par exempleEntity["AdministrativeDivision","Alaska"]["BorderingStates"]
Tr[1^...]
à la place deLength@...
pour enregistrer un autre octet.JavaScript (ES6),
115113 bytesEdit: enregistré 2 octets en empruntant 2 optimisations de chaîne supplémentaires à la réponse Step Hen Python . Je les ai ratés lors de ma première tentative.
Prend les codes postaux en entrée.
Comment?
Un argument non RegExp passé à la
.match()
méthode est implicitement converti en objet RegExp. Nous testons donc l'expression régulière/.\D*{{input}}/
sur notre chaîne codée. Cela correspond à un chiffre (1) , suivi de 0 à N caractères non numériques, suivi de l'entrée.Par exemple: si l'entrée est
"NH"
(New Hampshire), la chaîne correspondante sera"3CACTNDELANH"
. Nous gardons simplement le premier caractère de cette chaîne, ou retournons"6"
par défaut s'il n'y a pas de correspondance.(1): Le
.
correspond à n'importe quel caractère, mais la chaîne est construite de telle manière que ce qui est trouvé avant un groupe de lettres est toujours un chiffre.Démo
Afficher l'extrait de code
Version de hachage, 115 octets
Même format d'entrée.
Démo
Afficher l'extrait de code
la source
Python 3 ,
168154 154153137 octetsEssayez-le en ligne!
-4 octets grâce à isaacg
-10 octets grâce à ETHProductions
-1 octet grâce à notjagen
Enregistré quelques octets supplémentaires par défaut à six, comme d'autres réponses l'ont fait.
TIO comprend des tests. Prend l'entrée comme code postal. Génère une liste des noms d'état sous forme de chaînes pour chaque ensemble, regroupés si possible (par exemple,
WVVA
sont stockés sousWVA
). La fonction lambda obtient l'index dans la liste dont la chaîne contient l'entrée. Il y a peut-être un moyen que je ne connais pas au golf le corps de la fonction. Sorties en tant que liste contenant un entier - ajoutez[0]
à la fin du lambda pour sortir en entier.la source
l
qu'une seule fois, vous pouvez donc aussi bien l'intégrer.V , 143 octets
Essayez-le en ligne!
Hexdump:
J'ai écrit ceci avant de réaliser que vous pouviez prendre l'entrée comme code postal. Je ne sais pas si c'est réellement plus court ou non
:shrug:
. Cette réponse utilise l'expression régulière pour rechercher certains états, puis modifiez l'entrée à un certain nombre si elle correspond. Cependant, à mesure que le nombre d'états contre lesquels nous testons augmente, la plus petite recherche que nous pouvons utiliser diminue. Ainsi, par exemple, nous ne pouvons pas rechercherC
car cela correspondra àColorado
etCalifornia
. (Ainsi que Conneticut et The Carolinas) Cependant, une fois que nous avons testé pour chaque état qui a plus de 3 frontières, nous pouvons simplement rechercher des débuts avec C car il ne peut plus correspondre à un précédent.Quelques cas de test peuvent être erronés car je n'ai pas le temps de les tester tous. Faites-moi savoir si vous trouvez des sorties incorrectes. :)
la source
JavaScript, 153 octets
Chaînage variable. Je suis sûr qu'il existe cependant une meilleure façon de procéder.
Grâce à une suggestion de quelqu'un de Discord, la sortie par défaut est 6, le nombre le plus commun d'états bordés. 183 octets à 151 octets.
Un commentateur a souligné que cela échoue pour AK et HI, j'ai donc ajouté deux octets pour résoudre le problème. 151 à 153 octets.
la source
AK
etHI
parce qu'il est0||6
évalué à 6, ce qui est une sortie incorrecte.05AB1E ,
7872 octetsEssayez-le en ligne!
Cela fonctionne UNIQUEMENT parce que l'ordre des abréviations d'état permet qu'aucun état ne se produise dans le chevauchement entre les états:
Il a fallu un certain temps pour obtenir la bonne disposition ... Ensuite, en divisant l'entrée et en comptant les espaces dans la première partie, nous obtenons le résultat correct.
Si je vole le "défaut à 6" des autres réponses, j'obtiens 65 octets:
05AB1E , 65 octets
Essayez-le en ligne!
la source
Took awhile to get the arrangement right
-> oh, je pense que vous auriez pu le copier de ma réponse (si je lis bien)Rétine ,
106105 octetsEssayez-le en ligne! Quelqu'un a-t-il dit regex? Edit: 1 octet enregistré grâce à @Arnauld.
la source
JavaScript (ES6), 195 octets
Une série d'expressions régulières, qui fonctionnent sur le nom complet de l'État.
Cas de test:
Afficher l'extrait de code
la source
Gelée ,
6159 octetsUn programme complet prenant le nom complet de l'état et imprimant le résultat (en tant que lien monadique, il renvoie soit une liste contenant un seul numéro, soit le numéro 6).
Essayez-le en ligne! ou voir une suite de tests .
Comment?
est une liste de listes d'index de pages de codes:
et est représenté
“ ... ‘
ci-dessous:la source
Excel VBA,
177154147 octetsFonction VBE anonyme qui prend une entrée, du type attendu
String
représentant le code postal d'un état, à partir de la plage[A1]
, et retourne unInteger
qui représente le nombre d'états qui bordent cet état.Versions précédentes
154 octets:
177 octets:
Formaté pour la lisibilité
la source
Python 2,
363218octetsCommençons par la réponse codée en dur
simple etlégèrement optimisée. Prend le code postal comme entrée.-145 octets grâce à bfontaine.
la source
dict(MO=8,TN=8,...)
au lieu de{'MO':8,'TN':8,...}
. Vous pouvez ensuite enregistrer près de 50 octets en utilisant.get(a,6)
et en supprimant les états qui bordent 6 autres états. Je suis capable de descendre à 219 avec ces deux astuces..
et en faisantsplit()
(je pense)dict((i[0]+i[1],int(i[-1])) for i in zip(*[iter("WA2WI4WV5FL2...")]*3))
. Vous pouvez également laisserint
cela de côté s'il est autorisé à avoir une sortie sous forme de chaîne.dict((a+b,int(c)) for a,b,c in zip(*[iter("WA2WI4WV5...")]*3))
. Désolé, je suis un peu indécis: DPowerShell , 187 octets
Essayez-le en ligne!
Je suis sûr qu'il existe une meilleure façon de procéder, mais voici l'approche que j'ai trouvée.
Prend l'entrée
$a
et l'utilise pour obtenir.IndexOf
son occurrence dans la longue chaîne de combinaisons état / bordure. Stocke cela dans$x
et la chaîne dans$b
le processus. Entre ensuite dans uneif
instruction qui vérifie s'il a trouvé une correspondance, et si oui, indexez le chiffre, puisexit
. Sinon, nous sommes l'un des6
états ouAK
ouHI
, nous effectuons donc une certaine logique pour voir s'il$a
s'agit de l'un des0
états et soustrayons si nécessaire. Dans tous les cas, cela reste sur le pipeline et la sortie est implicite.la source
Python 3, 729
733octetsPrend l'entrée comme abréviation postale. C'est ma première tentative de défi de golf, et c'est à peu près le plus court que je pense pouvoir obtenir avec cette approche infernale. Je sais que c'est énorme - à bien y penser, j'aurais probablement été mieux avec des
if-else
déclarations, mais après tout ce temps et ces efforts, j'ai dû le poster: D.Je viens de réaliser que j'avais pris le luxe d'un nom de variable à trois lettres - 4 octets vers le bas, 400 à parcourir!
la source