Machen Sie Amerika (n Karten) wieder großartig

16

Neuer Bonus! (Siehe unten)

Das Kartografieteam des US-republikanischen Präsidenten Ben Carson hat einige Probleme mit seinen Karten (Bild via Washington Post ):

Karte mit einer Reihe von Staaten, die an die falschen Orte verschoben wurden (vom Kampagnenteam von Ben Carson) und eine echte Karte der USA daneben

Das Problem ist, dass sie nicht das richtige Tool für den Job ™ haben. Sie benötigen ein möglichst kompaktes und zuverlässiges Programm, damit sie sich nie wieder Gedanken über das Erstellen von Karten machen müssen. Deshalb haben sie dich angeheuert. Sie müssen diese Karte nehmen und wieder mit der gewünschten Farbe ausgeben:

Unbelegte Karte der Vereinigten Staaten mit den gezeigten Zustandrändern

Von Theshibboleth [GFDL ( http://www.gnu.org/copyleft/fdl.html ) oder CC-BY-SA-3.0 ( http://creativecommons.org/licenses/by-sa/3.0/)] über Wikimedia Commons

Wenn Sie nicht wissen, wo sich alle Bundesstaaten befinden (weil Sie kein Amerikaner sind ... oder Sie ein Amerikaner sind), finden Sie hier eine Karte mit allen Namen (Washington DC ist für diese Herausforderung nicht erforderlich): Karte der Vereinigten Staaten mit Staatsgrenzen und Namen darauf

Msgstr "Karte der USA mit Staatsnamen 2". Lizenziert unter CC BY-SA 3.0 über 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

Wenn die Eingabe beispielsweise lautet Ohio, Indiana, Illinois;New York, New Jersey, Florida, geben Sie Folgendes aus: Karte der Vereinigten Staaten mit Staatsgrenzen.  Ohio, Indiana und Illinois sind rot gefärbt;  New York, New Jersey Florida sind blau gefärbt.

Das leere Kartenbild ist in den Formaten SVG und PNG verfügbar. Zur Vereinfachung finden Sie hier eine Liste aller 50 Staaten in alphabetischer Reihenfolge

Dies ist eine und Herausforderung. Die Ausgabe muss als SVG- oder Bilddatei erfolgen. Es reicht nicht aus, nur die Ausgabe auf dem Bildschirm anzuzeigen. Die Eingabe muss von STDIN oder durch Lesen einer Textdatei erfolgen. Ich bin flexibel, wie Sie die Eingabe formatieren, obwohl sie die vollständigen Namen der einzelnen Bundesstaaten enthalten sollte, wobei die roten (republikanischen) Bundesstaaten an erster Stelle und die blauen (demokratischen) Bundesstaaten an zweiter Stelle stehen. Für die Färbung sind zwei unterschiedliche Rot- und Blautöne zulässig. Natürlich können Sie das leere Kartenbild mit dem gewünschten Dateinamen im selben Ordner wie Ihr Programm speichern.

Genauigkeitskriterien

Wenn es sich bei Ihrer Ausgabe um eine Rasterdatei handelt, muss diese mindestens 800 x 495 Pixel groß sein, und die Linien dürfen nicht vom Ergebnis der Skalierung der SVG-Datei auf dieselbe Größe um mehr als 1,5 Pixel abweichen. Wenn es sich bei Ihrer Ausgabe um eine Vektordatei handelt, sollten die Linien nicht mehr als 1,5 Pixel vom SVG abweichen, wenn beide auf 800 x 495 Pixel skaliert sind.

Bonus!

Ben versucht, die Abhängigkeit von fremden Bibliotheken zu verringern, und bietet jetzt einen Bonus von -50% für alle, die nur eine Rastergrafikversion der Karte als Eingabe verwenden und einen eigenen Algorithmus für die Regionserkennung erstellen. Letztendlich ist es meine Entscheidung, ob Ihr Ansatz als "Schreiben Ihres eigenen" Algorithmus zählt.

Viel Glück!

Geokavel
quelle
Das Beispiel zeigt ein Aliasing um die nicht ausgefüllten Zeilen. Ist das akzeptabel?
Sparr
@Sparr Ich habe das Beispiel mit einem Bildbearbeitungsprogramm erstellt, daher halte ich es für "perfekt". Wenn Sie also etwas verpassen, das nicht stimmt, ist es in Ordnung.
Geokavel
Nur um sicherzugehen: Dürfen wir die leere SVG-Datei ändern? Zählt seine Größe in unserer Punktzahl? Was ist damit gemeint, dass es nicht ausreicht, die Ausgabe nur auf dem Bildschirm anzuzeigen?
Blackhole
@Blackhole Nein, Sie können die leere SVG-Datei nicht ändern, sie zählt jedoch nicht zu Ihren Ergebnissen, solange Sie sie extern laden.
Geokavel
@Blackhole Ich meine, du musst eine Datei ausgeben.
Geokavel

Antworten:

7

Python 626

Im folgenden Ansatz habe ich .rstate und .bstate basierend auf .state in die CSS-Beschreibung eingefügt. In meinem habe ich die mitgelieferte .svg Datei in umbenannt v.svg. Es nimmt eine Eingabe wie unten beschrieben entgegen und schreibt in eine Datei w.png. Um vom vollständigen Statusnamen in die abgekürzte Version überzugehen, suche ich sie anhand der ersten und letzten beiden Buchstaben des Status.

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()

Beispiel Eingabe:

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

Beispielausgabe: Ausgangszahl

Oder inspiriert von der Flagge Frankreichs: Ausgangszahl Frankreich

Willem
quelle
Schön, Demokratie lebt weiter!
Geokavel
Herzlichen Glückwunsch, Sie sind der Gewinner! Vielen Dank an alle, die teilgenommen haben!
Geokavel
6

Verarbeitung, 425 Byte (259 Byte + 1 + 165 Byte-Datei)

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");

Leere Map sollte " M.svg " heißen und in einem Ordner namens / data gespeichert werden (alle anderen Dateien befinden sich im selben Ordner wie das Programm.)

Eingabedatei (" a "):

Mississippi
California
Connecticut

Delaware
Florida
Wyoming
Hawaii

Schlüsseldatei (" b "): http://pastebin.com/0pNufAH9

Ausgabe (" m.tif "):

Bildbeschreibung hier eingeben

Ok, hier ist mein Versuch, meine eigene Herausforderung anzunehmen. Einige Notizen:

  • Die Ausgabezuordnung unterscheidet sich von der Eingabezuordnung auf folgende Weise
    1. Die Eingabekarte hatte eine graue Füllung auf einem transparenten Hintergrund. Die Ausgabe hat eine weiße Füllung auf grauem Hintergrund. Ich denke, das sollte erlaubt sein, da Weiß, Grau und Transparenz alle neutral sind.
    2. In der Ausgabekarte fehlen die Linien um Hawaii und Alaska, die die Eingabe hatte. Ich halte das wieder einmal für in Ordnung, da die Linien kein wesentlicher Bestandteil der Karte sind.
  • Das Programm verwendet eine externe Datei, um Schlüssel zu halten. Gemäß diesem Metapost muss ich nur 1 Byte für eine zusätzliche Datei hinzufügen.

Wenn jemand Unstimmigkeiten mit meiner Selbsteinschätzung meines Codes hat, können Sie gerne einen Kommentar hinterlassen.

Wenn Sie diese Herausforderung in Processing ausprobieren möchten , können Sie sowohl SVG-Dateien PShapeeinlesen als auch SVG-Dateien als XML analysieren.

Geokavel
quelle
Habe für deine for-Schleife for(int i=0;i++<51;)statt for(int i=0;i<51;i++). Es speichert 1 Byte und es hat ein Smiley-Gesicht;)
Kritixi Lithos
@ ΚριτικσιΛίθος Ich musste dafür sorgen, ++idass es funktioniert. Klingt das richtig?
Geokavel
@ ΚριτικσιΛίθος Es kann ein Byte speichern, aber es ändert das Verhalten innerhalb der Schleife vollständig.
Tom Carpenter
@ ΚριτικσιΛίθος Ja, ich denke, ich kann das dann nicht benutzen, weil ich Hawaii verliere. Vielleicht funktioniert es in Java anders als in anderen Sprachen.
Geokavel
Sie haben einen zusätzlichen nutzlosen Platz beiString[] a
Kritixi Lithos
5

PHP, 714 Bytes

Die Ausgabe ist die leere SVG-Datei, die in einer Datei mit dem Namen gespeichert werden soll a, mit zusätzlichem CSS zum Färben der Status, die in einer Datei mit dem Namen bim folgenden Format gespeichert werden soll:

Ohio0Indiana0Illinois1New York0New Jersey0Florida

Ich habe einige Zeilen hinzugefügt, um die Lesbarkeit zu verbessern.

<?
$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)));

