Make America (n Maps) Great Again

16

Nuevo bono! (Vea abajo)

El equipo de cartografía del candidato presidencial republicano de EE. UU. Ben Carson está teniendo algunos problemas con sus mapas (imagen a través del Washington Post ):

Mapa con un montón de estados movidos a los lugares equivocados (por el equipo de campaña de Ben Carson) y un mapa real de los Estados Unidos al lado

El problema es que no tienen la herramienta adecuada para el trabajo ™. Necesitan el programa más compacto y confiable posible, por lo que nunca tendrán que preocuparse por volver a hacer mapas. Por eso te contrataron. Debe tomar este mapa y enviarlo nuevamente con el color deseado:

Mapa en blanco de los Estados Unidos con las fronteras estatales que se muestran

Por Theshibboleth [GFDL ( http://www.gnu.org/copyleft/fdl.html ) o CC-BY-SA-3.0 ( http://creativecommons.org/licenses/by-sa/3.0/)] , a través de Wikimedia Commons

Si no sabe dónde están todos los estados (porque no es estadounidense ... o es estadounidense), aquí hay un mapa con todos los nombres (Washington DC no es necesario para este desafío): Mapa de los Estados Unidos con fronteras estatales y nombres en él

"Mapa de Estados Unidos con nombres de estado 2". Licenciado bajo CC BY-SA 3.0 a través de 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

Por ejemplo, si la entrada es Ohio, Indiana, Illinois;New York, New Jersey, Florida, la salida: Mapa de los Estados Unidos con las fronteras estatales.  Ohio, Indiana e Illinois están coloreados en rojo;  Nueva York, Nueva Jersey, Florida son de color azul.

La imagen del mapa en blanco está disponible en formatos SVG y PNG . Para su conveniencia, aquí hay una lista de los 50 estados en orden alfabético

Este es un desafío de y . La salida debe ser como un archivo SVG o de imagen. Simplemente mostrar la salida en la pantalla no es suficiente. La entrada debe tomarse de STDIN o leyendo un archivo de texto. Soy flexible con la forma en que formatea la entrada, aunque debe contener los nombres completos de cada estado, con los estados rojos (republicanos) en primer lugar y los azules (demócratas) en segundo lugar. Dos tonos distintos de rojo y azul son aceptables para la coloración. Por supuesto, puede tener la imagen del mapa en blanco en la misma carpeta que su programa con el nombre de archivo que desee.

Criterios de precisión

Si su salida es un archivo ráster, debe tener al menos 800 px por 495 px, y las líneas no deben desviarse del resultado de escalar el SVG al mismo tamaño en más de 1.5 píxeles. Si su salida es un archivo vectorial, las líneas no deben desviarse del SVG en más de 1.5 píxeles cuando ambas se escalan a 800 px por 495 px.

¡Prima!

Ben está tratando de reducir la dependencia de las bibliotecas extranjeras, y ahora ofrece una bonificación de -50% a cualquiera que use solo una versión de mapa ráster del mapa como entrada y cree su propio algoritmo para la detección de regiones. En última instancia, es mi opinión la que determina si su enfoque cuenta como un algoritmo de "escritura propia".

¡Buena suerte!

geokavel
fuente
El ejemplo muestra algunos alias alrededor de las líneas que no se han rellenado. ¿Es eso aceptable?
Sparr
@Sparr Hice el ejemplo con un editor de imágenes, por lo que considero que es "perfecto", así que si te pierdes algo que se pierde, está bien.
geokavel
Solo para estar seguro: ¿podemos modificar el archivo SVG en blanco? ¿Su tamaño cuenta en nuestra puntuación? ¿Qué quiere decir con "simplemente mostrar la salida en la pantalla no es suficiente"?
Blackhole
@Blackhole No, no puede modificar el archivo SVG en blanco, pero no cuenta como parte de su puntaje siempre que lo cargue externamente.
geokavel
@Blackhole Lo que quiero decir es que tienes que generar un archivo.
geokavel

Respuestas:

7

Python 626

En el siguiente enfoque, agregué .rstate y .bstate basado en .state en la descripción de CSS. En mi renombré el archivo .svg proporcionado a v.svg. Toma una entrada como se describe a continuación y escribe en un archivo w.png. Para transferir del nombre completo del estado a la versión abreviada, los busco según las dos primeras letras de los estados.

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

Entrada de ejemplo:

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

Salida de ejemplo: cifra de salida

O inspirado por la bandera de Francia: figura de salida francia

Willem
fuente
¡Agradable, la democracia sigue viva!
geokavel
¡Felicidades, eres el ganador! Gracias a todos los que participaron!
geokavel
6

Procesamiento, 425 bytes (259 bytes + 1 +165 bytes de archivo)

Código:

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

El mapa en blanco debe llamarse " M.svg " y almacenarse en una carpeta llamada / data (todos los demás archivos están en la misma carpeta que el programa).

Archivo de entrada (" a "):

Mississippi
California
Connecticut

Delaware
Florida
Wyoming
Hawaii

Archivo de clave (" b "): http://pastebin.com/0pNufAH9

Salida (" m.tif "):

ingrese la descripción de la imagen aquí

Ok, aquí está mi intento en mi propio desafío. Algunas notas:

  • El mapa de salida se ve diferente del mapa de entrada de las siguientes maneras
    1. El mapa de entrada tenía un relleno gris sobre un fondo transparente. La salida tiene relleno blanco sobre un fondo gris. Creo que esto debería permitirse, porque el blanco, el gris y la transparencia son todos neutrales.
    2. Al mapa de salida le faltan las líneas alrededor de Hawai y Alaska que tenía la entrada. Una vez más, creo que esto está bien porque las líneas no son una parte significativa del mapa.
  • El programa utiliza un archivo externo para mantener las teclas. De acuerdo con esta meta publicación , solo necesito agregar 1 byte para un archivo adicional.

Si alguien tiene alguna discrepancia con mi auto adjudicación de mi código, no dude en dejar un comentario.

Además, si alguien tiene curiosidad por probar este desafío en Processing , es compatible tanto con la lectura de archivos SVG PShapecomo en el análisis de archivos SVG como XML.

geokavel
fuente
Para su bucle for, tener en for(int i=0;i++<51;)lugar de for(int i=0;i<51;i++). Ahorra 1 byte y tiene una cara sonriente;)
Kritixi Lithos
@ ΚριτικσιΛίθος Tuve que hacerlo ++ipara que funcione. ¿Eso suena bien?
geokavel
@ ΚριτικσιΛίθος Puede guardar un byte, pero cambia completamente el comportamiento dentro del bucle.
Tom Carpenter
@ ΚριτικσιΛίθος Sí, supongo que no puedo usar eso porque pierdo Hawai. Tal vez funciona diferente en Java que en otros lenguajes.
geokavel
Tienes un espacio inútil adicional enString[] a
Kritixi Lithos
5

PHP, 714 bytes

El resultado es el archivo SVG en blanco, que debe almacenarse en un archivo llamado a, con CSS adicional para colorear los estados, que debe almacenarse en un archivo bcon el siguiente formato:

Ohio0Indiana0Illinois1New York0New Jersey0Florida

He agregado algunas líneas nuevas para facilitar la lectura.

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

Aquí está la versión sin golf:

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

El principio es simple: en el SVG en blanco, cada ruta tiene una ID correspondiente a la abreviatura del estado que representa (por ejemplo, <path d="…" id="HI" />para Hawai).

Todo lo que tenemos que hacer es agregar un poco de CSS para colorear esta ruta en el tono apropiado. Pero ya hay algo de CSS en el archivo en blanco (en particular, la <style type="text/css">…</style>etiqueta ya existe), por lo que es realmente fácil y corto hacerlo. Podemos notar que la cadena .bsolo se encuentra en el CSS para.border . ¡Buenas noticias! Solo lo reemplazaremos .bcon OUR_WONDERFUL_CSS.b.

Crear "nuestro maravilloso CSS" no es realmente más difícil:

  1. Lea la entrada del archivo:
    Ohio0Indiana0Illinois1New York0New Jersey0Florida .
  2. Reemplace los nombres de los estados con sus abreviaturas:
    OH0IN0IL1NY0NJ0FL .
  3. Reemplace los 0caracteres con ,#:
    OH,#IN,#IL1NY,#NJ,#FL .
  4. Reemplace el 1personaje con {fill:red}#:
    OH,#IN,#IL{fill:red}#NY,#NJ,#FL .
  5. Añadir #al principio y {fill:blue}al final:
    #OH,#IN,#IL{fill:red}#NY,#NJ,#FL{fill:blue}.
Agujero negro
fuente
Ok, buen trabajo. Aunque técnicamente no escribe un archivo como me gustaría, el usuario puede guardar fácilmente la imagen presionando "Guardar página como" en el navegador. Permitiré este tipo de respuesta.
geokavel
3
Es interesante que las abreviaturas de Pensilvania, Rhode Island y Carolina del Sur explican PARÍS.
geokavel
@geokavel Puedo crear fácilmente un archivo, si es necesario. ¿Debo modificar mi respuesta? Sí, ¡viva París! Por cierto, ¡gracias por su apoyo en estos tiempos difíciles, hermanos más allá del Atlántico!
Blackhole
@DavidCarraher He agregado algunas explicaciones. Espero que te ayude a entender mi respuesta.
Blackhole
¡+1 para implodey su nombre de usuario!
caird coinheringaahing
3

Mathematica 1025

No es elegante pero funciona.

No sabía que los archivos SVG tenían rutas para cada estado, así que encontré los estados usando MorphologicalComponents y luego asocié cada componente con su estado respectivo. Estados como Michigan (con penínsulas superior e inferior) y Hawai (múltiples islas) tienen más de un componente.

El código supone que el archivo de mapa está contenido en 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}}]])]

A continuación se muestra la imagen que se exportará mediante la siguiente entrada:

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

mapa

DavidC
fuente