Falsifica el pronóstico

15

La nueva supercomputadora que pronostica el clima ha llegado y no funciona.

Mientras tanto, su jefe quiere que compre a los técnicos en algún momento fingiendo los mapas de viento diarios.

Su tarea es dibujar una cuadrícula de flechas que represente la dirección del viento.

La cuadrícula es:

  • compuesto por azulejos cuadrados de 15px
  • 8 fichas por 8 fichas
  • 120px total cuadrado
  • 000 antecedentes

Cada cuadrícula tiene 8 orientaciones potenciales, que representan la dirección del viento:

  1. norte
  2. Noreste
  3. Este
  4. Sureste
  5. Sur
  6. Sur oeste
  7. Oeste
  8. Noroeste

Que debe representarse de la siguiente manera:

N norte NE Nebraska E mi SE SE S S SW SO W W NWnoroeste

Los mapas deben variar gradualmente para ser creíbles.

Esto significa que cada mosaico solo puede diferir de su vecino en un paso. Específicamente:

  • Un mosaico solo puede diferir en un incremento o decremento de cada uno de los 4 mosaicos adyacentes. (o 3 para fichas laterales, 2 para fichas de esquina).
  • Por ejemplo, un mosaico con el vecino E podría ser NE, E o SE (suponiendo que coincida con sus otros vecinos).
  • Las orientaciones pueden retroceder, es decir, N -> NW y NW -> N.

Para ilustrar, el siguiente mapa es válido:

NW  N NE NE NE NE NE NE 
 N NE NE NE NE NE NE  E 
NE NE NE NE NE NE  E SE 
 E NE NE NE NE  E SE  S 
SE  E  E  E  E SE  S SE 
 S SE SE SE SE  S SE  E 
SW  S  S  S  S SE  E NE 
SW SW  S  S SE  E NE  N 

Los mapas deben ser únicos , no generar el mismo mapa para diferentes entradas.

  • La entrada es un número entero que corresponde a los días entre ahora y su pronóstico (por ejemplo, 1 es el pronóstico de mañana, 365 es el tiempo de un año).
  • La salida es el mapa como una imagen.
  • La salida debe ser reproducible, la misma entrada siempre dará la misma salida
  • Debe proporcionar mapas únicos durante al menos 8 años, es decir, sin salida idéntica para ninguna entrada entre 1 y 2920 (estoy ignorando los años bisiestos).
  • No hay salida definida para ninguna entrada mayor que 2920.

El envío ganador producirá mapas válidos (hasta el día 2920) con la menor cantidad de bytes de código fuente.

jsh
fuente
¿Cuál es la entrada máxima que debe manejarse? ¿Existe alguna restricción sobre, por ejemplo, los pronósticos de dos formas consecutivas que también tienen que diferir solo en una cantidad máxima?
Ingo Bürk
La entrada máxima que debe manejarse es 2920 . No hay restricción en los pronósticos consecutivos (excepto que deben ser únicos)
jsh
Oh, lo siento, debo haber pasado por alto el último punto. :)
Ingo Bürk
8
Un poco fuera de tema: le mostré esto a un amigo que pronostica el clima y me dijo que algunas de esas aplicaciones meteorológicas que puedes obtener no son mucho mejores de lo que estamos haciendo aquí, ya que aparentemente solo toman los datos meteorológicos gratuitos del grandes aeropuertos e interpolarlos, la mayoría de las veces esas interpolaciones simplemente apestan.
flawr
2
"El nuevo clima que pronostica la supercomputadora ha llegado y no funciona". Envíelo al International Journal of Climate Science. Será par para el curso. : P
COTO

Respuestas:

4

BBC Basic, 83 caracteres ASCII, tamaño de archivo tokenizado 72

Descargue el emulador en http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

  INPUTn:VDU23,48,516;543;4;0;23,49,783;5,9;0;0:WIDTH8FORi=1TO64PRINT;1ANDn;:n/=2NEXT

Esto es básicamente un puerto del concepto de Martin, pero la implementación en BBC basic es muy diferente. Reprogramaré la fuente para los números 0y 1luego generaré los dígitos binarios nen orden inverso.

El código sin golf está debajo. En BBC basic puede imprimir caracteres ASCII individuales utilizando el VDUcomando, pero el lenguaje tiene una serie de códigos específicos de la máquina similares a las secuencias de escape pero que comienzan con caracteres no imprimibles. Para reprogramar la fuente, comenzamos con ASCII 23. Normalmente se toman valores de 8 bits, pero si usa un punto y coma como separador en lugar de una coma, toma pequeños valores endianos de 16 bits (como se usa en la versión golfizada).

  INPUTn
  VDU23,48,4,2,31,2,4,0,0,0         :REM redefine font for "0" as an east facing arrow, with an 8x8 bitmap
  VDU23,49,15,3,5,9,0,0,0,0         :REM redefine font for "1" as a northeast facing arrow, with an 8x8 bitmap
  WIDTH8                            :REM set print width to 8 characters
  FORi=1TO64PRINT;1ANDn;:n/=2:NEXT  :REM print the binary digits of n in reverse order from least significant to most significant.