Hier ist die ungolfed Version:

<?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
);

Das Prinzip ist einfach: In der leeren SVG-Datei hat jeder Pfad eine ID, die der Abkürzung des Staates entspricht, den er repräsentiert (z. B. <path d="…" id="HI" />für Hawaii).

Alles, was wir tun müssen, ist, etwas CSS hinzuzufügen, um diesen Pfad im entsprechenden Farbton einzufärben. Die leere Datei enthält jedoch bereits CSS (insbesondere das <style type="text/css">…</style>Tag ist bereits vorhanden). Dies ist also sehr einfach und schnell zu bewerkstelligen. Wir können feststellen, dass die Zeichenfolge .bnur im CSS für gefunden wird .border. Gute Nachrichten! Wir werden einfach ersetzen .bmit OUR_WONDERFUL_CSS.b.

"Unser wundervolles CSS" zu erstellen ist nicht wirklich schwieriger:

  1. Lesen Sie die Eingabe aus der Datei:
    Ohio0Indiana0Illinois1New York0New Jersey0Florida.
  2. Ersetzen Sie die Namen der Staaten mit ihren Abkürzungen:
    OH0IN0IL1NY0NJ0FL.
  3. Ersetzen Sie die 0Zeichen mit ,#:
    OH,#IN,#IL1NY,#NJ,#FL.
  4. Ersetzen Sie das 1Zeichen mit {fill:red}#:
    OH,#IN,#IL{fill:red}#NY,#NJ,#FL.
  5. Fügen Sie #am Anfang und {fill:blue}am Ende:
    #OH,#IN,#IL{fill:red}#NY,#NJ,#FL{fill:blue}.
