Rendre l'Amérique (n cartes) géniale à nouveau

16

Nouveau bonus! (Voir ci-dessous)

L'équipe de cartographie de l'espoir présidentiel républicain américain Ben Carson a des problèmes avec leurs cartes (image via le Washington Post ):

Carte avec un tas d'États déplacés au mauvais endroit (par l'équipe de campagne de Ben Carson) et une vraie carte des États-Unis à côté

Le problème est qu'ils n'ont pas le bon outil pour le travail ™. Ils ont besoin du programme le plus compact et le plus fiable possible, afin qu'ils n'aient plus à se soucier de refaire des cartes. Voilà pourquoi ils vous ont engagé. Vous devez prendre cette carte et la renvoyer avec la coloration souhaitée:

Carte vierge des États-Unis avec les frontières des États indiqués

Par Theshibboleth [GFDL ( http://www.gnu.org/copyleft/fdl.html ) ou CC-BY-SA-3.0 ( http://creativecommons.org/licenses/by-sa/3.0/)] , via Wikimedia Commons

Si vous ne savez pas où se trouvent tous les États (parce que vous n'êtes pas américain ... ou vous êtes américain), voici une carte avec tous les noms (Washington DC n'est pas requis pour ce défi): Carte des États-Unis avec les frontières des États et les noms

"Carte des USA avec des noms d'état 2". Sous licence CC BY-SA 3.0 via Wikimedia Commons - https://commons.wikimedia.org/wiki/File:Map_of_USA_with_state_names_2.svg#/media/File:Map_of_USA_with_state_names_2.svg

Par exemple, si l'entrée est Ohio, Indiana, Illinois;New York, New Jersey, Florida , vous sortez: Carte des États-Unis avec les frontières des États.  L'Ohio, l'Indiana et l'Illinois sont colorés en rouge;  New York, New Jersey Florida sont colorés en bleu.

L'image de la carte vierge est disponible en SVG et PNG formats . Pour votre commodité, voici une liste des 50 États par ordre alphabétique

Ceci est un et défi de . La sortie doit être au format SVG ou image. Il ne suffit pas d'afficher simplement la sortie à l'écran. L'entrée doit provenir de STDIN ou de la lecture d'un fichier texte. Je suis flexible avec la façon dont vous formatez l'entrée, bien qu'elle devrait contenir les noms complets de chaque état, avec les états rouges (républicains) en premier et les états bleus (démocratiques) en second. Deux nuances distinctes de rouge et de bleu sont acceptables pour la coloration. Bien sûr, vous pouvez avoir l'image de carte vierge dans le même dossier que votre programme avec le nom de fichier que vous souhaitez.

Critères de précision

Si votre sortie est un fichier raster, elle doit être d'au moins 800 pixels par 495 pixels, et les lignes ne doivent pas dévier du résultat de la mise à l'échelle du SVG à la même taille de plus de 1,5 pixel. Si votre sortie est un fichier vectoriel, les lignes ne doivent pas s'écarter du SVG de plus de 1,5 pixel lorsque les deux sont mises à l'échelle à 800 pixels par 495 pixels.

Prime!

Ben essaie de réduire la dépendance vis-à-vis des bibliothèques étrangères et propose désormais un -50% bonus de à toute personne qui utilise uniquement une version graphique raster de la carte en entrée et crée son propre algorithme pour la détection de région. En fin de compte, c'est mon jugement qui détermine si votre approche compte comme «écrire votre propre» algorithme.

Bonne chance!

geokavel
la source
l'exemple montre un alias autour des lignes qui n'a pas été rempli. est-ce acceptable?
Sparr
@Sparr J'ai fait l'exemple avec un éditeur d'image, donc je le considère comme "parfait", donc si vous manquez quelque chose qui vous manque, ça va.
geokavel
Juste pour être sûr: sommes-nous autorisés à modifier le fichier SVG vierge? Sa taille compte-t-elle dans notre partition? Que voulez-vous dire par "afficher simplement la sortie à l'écran ne suffit pas"?
Blackhole
@Blackhole Non, vous ne pouvez pas modifier le fichier SVG vierge, mais il ne compte pas dans votre score tant que vous le chargez en externe.
geokavel
@Blackhole Ce que je veux dire, c'est que vous devez sortir un fichier.
geokavel

Réponses:

7

Python 626

Dans l'approche ci-dessous, j'ai ajouté .rstate et .bstate basé sur .state dans la description CSS. Dans mon, j'ai renommé le fichier .svg fourni env.svg . Il prend une entrée comme décrit ci-dessous et écrit dans un fichier w.png. Pour passer du nom d'état complet à la version abrégée, je les recherche en fonction des deux premières et dernières lettres des états.

r='Ama,Aka,Ana,Aas,Cia,Cdo,Cut,Dre,Fda,Gia,Hii,Iho,Iis,Ina,Iwa,Kas,Kky,Lna,Mne,Mnd,Mts,Man,Mta,Mpi,Mri,Mna,Nka,Nda,Nre,Ney,Nco,Nrk,Nna,Nta,Oio,Oma,Oon,Pia,Rnd,Sna,Sta,Tee,Tas,Uah,Vnt,Via,Won,Wia,Win,Wng'.split(',')
y='lkzraotelaidlnasyaedainsotevhjmycdhkraicdnxttaaviy'
v=open('v.svg','r')
s=v.read()
v.close()
k=s.find('.state')
j=s.find('.',k+1)
t=input().split(';')
w=open('w.svg','w')
k+=1
c='#E0E0E0'
s=s[:j]+'.r'+s[k:j].replace(c,'red')+'.b'+s[k:j].replace(c,'blue')+s[j:]
c='rb'
for j in range(2):
 for d in t[j].split(','):k=s.find('state '+d[0].lower()+y[r.index(d[0]+d[-2:])]);s=s[:k]+c[j]+s[k:]
w.write(s)
w.close()

Exemple d'entrée:

'California,Illinois,Iowa,Mississippi;New Mexico,Pennsylvania,South Dakota,Vermont'

Exemple de sortie: chiffre de sortie

Ou inspiré du drapeau de la France: chiffre de sortie france

Willem
la source
Sympa, la démocratie continue!
geokavel
Félicitations, vous êtes le gagnant! Merci à tous ceux qui ont participé!
geokavel
6

Traitement, 425 octets (259 octets + 1 fichier +165 octets)

Code:

size(959,593);String[]a=loadStrings("a"),b=loadStrings("b");PShape m=loadShape("M.svg");m.disableStyle();for(int i=0;i<51;i++){fill(255);int r=0;for(String j:a){if(j.isEmpty())r++;if(j.contains(b[i]))fill(r>0?#0000FF:#FF0000);}shape(m.getChild(i));}save("m");

La carte vierge doit être nommée " M.svg " et stockée dans un dossier appelé / data (tous les autres fichiers se trouvent dans le même dossier que le programme.)

Fichier d'entrée (" a "):

Mississippi
California
Connecticut

Delaware
Florida
Wyoming
Hawaii

Fichier clé (" b "): http://pastebin.com/0pNufAH9

Sortie (" m.tif "):

entrez la description de l'image ici

Ok, voici mon essai à mon propre défi. Quelques notes:

  • La carte de sortie est différente de la carte d'entrée des manières suivantes
    1. La carte d'entrée était remplie de gris sur un fond transparent. La sortie est remplie de blanc sur fond gris. Je pense que cela devrait être autorisé, car le blanc, le gris et la transparence sont tous neutres.
    2. La carte de sortie ne contient pas les lignes autour d'Hawaï et de l'Alaska que l'entrée contenait. Encore une fois, je pense que c'est ok parce que les lignes ne sont pas une partie importante de la carte.
  • Le programme utilise un fichier externe pour conserver les clés. Selon cette méta-publication , j'ai juste besoin d'ajouter 1 octet pour un fichier supplémentaire.

Si quelqu'un a des divergences avec mon auto-évaluation de mon code, n'hésitez pas à laisser un commentaire.

De plus, si quelqu'un est curieux d'essayer ce défi dans le traitement , il prend en charge la lecture des fichiers SVG dans PShape, ainsi que l'analyse des fichiers SVG en XML.

geokavel
la source
Pour votre boucle for, ayez for(int i=0;i++<51;)au lieu de for(int i=0;i<51;i++). Il enregistre 1 octet et a un visage souriant;)
Kritixi Lithos
@ ΚριτικσιΛίθος J'ai dû le faire ++ifonctionner. Est-ce que ça sonne bien?
geokavel
@ ΚριτικσιΛίθος Cela peut sauver un octet, mais cela change complètement le comportement à l'intérieur de la boucle.
Tom Carpenter
@ ΚριτικσιΛίθος Ouais, je suppose que je ne peux pas l'utiliser alors parce que je perds Hawaï. Peut-être que cela fonctionne différemment en Java, puis dans d'autres langages.
geokavel
Vous avez un espace supplémentaire inutile àString[] a
Kritixi Lithos
5

PHP, 714 octets

La sortie est le fichier SVG vierge, qui doit être stocké dans un fichier nommé a, avec du CSS supplémentaire pour colorer les états, qui doit être stocké dans un fichier nommé bau format suivant:

Ohio0Indiana0Illinois1New York0New Jersey0Florida

J'ai ajouté quelques nouvelles lignes pour la lisibilité.

<?
$x=str_replace;echo$x('.b','#'.$x([0,1],[',#','{fill:red}#'],$x(split(0,'Alabama0Alaska0
Arizona0Arkansas0California0Colorado0Connecticut0Delaware0Florida0Georgia0Hawaii0Idaho0Illin
ois0Indiana0Iowa0Kansas0Kentucky0Louisiana0Maine0Maryland0Massachusetts0Michigan0Minnesota0M
ississippi0Missouri0Montana0Nebraska0Nevada0New Hampshire0New Jersey0New Mexico0New York0Nor
th Carolina0North Dakota0Ohio0Oklahoma0Oregon0Pennsylvania0Rhode Island0South Carolina0South
 Dakota0Tennessee0Texas0Utah0Vermont0Virginia0Washington0West Virginia0Wisconsin0Wyoming'),s
tr_split(ALAKAZARCACOCTDEFLGAHIIDILINIAKSKYLAMEMDMAMIMNMSMOMTNENVNHNJNMNYNCNDOHOKORPARISCSDT
NTXUTVTVAWAWVWIWY,2),file(b)[0])).'{fill:blue}.b',implode('',file(a)));

Voici la version non golfée:

<?php
$stateNames = 'Alabama0Alaska0Arizona0Arkansas0California0Colorado0Connecticut0Delaware0Florida0Georgia0Hawaii0Idaho0Illinois0Indiana0Iowa0Kansas0Kentucky0Louisiana0Maine0Maryland0Massachusetts0Michigan0Minnesota0Mississippi0Missouri0Montana0Nebraska0Nevada0New Hampshire0New Jersey0New Mexico0New York0North Carolina0North Dakota0Ohio0Oklahoma0Oregon0Pennsylvania0Rhode Island0South Carolina0South Dakota0Tennessee0Texas0Utah0Vermont0Virginia0Washington0West Virginia0Wisconsin0Wyoming';
$statesAbbreviations = 'ALAKAZARCACOCTDEFLGAHIIDILINIAKSKYLAMEMDMAMIMNMSMOMTNENVNHNJNMNYNCNDOHOKORPARISCSDTNTXUTVTVAWAWVWIWY';

$blankSVG = implode('', file('a'));

$inputWithStateNames = file('b')[0];
$inputWithStateAbbreviations = str_replace(
    explode('0', $stateNames),
    str_split($statesAbbreviations, 2),
    $inputWithStateNames
);

echo str_replace(
    '.border',
    '#'. str_replace(
        [
            '0',
            '1'
        ],
        [
            ',#',
            '{fill:red}#'
        ],
        $inputWithStateAbbreviations
    ) .'{fill:blue}.border',
    $blankSVG
);

Le principe est simple: dans le SVG vierge, chaque chemin a un ID correspondant à l'abréviation de l'état qu'il représente (par exemple, <path d="…" id="HI" />pour Hawaï).

Tout ce que nous avons à faire est d'ajouter du CSS pour colorer ce chemin dans la teinte appropriée. Mais il y a déjà du CSS dans le fichier vierge (en particulier la <style type="text/css">…</style>balise existe déjà), donc c'est vraiment facile et court de le faire. Nous pouvons remarquer que la chaîne .bne se trouve que dans le CSS pour .border. Bonnes nouvelles! Nous allons simplement remplacer .bpar OUR_WONDERFUL_CSS.b.

Créer "notre merveilleux CSS" n'est pas vraiment plus difficile:

  1. Lire l'entrée du fichier:
    Ohio0Indiana0Illinois1New York0New Jersey0Florida.
  2. Remplacer les noms des états avec leurs abréviations:
    OH0IN0IL1NY0NJ0FL.
  3. Remplacer les 0caractères avec ,#:
    OH,#IN,#IL1NY,#NJ,#FL.
  4. Remplacer le 1caractère avec {fill:red}#:
    OH,#IN,#IL{fill:red}#NY,#NJ,#FL.
  5. Ajouter #au début et {fill:blue}à la fin:
    #OH,#IN,#IL{fill:red}#NY,#NJ,#FL{fill:blue}.
Trou noir
la source
Bon travail. Bien que techniquement, il n'écrive pas un fichier comme je le voudrais, l'utilisateur peut facilement enregistrer l'image en appuyant sur "Enregistrer la page sous" dans le navigateur. Je vais autoriser ce type de réponse.
geokavel
3
Il est intéressant de noter que les abréviations de Pennsylvanie, Rhode Island et Caroline du Sud définissent PARIS.
geokavel
@geokavel Je peux facilement créer un fichier, si nécessaire. Dois-je modifier ma réponse? Oui, vive Paris! Soit dit en passant, merci pour votre soutien en ces temps difficiles, frères au-delà de l'Atlantique!
Blackhole
@DavidCarraher J'ai ajouté quelques explications. J'espère que cela vous aidera à comprendre ma réponse.
Blackhole
+1 pour implodeet votre nom d'utilisateur!
caird coinheringaahing
3

Mathematica 1025

Pas élégant mais ça marche.

Je ne savais pas que les fichiers SVG avaient des chemins pour chaque état, j'ai donc trouvé les états utilisant MorphologicalComponentspuis associé chaque composant à son état respectif. Des États comme le Michigan (avec les péninsules supérieures et inférieures) et Hawaï (plusieurs îles) ont plus d'une composante.

Le code suppose que le fichier de carte est contenu dans la variable, m .

r=Thread[{"Washington","Montana","Maine","Minnesota","North Dakota","Oregon","Michigan","New Hampshire","Vermont","Wisconsin","New York","Idaho","South Dakota","Wyoming","Massachusetts","California","Connecticut","Nevada","Pennsylvania","Iowa","New Mexico","New Jersey","Ohio","Nebraska","Illinois","Indiana","Colorado","Delaware","Maryland","West Virginia","Virginia","Missouri","Washington, D.C.","Kansas","Kentucky","North Carolina","New Mexico","Tennessee","Arizona","Oklahoma","Arkansas","South Carolina","Georgia","Alabama","Mississippi","Texas","Louisiana","Alaska","Florida","Hawaii"}->{6,7,8,9,10,11,{13,23},14,16,18,{19,39},20,24,25,26,27,31,32,36,37,38,40,41,42,43,44,45,46,{47,55},49,50,51,52,53,56,57,58,59,60,61,62,65,66,67,69,{71,80,87},72,{73,75,82,93,101,104},74,{79,81,83,84,85,89,92}}]; 
v=Flatten;c=MorphologicalComponents@Binarize@m;
h@s_:=v[((Reverse/@Position[c,#])/.{x_,y_}:>{x,1241-y})&/@s,1]
k@{s_,c_}:=Thread[(h@s)->c]
f@{a_,b_}:=Export["f.jpg",(ReplacePixelValue[map,v[k[{v[#/.r],#2}]&@@@{{a,Red},{b,Blue}}]])]

Voici l'image qui sera exportée par l'entrée suivante:

f[{{"Ohio", "Indiana", "Illinois", "Alaska"}, {"New York", "Michigan","Oregon", "New Jersey", "Florida"}}]

carte

DavidC
la source