Salida

Para los números del 0 al 7. Tenga en cuenta que la fuente no se restablece al final del programa, por lo tanto, los números 0 y 1 aparecen como flechas en los primeros dos ejemplos. ingrese la descripción de la imagen aquí

Level River St
fuente
¡Buena idea! :) Pero son los azulejos de 15x15?
Martin Ender
@ MartinBüttner BBC basic le permite redefinir una fuente en una cuadrícula de 8x8. Para mantener los números pequeños, hice la flecha este más pequeña reconocible (5x5 apretada en la esquina superior derecha de la cuadrícula) e hice la flecha noreste de aspecto más similar. En el modo de pantalla utilizado aquí, la definición tiene una correspondencia 1: 1 con los píxeles (y deja un amplio espacio entre las filas), pero dupliqué el tamaño de la cuadrícula en Windows Paint para obtener una imagen de mejor tamaño en SE. Algunos de los otros modos de pantalla en BBC basic tienen más de 1 píxel por elemento de cuadrícula, y los caracteres definidos por el usuario son notablemente más granulados que la fuente normal.
Level River St
23

Matlab (182 *)

Se supone que la entrada se almacena en n. Al mirar el algoritmo, no estoy seguro de que los resultados sean únicos, pero verifiqué n=1 upto 3000si son únicos y satisfacen las reglas. Básicamente, solo uso números complejos del círculo unitario y los 'suavizo' mediante conv2 con un filtro gaussiano. Después de eso, se 'redondean' a las 8 direcciones posibles.

* No sé cómo escalar la salida a un cierto número de píxeles, por lo que debe hacerse manualmente = /

EDITAR: Acabo de descubrir que hay casos en los que mi programa de verificación no reconoció soluciones incorrectas (cambios en más de 1 paso), pero estoy tratando de encontrar otra solución.

Entrada:

n = 1

Código:

rand('seed',0);
for x=1:n
    b = exp(1i*rand(8)*2*pi);
