Rendi grande l'America (n Maps)


16

Nuovo bonus! (Vedi sotto)

Il team cartografico della promessa presidenziale repubblicana degli Stati Uniti Ben Carson ha qualche problema con le loro mappe (immagine tramite Washington Post ):

Mappa con un gruppo di stati spostati nei posti sbagliati (dal team della campagna di Ben Carson) e una vera mappa degli Stati Uniti accanto ad essa

Il problema è che non hanno lo strumento giusto per The Job ™. Hanno bisogno del programma più compatto e affidabile possibile, quindi non devono mai preoccuparsi di creare di nuovo le mappe. Ecco perché ti hanno assunto. Devi prendere questa mappa e inviarla di nuovo con la colorazione desiderata:

Mappa in bianco degli Stati Uniti con i confini di stato mostrati

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

Se non sai dove si trovano tutti gli stati (perché non sei un americano ... o sei un americano), ecco una mappa con tutti i nomi (Washington DC non è richiesta per questa sfida): Mappa degli Stati Uniti con i confini dello stato e nomi su di esso

"Mappa degli USA con nomi di stato 2". Licenza sotto CC BY-SA 3.0 tramite 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

Ad esempio, se l'input è Ohio, Indiana, Illinois;New York, New Jersey, Florida, si genera: Mappa degli Stati Uniti con confini statali.  Ohio, Indiana e Illinois sono colorati in rosso;  New York, New Jersey, Florida, sono colorate in blu.

L'immagine della mappa vuota è disponibile nei formati SVG e PNG . Per comodità, ecco un elenco di tutti i 50 stati in ordine alfabetico

Questa è una sfida di e . L'output deve essere un file SVG o di immagine. La semplice visualizzazione dell'output sullo schermo non è sufficiente. L'input deve essere preso da STDIN o leggendo un file di testo. Sono flessibile su come formattare l'input, sebbene dovrebbe contenere i nomi completi di ogni stato, con gli stati rossi (repubblicani) elencati per primi e gli stati blu (democratici) per secondi. Due tonalità distinte di rosso e blu sono accettabili per la colorazione. Ovviamente, puoi avere l'immagine della mappa vuota nella stessa cartella del tuo programma con qualsiasi nome di file desideri.

Criteri di precisione

Se l'output è un file raster, deve essere almeno 800px per 495px e le righe non devono discostarsi dal risultato del ridimensionamento dello SVG alla stessa dimensione di oltre 1,5 pixel. Se l'output è un file vettoriale, le linee non devono discostarsi dal SVG di oltre 1,5 pixel quando entrambi sono ridimensionati a 800 px di 495 px.

Bonus!

Ben sta cercando di ridurre la dipendenza da biblioteche straniere e ora offre un bonus del -50% a chiunque utilizzi solo una versione grafica raster della mappa come input e crei il proprio algoritmo per il rilevamento delle regioni. In definitiva, è il mio giudizio che determina se il tuo approccio conta come algoritmo "scrivendo il tuo".

In bocca al lupo!


l'esempio mostra un aliasing intorno alle righe che non è stato compilato. è accettabile?
Sparr,

@Sparr Ho fatto l'esempio con un editor di immagini, quindi lo considero "perfetto", quindi se ti manca qualcosa che manca, va bene.
geokavel,

Giusto per essere sicuri: possiamo modificare il file SVG vuoto? Le sue dimensioni contano nel nostro punteggio? Cosa intendi con "visualizzare semplicemente l'output sullo schermo non è sufficiente"?
Blackhole,

@Blackhole No, non puoi modificare il file SVG vuoto, ma non conta come parte del tuo punteggio finché lo carichi esternamente.
geokavel,

@Blackhole Quello che voglio dire è che devi produrre un file.
geokavel,

Risposte:


7

Python 626

Nell'approccio seguente, ho aggiunto .rstate e .bstate in base a .state nella descrizione CSS. Nel mio ho rinominato il file .svg fornito in v.svg. Prende un input come descritto di seguito e scrive in un file w.png. Per trasferire dal nome completo dello stato alla versione abbreviata, li cerco in base alla prima e alle ultime due lettere degli stati.

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

Esempio di input:

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

Esempio di output: figura di uscita

O ispirato alla bandiera della Francia: figura di uscita francia


Bello, la democrazia sopravvive!
geokavel,

Congratulazioni, sei il vincitore! Grazie a tutti coloro che hanno partecipato!
geokavel,

6

Elaborazione, 425 byte (259 byte + 1 +165 byte file)

Codice:

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 mappa vuota deve essere denominata " M.svg " e archiviata in una cartella denominata / data (tutti gli altri file si trovano nella stessa cartella del programma).

File di input (" a "):

Mississippi
California
Connecticut

Delaware
Florida
Wyoming
Hawaii

File chiave (" b "): http://pastebin.com/0pNufAH9

Uscita (" m.tif "):

inserisci qui la descrizione dell'immagine

