Sahte tahmin


15

Süper bilgisayarı tahmin eden yeni hava durumu geldi ve çalışmıyor.

Bu arada patronunuz günlük rüzgar haritalarını taklit ederek teknisyenleri bir süre satın almanızı istiyor.

Göreviniz rüzgar yönünü temsil eden bir ok ızgara çizmektir.

Izgara:

  • 15 piksel kare fayans
  • 8 kiremit 8 kiremit
  • Toplam 120 piksel kare
  • 000 arka plan

Her ızgara kiremitinin rüzgar yönünü temsil eden 8 potansiyel yönü vardır:

  1. Kuzeyinde
  2. Kuzeydoğu
  3. Doğu
  4. Güneydoğu
  5. güney
  6. Southwest
  7. Batı
  8. Kuzey Batı

Aşağıdaki gibi tasvir edilmelidir:

N N- NE NE E E SE GD S S SW GB W W NWNW

İnanılması için haritaların kademeli olarak değişmesi gerekir .

Bu, her bir döşemenin komşudan yalnızca bir adım farklı olabileceği anlamına gelir. özellikle:

  • Bir karo, bitişik 4 karonun her birinden yalnızca bir artış veya azalma ile farklılık gösterebilir. (veya yan fayanslar için 3, köşe fayanslar için 2).
  • örneğin, komşusu E olan bir karo NE, E veya SE olabilir (diğer komşularıyla uyumlu olduğu varsayılarak).
  • Yönler geri dönebilir, yani N -> NW ve NW -> N.

Bunu göstermek için aşağıdaki harita geçerlidir:

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 

Haritalar benzersiz olmalıdır , farklı girdiler için aynı haritayı oluşturmayın.

  • Girdi, şimdiki zaman ile tahmininiz arasındaki günlere karşılık gelen bir tamsayıdır (örneğin 1, yarının tahmini, 365 yılın zamanıdır).
  • Çıktı, görüntü olarak haritadır.
  • Çıktı yeniden üretilebilir olmalıdır, aynı girdi her zaman aynı çıktıyı verecektir
  • En az 8 yıl boyunca benzersiz haritalar vermelisiniz - yani 1 ile 2920 arasında herhangi bir girdi için aynı çıktı yok (artık yılları görmezden geliyorum).
  • 2920'den büyük herhangi bir giriş için tanımlanmış bir çıkış yoktur.

Kazanan gönderim, en az bayt kaynak koduna sahip geçerli haritalar (2920 gününe kadar) üretecektir.


Ele alınması gereken maksimum girdi nedir? Örneğin, birbirini izleyen iki yolun tahminlerinin sadece azami miktarda farklılık göstermesi konusunda bir kısıtlama var mı?
Ingo Bürk

Ele alınması gereken maksimum girdi 2920'dir . Ardışık tahminlerde herhangi bir kısıtlama yoktur (benzersiz olmaları dışında)
jsh

Üzgünüm, son kurşun noktasını göz ardı etmiş olmalıyım. :)
Ingo Bürk

8
Biraz konu dışı: Bunu hava tahmincisi olan bir arkadaşına gösterdim ve bana bu hava uygulamalarının bazılarının burada yaptığımızdan çok daha iyi olmadığını söyledi, çünkü görünüşe göre sadece ücretsiz hava durumu verilerini alıyorlar. büyük havaalanları ve enterpolasyon, çoğu zaman bu enterpolasyonlar sadece emmek.
Kusur

2
"Süper bilgisayarı tahmin eden yeni hava durumu geldi ve çalışmıyor." Uluslararası İklim Bilimi Dergisi'ne gönderin. Kurs için eşit olacak. : P
COTO

Yanıtlar:


4

BBC Basic, 83 ASCII karakter, simge dosya boyutu 72

Emülatörü http://www.bbcbasic.co.uk/bbcwin/bbcwin.html adresinden indirin.

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

Bu temelde Martin konseptinin bir limanıdır, ancak BBC basic'deki uygulama çok farklıdır. Yazı tipini sayılar için yeniden programlıyorum 0ve 1sonran ters sırada .

Ungolfed kodu aşağıda. BBC basic'de, VDUkomutu kullanarak ayrı ASCII karakterlerini yazdırabilirsiniz , ancak dil, kaçış dizilerine benzer, ancak yazdırılamayan karakterlerle başlayan bir dizi makineye özgü kod içerir. Yazı tipini yeniden programlamak için ASCII 23 ile başlıyoruz. Normalde 8 bitlik değerler alınır, ancak virgül yerine ayırıcı olarak noktalı virgül kullanırsanız, 16 bitlik küçük endian değerleri alır (golf edilmiş sürümde olduğu gibi).

  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.

Çıktı

0 ile 7 arasındaki sayılar için, programın sonunda yazı tipinin sıfırlanmadığına dikkat edin, bu nedenle ilk iki örnekte 0 ve 1 sayıları ok olarak görünür. resim açıklamasını buraya girin


İyi fikir! :) Ama fayans 15x15 mi?
Martin Ender

@ MartinBüttner BBC basic, 8x8 ızgarada bir fontu yeniden tanımlamanızı sağlar. Sayıları küçük tutmak için en küçük doğu okunu (ızgaranın sağ üst köşesine sıkıştırılmış 5x5) yaptım ve en benzer görünümlü kuzeydoğu okunu yaptım. Burada kullanılan ekran modunda, tanım piksellerle 1: 1 yazışmalara sahiptir (ve satırlar arasında geniş bir boşluk bırakır), ancak SE'de daha iyi bir görüntü elde etmek için Windows Paint'teki ızgara boyutunu iki katına çıkardım. BBC basic'deki diğer ekran modlarından bazıları ızgara öğesi başına 1 pikselden fazladır ve kullanıcı tanımlı karakterler normal yazı tipinden belirgin şekilde daha grenlidir.
Level River St