Schwarzes Loch
quelle
Ok, großartige Arbeit. Technisch gesehen schreibt es eine Datei nicht so, wie ich es möchte, aber der Benutzer kann das Bild einfach speichern, indem er im Browser auf "Seite speichern unter" drückt. Ich werde diese Art von Antwort zulassen.
Geokavel
3
Interessant, dass die Abkürzungen für Pennsylvania, Rhode Island und South Carolina PARIS buchstabieren.
Geokavel
@geokavel Ich kann bei Bedarf einfach eine Datei erstellen. Sollte ich meine Antwort ändern? Ja, es lebe Paris! Übrigens, danke für Ihre Unterstützung in diesen schweren Zeiten, Brüder jenseits des Atlantiks!
Blackhole,
@ DavidCarraher Ich habe einige Erklärungen hinzugefügt. Ich hoffe, es wird Ihnen helfen, meine Antwort zu verstehen.
Blackhole
+1 für implodeund Ihren Benutzernamen!
Caird Coinheringaahing
3

Mathematica 1025

Nicht elegant, aber es funktioniert.

Mir war nicht bewusst, dass SVG-Dateien Pfade für jeden Status haben, daher habe ich die Status mithilfe der MorphologicalComponentseinzelnen Komponenten ermittelt und sie dann mit dem jeweiligen Status verknüpft. Staaten wie Michigan (mit oberen und unteren Halbinseln) und Hawaii (mehrere Inseln) haben mehr als eine Komponente.

Der Code setzt voraus, dass die Zuordnungsdatei in der Variablen m enthalten ist .

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}}]])]

Unten ist das Bild, das mit der folgenden Eingabe exportiert wird:

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

Karte

DavidC
quelle