En sélectionnant l’un des 50 noms d’ États américains à gauche, indiquez son code postal à deux lettres comme indiqué à droite:
Alabama AL
Alaska AK
Arizona AZ
Arkansas AR
California CA
Colorado CO
Connecticut CT
Delaware DE
Florida FL
Georgia GA
Hawaii HI
Idaho ID
Illinois IL
Indiana IN
Iowa IA
Kansas KS
Kentucky KY
Louisiana LA
Maine ME
Maryland MD
Massachusetts MA
Michigan MI
Minnesota MN
Mississippi MS
Missouri MO
Montana MT
Nebraska NE
Nevada NV
New Hampshire NH
New Jersey NJ
New Mexico NM
New York NY
North Carolina NC
North Dakota ND
Ohio OH
Oklahoma OK
Oregon OR
Pennsylvania PA
Rhode Island RI
South Carolina SC
South Dakota SD
Tennessee TN
Texas TX
Utah UT
Vermont VT
Virginia VA
Washington WA
West Virginia WV
Wisconsin WI
Wyoming WY
Règles
- L'entrée et la sortie sont sensibles à la casse. Vous ne pouvez pas sortir beaucoup, par exemple,
Al
pourAlabama
. - Vous pouvez supposer que l'entrée est l'un des 50 noms d'états indiqués ci-dessus.
- Vous ne pouvez pas accéder à Internet ou utiliser des données d'état intégrées (Mathematica vous regarde).
Vous pouvez trouver des listes séparées d’entrées et de sorties dans cet extrait (veuillez ne pas l’exécuter, c’est juste pour compresser le post):
(Non-marquant) Points Brownie si vous pouvez également prendre District of Columbia
en entrée et produire DC
, Iles Vierges, etc. etc.
Notation
C'est du code-golf , donc le code le plus court en octets dans chaque langue gagne .
(Initialement proposé par ETHProductions)
code-golf
string
kolmogorov-complexity
state-abbreviation
Steve Bennett
la source
la source
Entity[a="AdministrativeDivision",{#,"UnitedStates"}]@EntityProperty[a,"StateAbbreviation"]&
20
octets:Entity["AdministrativeDivision",{#,"UnitedStates"}]@"StateAbbreviation"&
:)Réponses:
Javascript,
124117 octets(sauvé 7 octets grâce à hvd)
Explication:
la source
[A-Z]
n'est pas nécessaire car l'entrée est connue pour être valide. Le cas particulier de l'Iowa peut être abrégé[AFIOUW][^o]
pour l'exclure, le laissant pour la finale.+
.s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|Te.|.+/.exec(s)[0].slice(-1).toUpperCase()
Peut-on arriver à 100? :)Javascript,
13713513413211311010810199949392 octetsCeci est basé sur la solution HP Williams, avec quelques améliorations en dehors de la regex et quelques ajustements en son sein.
(Linebreaks pour la lisibilité seulement)
Commentaire pour la regex:
Regex alternative inutile (même longueur):
Histoire
94
99
101
108
110
113
132
134
135
137
la source
...s.s?
captures du Mississippi, du Missouri, du Massachussetts et de l'Alaska) par accident. J'étais en train de déplacer le.*sk
fragment à un autre endroit, et les tests ont tout simplement fonctionné et réussi, alors que le fragment n'était présent nulle part. Plus facile gain de 5 caractères jamais!...s.s?
correspond aussi par inadvertance au Kansas et donne toujours, par miracle, le bon résultat.M[onti]+
. Tellement bizarre: si l’état commence par M, alors la deuxième lettre est la dernière d’une séquence d’au moins un o, n, t ou i. Une façon très étrange de capturer Michican, Minnesota ou Montana.JavaScript (ES6),
156136 octetsDémo
Afficher l'extrait de code
la source
X MOD[50-1000] MOD[50-1000] MOD[50-100]
. Mais.slice(1)
c'était une erreur. Actuellement en cours d'exécution sur toute la chaîne.Gelée , 75 octets
Essayez-le en ligne!
... ou voir une suite de tests - Notez qu'un petit changement a dû être fait pour exécuter le programme complet pour plusieurs entrées en une fois (j'ai échangé l'atome d'entrée du programme
³
, pour un rappel du registre®
, un et définir le registre à chaque nom d’état).Comment?
Calcule l'index à utiliser pour le deuxième caractère du code postal, l'ajoute au premier caractère et met en majuscule le résultat.
Trouve d’abord l’index d’un caractère espace (ou 0 si non trouvé);
Sinon vérifie s'il s'agit de l'Alaska ou du Missouri (en rapportant 5 pour
k
ouo
);Else trouve l'index de l'état d'entrée dans la liste
Arizona Minnesota Mississippi Nevada Montana Texas Tennessee
(ou 0 s'il n'est pas trouvé) - si c'est le cas, il prend cet index mod 2 plus 3 (pourz n s v t x n
);Else convertit la chaîne en ordinaux, convertit celle de la base 256, trouve le reste de celle-ci après l'avoir divisé par 29487, trouve le reste de celle-ci après la division par 14 et l'utilise pour l'indexation dans la représentation binaire de 9620 et double le résultat - 0 pour les États qui utilisent leur dernière lettre et 2 pour ceux qui utilisent leur deuxième lettre.
Tous les cas sauf le tout premier sont incrémentés et la valeur résultante est décrémentée (en augmentant l'index d'espace trouvé de un).
la source
Python 2 , 191 octets
Essayez-le en ligne!
Utilise une simple fonction de hachage pour trouver le deuxième caractère de l'abréviation.
la source
Python 2,
9490 octetsEssayez-le en ligne
(Uniquement Python 2 car les hachages Python 3 ne sont pas stables et vous ne pouvez pas hacher une chaîne sans la transformer en octets.)
Fonctionne avec les 50 états, plus en prime District de Columbia et Porto Rico.
Il serait possible d'enregistrer un octet en écrivant le numéro dans la base-36:
int("5clu7x0aixb0pelmpugv5iiibphrpf",36)
.J'attends de voir si je peux penser à une solution plus créative.Mise à jour:
Puisqu'il y a 12 positions de chiffres inutilisées dans le hachage, il y a 2 36 nombres possibles qui fonctionneront. Il semblait raisonnable de croire que l'un d'entre eux aurait un facteur primordial avec un exposant important. Pour un nombre premier et un exposant donnés, trouver une valeur est assez rapide; J'ai réussi à en trouver un avec un facteur de 19 à 9 , réduisant la taille de l'expression nécessaire pour représenter le nombre par quatre octets.
Ceci est fondamentalement la même procédure que ma réponse C mais en utilisant Python. Comme la fonction de hachage de base est différente, je devais trouver une fonction de réduction différente, qui s’avère être le mod 52 au lieu du mod 54. Mais les économies les plus importantes par rapport à C proviennent de la possibilité d’utiliser bignums pour coder le vecteur, et bien sûr. le fait que la norme pour Python semble être qu'il est correct d'utiliser un littéral lambda au lieu d'un programme complet.
la source
Retina ,
1138180777068 octetsEssayez-le en ligne! Comprend les 51 cas de test. Sauvegardé 32 octets en s'appropriant le regex de @ JörgHülsermann qui trouve la deuxième lettre (avec un tweak pour supporter DC; edit: sauvegardé 1 octet grâce à @ JörgHülsermann). Sauvegardé de 3 octets en basculant dans la regex @ SteveBennett de son commentaire à la réponse @ HPWilliam. Sauvé
79 octets merci encore à @SteveBennett. Les autres lettres sont ensuite supprimées et la chaîne mise en majuscule.la source
e
était le plus gênant, vraiment.d
. (Vous voudrez peut-être utiliser des tests automatiques - j'ai un script qui vérifie en permanence les 50 cas.)PHP> = 7.1, 113 octets
Version en ligne
Les frappes sont identiques lors d'un match précédent avant
([vxz])
correspond à Arizona, Nevada,Nouveau Mexique,Pennsylvanie,Texas,(.)
(une case avant) correspond aux New Hampshire, New Jersey, Nouveau-Mexique, New York, Caroline du Nord, Dakota du Nord, Rhode Island, Caroline du Sud, Dakota du Sud, Virginie de l'Ouest[CGHKLPV].*(.)
matchs Californie, Colorado, Connecticut, Géorgie, Hawaii, Kansas, Kentucky, Louisiane,New Hampshire,Caroline du Nord,Pennsylvanie,Caroline du Sud, Vermont, Virginie,Virginie de l'Ouestow(a)
correspondre à l'Iowalas(k)
correspondre à l'Alaskassi?(.)
matchs Massachusetts, Mississippi, Missouri,Tennesseen(n|t|[de]$)
matchs duConnecticut, duKentucky, duMaine, du Maryland, du Minnesota, du Montana, de laPennsylvanie, duRhode Island, duTennessee et duVermontAucune correspondance pour ces états, nous prenons donc les deux premières lettres Alabama, Arkansas, Delaware, Floride, Idaho, Illinois, Indiana, Michigan, Nebraska, Ohio, Oklahoma, Oregon, Utah, Washington, Wisconsin, Wyoming
La première fois que je me sers de ce Regex Subpatter
?|
avec permet de stocker les références arrières en un.Soutenir le district de Columbia
Remplacer
(.)
par([^o])
+3 octetsEssayez-le en ligne!
PHP, 150 octets
Essayez-le en ligne! Testcases
la source
n|t|
octet n'est-il pas plus court que[nt]|
?PHP,
887854 octetsEssayez-le en ligne!
Première minuterie, hourra!
la source
$argv[1]
est remplacé par$argn
sandbox.onlinephpfunctions.com/code/…php
!C,
945937718711660616 octets219 octets enregistrés grâce à ASCII uniquement.
Newline inutile, uniquement à des fins d'affichage. Prend l'état en entrée. Essayez-le en ligne!
Comment ça fonctionne:
struct{int*a,b;}m[]=...
déclare une cartem
avec deux valeurs - une chaîne de quatre octets et un caractère. Ceci est utilisé dans la boucle de comparaison, qui compare les deuxième au cinquième index dechar*a
la carte.gets(b)
lit une chaîneb
. Ce sera l'état à abréger.putchar(*b)
affiche le premier caractère de cette chaîne, puisque chaque abréviation commence par la première lettre de l'état.for(;m[i].a;i++)
parcourt chaque valeur de la carte. (Cela pourrait être raccourci.)if(!strncmp(m[i].a,b+1,4))
compare la valeur actuelle de la carte aux deuxième au cinquième caractères deb
(l'état à abréger). En effet, les seules différences concernent les cinq premiers caractères, mais nous avons déjà imprimé le premier caractère.puts(&m[i].b);
affiche la seconde lettre de l’abréviation (si le nom de l’état correspond à la valeur actuelle de la carte) et une nouvelle ligne.la source
C,
148141 octets*(int*)(s+1)
considère que le deuxième au cinquième caractère de l'entrée est un entier; cet entier est ensuite haché en 0-56 en utilisant le hachagei%663694%57
. La valeur hachée est ensuite recherchée dans un vecteur de décalages qui représente l'emplacement de la seconde lettre de l'abréviation. J'ai choisi ces quatre octets particuliers car (1) le cinquième caractère est différent du Missouri et du Mississippi, et (2) certains États n'ont que quatre caractères. En C, vous pouvez utiliser l'octet de terminaison NUL, mais rien de plus n'est fiable. (Cela hache les deux nord à la même valeur, ainsi que les deux sud. Mais cela n'a pas d'importance, car le décalage associé est de 6 pour toutes ces choses.)En l’occurrence, ce hachage donne la position correcte pour les secondes lettres des abréviations de District de Columbia, de Porto Rico et de "Virgin Islands" (tapées de cette manière, et non comme "US Virgin Islands", caractère de l’abréviation soit le premier caractère du nom).
Les constantes 663694 et 57 ont été trouvées avec un test automatisé; 57 était la plus petite plage de hachage que j'ai trouvée. (La première version utilisait 380085 et 63, mais lorsque j'ai élargi la plage de test, j'ai trouvé le nouveau.) Il semble qu'un hachage légèrement plus petit existe si un code est ajouté pour "utiliser le dernier caractère du nom"; malheureusement, la syntaxe C pour sélectionner le dernier caractère est trop verbeuse pour rendre cela utile.
Il n'y a que 8 décalages différents, ils pourraient donc être stockés dans une table de consultation de 171 bits (3 * 57) avec trois bits par entrée. Mais je ne pouvais pas penser à un moyen d'insérer ces bits efficacement dans le programme. Le codage hexadécimal nécessiterait environ un caractère sur quatre bits, plus les
0x
préfixes. Je ne pouvais pas faire mieux que 151 octets, ce qui est beaucoup plus long que la version chaîne. Si les 171 bits pouvaient être insérés en tant qu'octets bruts, ils occuperaient 22 octets. Il pourrait donc y avoir une solution, mais la lecture d'un fichier est fastidieuse.la source
En fait , 181 octets
Cette solution attend une entrée sous forme de chaîne entre guillemets.
Essayez-le en ligne!
Explication
Cette solution utilise la même stratégie de hachage que ma solution Python 3 . Par souci de brièveté, je vais omettre l'explication de la manière dont le hachage est calculé et de la raison de son choix (allez lire l'autre réponse si vous voulez ce bit).
Aussi, par souci de brièveté, je vais laisser de côté le contenu des très longues chaînes, car sinon l'explication serait illisible.
la source
Python 3 , 230 octets
Essayez-le en ligne!
L'entrée est attendue sous la forme d'un objet octet (une chaîne d'octets plutôt qu'une chaîne Unicode).
Merci à Johnathon Allan pour une quantité absurde d'octets
Explication
Chaque nom d'état est haché en un entier
a
en appliquant le hachagea = sum(o*5**i) % 236
(oùo
est l'ordinal ASCII d'un caractère eti
son index dans la chaîne, en comptant à partir de la fin). Le module a236
été choisi car c’est le plus petit module qui distingue toutes les valeurs de hachage des 50 noms d’états américains. Ces hachages sont ensuite mappés sur les abréviations d'état et le dictionnaire résultant (compressé à l'aide de la substitution de chaîne) est utilisé pour rechercher l'abréviation à l'aide d'un nom d'état (le hachage pour obtenir la clé appropriée).la source
lambda s:chr(s[0])+'.....IA................L..NOI..M..........E.N..Y.XR.Z....D.I...D....DA.D...........HA..LJ.........N............T.I..........C..T...HAAT.....A...VL.V............CE................AEK.........T.......Y.A...R.Y....O.S...........K.......S'[sum(c*5**i for i,c in enumerate(s[::-1]))%236]
lambda s:chr(s[0])+'IA%%L!NOI!M%!E.N!Y.XR.Z$D.I!.D$DA.D%!.HA!LJ%.N%$T.I%!C!T!.HAAT$.A!.VL.V%$CE%%AEK%.T$!.Y.A!.R.Y$O.S%!.K$!.S'.replace('%','$$').replace('$','!!').replace('!','..')[sum(c*5**i for i,c in enumerate(s[::-1]))%236-5]
Ruby,
106103 octetsSi l'entrée contient un espace, la deuxième lettre de sortie est celle après l'espace. Autre...
Hachez la somme de tous les caractères de l'entrée pour obtenir un caractère dont l'index dans la chaîne magique indique l'indice de la deuxième lettre en sortie de la chaîne d'entrée, conformément à la formule
j>8?j/4:-1
(-1 signifie la fin.). Si le hachage donne un caractère qui n'est pas dans la chaîne magique, la deuxième lettre est la deuxième lettre d'entrée.Comme explication de la chaîne magique, les caractères de hachage et les index de lettre qu’ils encodent se trouvent ci-dessous. Notez que Delaware apparaît même si la deuxième lettre le ferait - c'est parce que son code de hachage se heurte au Kentucky. Heureusement, la dernière lettre de Delaware est la même que la seconde.
Programme non testé
la source
/// ,
619608 octetsEssayez-le en ligne!
Comme il n'y a pas d'autre moyen de prendre une entrée dans ///, cela passe à la fin du programme. Il suffit d’ajouter l’entrée souhaitée au programme.
Sauvegardé 11 octets en faisant plus de remplacements, comme recommandé par @SteveBennett
la source
Python 2 ,
131 à125 octetsEssayez-le en ligne!
la source
TAESGL , 386 octets
Interprète
Compression très simple des noms d'états, ajoutés à un tableau avec les abréviations.
la source
Japt, 383 octets
La compression de la première chaîne peut être améliorée en expérimentant l’ordre des lettres.
Essayez-le en ligne
la source
Mathematica,
138140134 octets+2 octets - a trouvé une erreur (décalage de tableau requis de 1 à 0)
-6 octets - a trouvé un meilleur hash
#~StringTake~1<>"R_ATE__IN_COI_J_I_SLNAT_Y_Y_HKOAE__SAA_DDLM_RVAH_XDTVA__I_N_EA_T_DY_C_KZL"~StringTake~{1+Hash@#~Mod~89866736~Mod~73}&
Semblable à d'autres, il prend le nom et prend la première lettre. Ensuite, il applique le hachage Mathematica par défaut, puis lui applique deux modules "
Hash@#~Mod~89866736~Mod~73
" pour obtenir un numéro unique pour chaque état. Cette valeur est ensuite recherchée dans une chaîne pour générer la deuxième lettre.Peut probablement être plus joué au golf, mais l’espace de recherche est immense pour Mathematica. Les secondes lettres dupliquées n'étaient pas prises en compte dans la recherche par hachage.
_
les caractères représentent les valeurs gaspillées dans la chaîne. En théorie, la chaîne ne pouvait contenir que 19 caractères, mais trouver le hachage personnalisé pour le produire serait un cauchemar.la source
Perl 5,
150148 octets (147 + 1)Ce n'est en aucun cas optimal, mais il fait son travail. Nécessite un
-n
indicateur de ligne de commande.la source
Python 2 , 152 octets
Essayez-le en ligne!
Un port de réponse d' Arnauld .
la source