end
for k=1:12
    b = conv2(b,[1,2,1]'*[1,2,1],'same');b=b./abs(b);
end
c = exp(1i*round(angle(b)*4/pi)*pi/4)/3;
quiver(real(c),imag(c));

campo vectorial

falla
fuente
¿Qué quiere decir con "escalar la salida a un cierto número de píxeles", escalar las flechas o la imagen?
krs013
@ krs013 Me refiero a escalar toda la imagen, aún no descubrí cómo hacerlo de modo que tenga, por ejemplo, un ancho de exactamente 8 * 16 píxeles.
flawr
15

Mathematica, 116 115 bytes

f@n_:=Graphics[Array[(d=n~BitGet~#;Arrow@{1+{w=15#~Mod~8+6.5d,h=15Floor[#/8]},14+{w-13d,h}})&,64,0],ImageSize->120]

Supongo que un buen caballo nunca salta más alto de lo necesario. 2920 cuadrículas diferentes se logran muy fácilmente usando solo dos direcciones (estoy usando Ny NE), lo que hace que satisfacer la regla de continuidad sea trivial. Simplemente elijo entre N y NE en función de los bits de n, por lo que esto realmente producirá 2 64 mapas de viento diferentes.

Aquí están los primeros diez mapas:

ingrese la descripción de la imagen aquí

PD: Mi idea original era enumerar las 8 4 combinaciones para las 4 esquinas y la interpolación "lineal" del resto de la cuadrícula. Eso probablemente habría resultado en mapas más agradables, pero este es el código golf después de todo, así que elegí lo que cumple con los requisitos mínimos.

Martin Ender
fuente
Debería haber pedido 2 ^ 64 + 1 cuadrículas. :)
jsh
@jsh Tenía 8 opciones para dos direcciones adyacentes. Hubiera hecho que el código fuera un poco más largo, pero aún habría sido igualmente fácil y permitiría 2 ^ 67 cuadrículas únicas. Pero no se preocupe, creo que sigue siendo un buen código de golf: hacer golf de salida gráfica es difícil (debido a la objetividad requerida) y creo que ha hecho un trabajo bastante bueno con él.
Martin Ender
Me gusta la idea de la interpolación, pero ¿cómo habrías interpolado cuando cada una de las cuatro esquinas apunte al centro?
flawr
44
@ MartinBüttner: Aunque técnicamente cumple con las especificaciones, parece ser contrario al espíritu del desafío, que es hacer que el mapa sea creíble. Solo una observación.
COTO
2
@COTO Muy cierto, pero también es un código de golf y no un concurso de popularidad, y la "credibilidad" no es un criterio de validez objetivo.
Martin Ender
5

PHP 5.4, 549 bytes

Algo obstaculizado por la necesidad de definir flechas como gráficos, aquí está mi código PHP:

<? $i=$argv[1];$p="R0lGODdhBQAFAIAAAP///wAAACwAAAAABQAFAAAC";$a=[$p."BwRiicGsDwoAOw",$p."CEQeoLfmlhQoADs",$p."CARiF8hnmGABADs",$p."CIwDBouYvGIoADs",$p."BwRil8Gs+QoAOw",$p."CIQRYcqrnkABADs",$p."CARihscYn1YBADs",$p."CAx+Bmq6HWIBADs"];$c=[$i&7,$i>>3&7,$i>>6&7,$i>>9];$m=imagecreate(120,120);imagecolorallocate($m,255,255,255);foreach($a as$_)$z[]=imagecreatefromstring(base64_decode($_));for($y=0;$y<8;$y++)for($x=0;$x<8;$x++)imagecopy($m,$z[($c[0]*(7-$x)*(7-$y)+$c[1]*$x*(7-$y)+$c[2]*(7-$x)*$y+$c[3]*$x*$y)/49%8],$x*15+5,$y*15+5,0,0,5,5);imagepng($m);

Toma su argumento de la línea de comando, como:

php windmap.php 123

Esta solución utilizará la entrada como la definición de las cuatro esquinas. El resto del mapa se interpolará suavemente entre los valores. ¡Ha definido resultados para todos los valores de 0 a 4095, un total de ~ 11.25 años de pronóstico falso, que debería ser tiempo más que suficiente para arreglar el software meteorológico!

Aquí hay un GIF de todos los resultados:

¡Aire caliente!

Y un ZIP que contiene cada mapa se puede descargar aquí

(Pequeña nota: mi dominio expiró recientemente porque no estaba prestando atención. Lo he renovado, pero la imagen y el enlace anteriores pueden no funcionar hasta que se actualice el DNS)

No calificado:

<?php
$input = $argv[1];
$prefix = "R0lGODdhBQAFAIAAAP///wAAACwAAAAABQAFAAAC";
$arrows = [
    $prefix."BwRiicGsDwoAOw", // E
    $prefix."CEQeoLfmlhQoADs", // NE
    $prefix."CARiF8hnmGABADs", // N
    $prefix."CIwDBouYvGIoADs", // NW
    $prefix."BwRil8Gs+QoAOw", // W
    $prefix."CIQRYcqrnkABADs", // SW
    $prefix."CARihscYn1YBADs", // S
    $prefix."CAx+Bmq6HWIBADs", // SE
];
$points = [
    $input & 7,
    $input >> 3 & 7,
    $input >> 6 & 7,
    $input >> 9 // input beyond 0o7777 (4095) will be undefined due to lack of & 7 here
];
$img = imagecreate(120,120);
imagecolorallocate($img,255,255,255);
$arrowimgs = [];
foreach($arrows as $src) {
    $arrowimgs[] = imagecreatefromstring(base64_decode($src));
}
for($y=0; $y<8; $y++) {
    for($x=0; $x<8; $x++) {
        $point = (
              $points[0] * (7-$x)/7 * (7-$y)/7
            + $points[1] *   $x  /7 * (7-$y)/7
            + $points[2] * (7-$x)/7 *   $y  /7
            + $points[3] *   $x  /7 *   $y  /7
        ) % 8;
        imagecopy($img,$arrowimgs[$point],$x*15+5,$y*15+5,0,0,5,5);
    }
}
imagepng($img,"out.png");
Niet the Dark Absol
fuente
¿Cómo funciona la interpolación?
falla
@flawr Toma una aproximación de la distancia a cada esquina y la usa como un peso para determinar cuánto debería afectar el valor de esa esquina al valor del punto actual.
Niet the Dark Absol
¿Pero en este caso cada flecha debería apuntar hacia el centro en el cuadro 1647? tinyurl.com/o7z9grl
flawr
1
@flawr Mire hacia abajo en la columna de la izquierda para ver cómo se "interpola" de 7 (SE) a 1 (NE) pasando por todos los valores 6, 5, 4, 3, 2 ... en oposición al más corto "7, 0, 1 "que puede esperar. El algoritmo no es lo suficientemente sofisticado como para interpolar con una rotación como esa.
Niet the Dark Absol
¡Ah, así es como lo resolviste! Esto es realmente bueno, ya que la interpolación con '7,0,1' habría resultado en un campo de flecha no válido =) +1 para los gráficos de flecha.
flawr