Ok, ecco il mio tentativo di affrontare la mia sfida. Alcune note:

  • La mappa di output ha un aspetto diverso dalla mappa di input nei seguenti modi
    1. La mappa di input aveva un riempimento grigio su uno sfondo trasparente. L'output presenta un riempimento bianco su uno sfondo grigio. Penso che questo dovrebbe essere permesso, perché bianco, grigio e trasparenza sono tutti neutrali.
    2. Nella mappa di output mancano le linee intorno alle Hawaii e all'Alaska che avevano l'input. Ancora una volta, penso che sia ok perché le linee non sono una parte significativa della mappa.
  • Il programma utilizza un file esterno per contenere le chiavi. Secondo questo meta post , ho solo bisogno di aggiungere 1 byte per un file aggiuntivo.

Se qualcuno ha delle discrepanze con la mia autoregolazione del mio codice, sentiti libero di lasciare un commento.

Inoltre, se qualcuno è curioso di provare questa sfida in Processing , supporta sia la lettura di file SVG in PShape's, sia l'analisi di file SVG come XML.


Per il tuo for-loop, for(int i=0;i++<51;)invece di for(int i=0;i<51;i++). Salva 1 byte e contiene una faccina;)
Kritixi Lithos

@ ΚριτικσιΛίθος Ho dovuto farlo ++ifunzionare. Suona bene?
geokavel,

@ ΚριτικσιΛίθος Potrebbe salvare un byte, ma cambia completamente il comportamento all'interno del ciclo.
Tom Carpenter,

@ ΚριτικσιΛίθος Sì, credo di non poterlo usare allora perché perdo le Hawaii. Forse funziona diversamente in Java rispetto ad altre lingue.
geokavel,

Hai uno spazio inutile in più aString[] a
Kritixi Lithos

5

PHP, 714 byte

L'output è il file SVG vuoto, che deve essere archiviato in un file denominato a, con CSS aggiuntivo per colorare gli stati, che deve essere archiviato in un file denominato bnel seguente formato:

Ohio0Indiana0Illinois1New York0New Jersey0Florida

Ho aggiunto alcune nuove righe per la leggibilità.

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

Ecco la versione ungolfed:

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

Il principio è semplice: nell'SVG vuoto, ogni percorso ha un ID corrispondente all'abbreviazione dello stato che rappresenta (ad esempio, <path d="…" id="HI" />per le Hawaii).

Tutto quello che dobbiamo fare è aggiungere alcuni CSS per colorare questo percorso nella tonalità appropriata. Ma c'è già qualche CSS nel file vuoto (in particolare il <style type="text/css">…</style>tag esiste già), quindi è davvero facile e breve farlo. Possiamo notare che la stringa si .btrova solo nel CSS per .border. Buone notizie! Sostituiremo semplicemente .bcon OUR_WONDERFUL_CSS.b.

Creare "il nostro meraviglioso CSS" non è davvero più difficile:

  1. Leggere l'input dal file:
    Ohio0Indiana0Illinois1New York0New Jersey0Florida.
  2. Sostituire i nomi degli stati con le loro abbreviazioni:
    OH0IN0IL1NY0NJ0FL.
  3. Sostituire i 0caratteri con ,#:
    OH,#IN,#IL1NY,#NJ,#FL.
  4. Sostituire il 1personaggio con {fill:red}#:
    OH,#IN,#IL{fill:red}#NY,#NJ,#FL.
  5. Aggiungere #all'inizio e {fill:blue}alla fine:
    #OH,#IN,#IL{fill:red}#NY,#NJ,#FL{fill:blue}.

Ok, ottimo lavoro. Sebbene tecnicamente non scriva un file come vorrei, l'utente può facilmente salvare l'immagine premendo "Salva pagina con nome" nel browser. Consentirò questo tipo di risposta.
geokavel,

3
Interessante che le abbreviazioni per Pennsylvania, Rhode Island e South Carolina spieghino PARIGI.
geokavel,

@geokavel Posso facilmente creare un file, se necessario. Devo modificare la mia risposta? Sì, viva Parigi! A proposito, grazie per il vostro supporto in questi tempi difficili, fratelli oltre l'Atlantico!
Blackhole,

@DavidCarraher Ho aggiunto alcune spiegazioni. Spero che ti possa aiutare a capire la mia risposta.
Blackhole,

+1 per implodee il tuo nome utente!
caird coinheringaahing

3

Mathematica 1025

Non elegante ma funziona.

Non ero a conoscenza del fatto che i file SVG avevano percorsi per ogni stato, quindi ho trovato gli stati usando MorphologicalComponentse quindi ho associato ciascun componente al suo rispettivo stato. Stati come il Michigan (con penisole superiore e inferiore) e le Hawaii (isole multiple) hanno più di un componente.

Il codice presuppone che il file della mappa sia contenuto nella variabile, 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}}]])]

Di seguito l'immagine che verrà esportata dal seguente input:

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

carta geografica

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.