23

Matlab (182 *)

Girişin saklandığı varsayılmaktadır n. Algoritmaya baktığımızda, sonuçların benzersiz olacağından emin değilim, ancak n=1 upto 3000benzersiz olduklarını ve kurallara uyduğunu kontrol ettim . Temelde sadece birim çemberin karmaşık sayılarını kullanıyorum ve bunları bir gauss filtresi ile conv2 ile 'düzleştiriyorum'. Bundan sonra 8 olası yöne 'yuvarlanır'.

* Çıktıyı belirli sayıda piksele nasıl ölçekleyeceğimi bilmiyorum, bu yüzden manuel olarak yapılması gerekiyor = /

EDIT: Ben sadece benim kontrol programı yanlış çözümler (1 adımdan fazla değişiklikler) tanımadığı durumlarda olduğunu keşfettim, ama başka bir çözüm bulmaya çalışıyorum.

Giriş:

n = 1

Kod:

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

Vektör alanı


"Çıktıyı belirli sayıda piksele ölçekle", okları veya resmi ölçeklendirerek ne demek istersiniz?
krs013

@ krs013 Yani tüm görüntüyü ölçeklemek, henüz tam olarak 8 * 16 piksel genişliğe sahip olacak şekilde nasıl yapılacağını bulamadım.
Kusur

15

Mathematica, 116115 bayt

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]

Sanırım iyi bir at asla gerekenden daha yükseğe zıplamaz. 2920 farklı ızgara, sadece iki yön ( Nve kullanıyorum NE) kullanarak çok kolay bir şekilde elde edilir , bu da süreklilik kuralını karşılamayı önemsiz hale getirir. Ben sadece bitleri dayalı N ve NE arasında seçim n, bu yüzden aslında 2 64 üretecek farklı rüzgar haritası .

İşte ilk on harita:

resim açıklamasını buraya girin

PS: Benim asıl fikrim 4 köşe için tüm 8 4 kombinasyonları numaralandırmak ve ızgara geri kalanı "doğrusal" enterpolasyon oldu. Bu muhtemelen daha güzel haritalar ile sonuçlanmış olurdu, ama sonuçta bu kod golf, bu yüzden minimum gereksinimleri yerine ne ile gitti.


Ben 2 ^ 64 + 1 ızgara istedi istedi. :)
jsh

@jsh İki bitişik yön için 8 seçeneğim vardı. Kodu biraz daha uzun yapardı, ama yine de benzer şekilde kolay olurdu ve 2 ^ 67 benzersiz ızgaraya izin verecekti. Ama merak etmeyin, ben hala güzel bir kod golf düşünüyorum - grafik çıktı golf yapmak zor (gerekli nesnellik nedeniyle) ve onunla oldukça iyi bir iş yaptığını düşünüyorum.
Martin Ender

İnterpolasyon fikrini seviyorum, ancak dört köşenin her biri merkeze işaret ettiğinde nasıl enterpolasyon yapardınız?
Kusur

4
@ MartinBüttner: Bu teknik olarak teknik özellikleri karşılasa da, haritayı inandırıcı kılmak için meydan okuma ruhuna aykırı görünüyor. Sadece bir gözlem.
COTO

2
@COTO Çok doğru, ama aynı zamanda bir popülerlik yarışması değil, aynı zamanda golf kod ve "inanılırlık" nesnel bir geçerlilik kriteri değildir.
Martin Ender

5

PHP 5.4, 549 bayt

Okları grafik olarak tanımlama gereği biraz engellendi, işte benim PHP kodum:

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

Argümanı komut satırından alır, örneğin:

php windmap.php 123

Bu çözüm girişi dört köşenin tanımı olarak kullanacaktır. Haritanın geri kalanı değerler arasında sorunsuz bir şekilde enterpole edilecektir. Hava durumu yazılımını düzeltmek için yeterli zamandan fazla olması gereken toplam ~ 11.25 yıllık sahte tahmin olan 0 ila 4095 arasındaki tüm değerler için sonuçlar tanımladı!

İşte tüm sonuçların bir GIF'i:

Sıcak hava!

Ve her haritayı içeren bir ZIP buradan indirilebilir

(Küçük not: Alanımın süresi dolmuştu çünkü dikkat etmiyordum. Yeniledim, ancak yukarıdaki resim ve bağlantı DNS güncellenene kadar çalışmayabilir)

Unsquishified:

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

İnterpolasyon nasıl çalışır?
Kusur

@flawr Her köşeye olan mesafenin yaklaşık bir değerini alır ve bunu, o köşenin değerinin geçerli noktanın değerini ne kadar etkilemesi gerektiğine dair bir ağırlık olarak kullanır.
Niet the Dark Absol

Fakat bu durumda, her ok 1647 karesinde ortayı göstermelidir? tinyurl.com/o7z9grl
flawr

1
@flawr Daha kısa "7 yerine, 6, 5, 4, 3, 2 ... tüm değerlerini gözden geçirerek 7 (SE) 'den 1 (NE)' e" enterpolasyon "nasıl olduğunu görmek için en soldaki sütuna bakın. 0, 1 "bekleyebilirsiniz. Algoritma böyle bir rotasyonla enterpolasyon sağlayacak kadar sofistike değildir.
Niet the Dark Absol

Ah bu nasıl çözdün! Bu gerçekten güzel, çünkü '7,0,1' ile olan enterpole ok grafikleri için =) +1 geçersiz bir ok alanı ile sonuçlanacaktır!
Kusur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.