予測を偽る


15

新しい天気予報スーパーコンピューターが到着しましたが、機能しません。

それまでの間、上司は、毎日の風のマップを偽造して、技術者を購入することを望んでいます。

あなたの仕事は、風の方向を表す矢印のグリッドを描くことです。

グリッドは次のとおりです。

  • 15pxの正方形のタイルで構成されています
  • 8タイルx 8タイル
  • 合計120px平方
  • 000背景

各グリッドタイルには、風向を表す8つの可能な方向があります。

  1. 北東
  2. 南東
  3. 南西
  4. 西
  5. 北西

次のように描写する必要があります。

N N NE NE E E SE SE S S SW SW W W NWNW

信じられるためにマップは徐々に変化しなければなりません

つまり、各タイルは、隣接するタイルと1ステップだけ異なる場合があります。具体的には:

  • タイルは、隣接する4つのタイルのそれぞれから1増分または減分だけ異なることができます。(または、サイドタイルの場合は3、コーナータイルの場合は2)。
  • たとえば、隣接するEを持つタイルは、NE、E、またはSEである可能性があります(他の近隣と一致すると仮定します)。
  • 方向はループバックできます。つまり、N-> NWおよびNW-> Nです。

説明のために、次のマップが有効です。

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 

マップは一意である必要があり、異なる入力に対して同じマップを生成しないでください。

  • 入力は、現在から予測までの日数に対応する整数です(たとえば、明日の予測は1、1年は365です)。
  • 出力は、イメージとしてのマップです。
  • 出力は再現可能である必要があり、同じ入力は常に同じ出力を提供します
  • 少なくとも8年間は一意のマップを指定する必要があります。つまり、1〜2920の入力に対して同一の出力はありません(うるう年は無視します)。
  • 2920を超える入力に対して定義された出力はありません。

受賞作品は、ソースコードのバイト数が最も少ない有効なマップ(2920日まで)を生成します。


処理する必要がある最大入力は何ですか?たとえば、2つの連続したウェイの予測も最大金額だけ異なる必要があるという制限はありますか?
インゴバーク14

処理する必要がある最大入力は2920です。連続予測に制限はありません(一意である必要があることを除きます)
jsh 14

ああ、すみません、最後の箇条書きを見落としていたに違いありません。:)
IngoBürk14年

8
少し外れたトピック:天気予報をしている友人にこれを見せたところ、彼は、天気予報アプリから無料の天気データを取得しているだけなので、ここでやっている天気アプリよりも優れていないものがあると言った多くの場合、これらの補間は単にひどいものです。
flawr 14

2
「新しい天気予報スーパーコンピューターが到着しましたが、機能しません。」International Journal of Climate Scienceに提出してください。それはコースのパーになります。:P
COTO 14

回答:


4

BBC Basic、83 ASCII文字、トークン化ファイルサイズ72

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

これは基本的にMartinの概念の移植ですが、BBCベーシックの実装は非常に異なります。私は数字のフォントプログラムし直す01、出力のバイナリ桁n逆の順序でを。

ゴルフされていないコードは次のとおりです。BBC Basicでは、VDUコマンドを使用して個々のASCII文字を印刷できますが、言語にはエスケープシーケンスに似ていますが、印刷できない文字で始まる一連のマシン固有のコードがあります。フォントの再プログラミングでは、ASCII 23から始めます。通常は8ビット値が使用されますが、コンマの代わりにセミコロンを区切り文字として使用する場合、16ビットのリトルエンディアン値が使用されます(ゴルフバージョンで使用)。

  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.

出力

0から7までの数字については、フォントはプログラムの終了時にリセットされないため、最初の2つの例では0と1の数字が矢印として表示されます。 ここに画像の説明を入力してください


良いアイデア!:)しかし、タイルは15x15ですか?
マーティンエンダー14

@MartinBüttnerBBC basicを使用すると、8x8グリッド上のフォントを再定義できます。数字を小さく保つために、認識可能な最小の東矢印(グリッドの右上隅に5x5を押し込んだ)を実行し、最も似た北東矢印を作成しました。ここで使用されているスクリーンモードでは、定義はピクセルと1:1で対応しています(行間に十分なギャップがあります)が、Windowsペイントでグリッドサイズを2倍にして、SEでより良いサイズの画像を取得します。BBCベーシックの他の画面モードには、グリッド要素ごとに1ピクセルを超えるものがあり、ユーザー定義の文字は通常のフォントよりもかなり粗いです。
レベルリバーセント14

23

Matlab(182 *)

入力はに保存されていると想定されnます。アルゴリズムを見て、結果が一意になるかどうかはわかりませんが、結果n=1 upto 3000が一意であり、ルールを満たすことを確認しました。基本的に、単位円の複素数を使用し、ガウスフィルターを使用してconv2でそれらを「平滑化」します。その後、8つの可能な方向に「丸め」られます。

*出力を特定のピクセル数にスケーリングする方法がわからないため、手動で行う必要があります= /

編集:チェックプログラムが間違った解決策(1ステップ以上の変更)を認識しなかった場合があることを発見しましたが、別の解決策を見つけようとしています。

入力:

n = 1

コード:

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

ベクトル場


「出力を特定のピクセル数にスケーリングする」、矢印、または画像をスケーリングするということはどういう意味ですか?
krs013 14

@ krs013私は画像全体をスケーリングすることを意味しますが、例えば正確に8 * 16ピクセルの幅を持つようにする方法をまだ知りませんでした。
flawr

15

Mathematica、116 115バイト

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]

良い馬は、必要以上に高くジャンプすることはないでしょう。2920の異なるグリッドは、2つの方向のみを使用して非常に簡単に達成できます(私はとを使用NしていますNE)。のビットに基づいてNとNEを選択するだけなnので、実際には2が生成されます 64の異なる風のマップます。

最初の10個のマップは次のとおりです。

ここに画像の説明を入力してください

PS:私の当初のアイデアは、4つのコーナーの8 つの4つの組み合わせすべてを列挙し、残りのグリッドを「線形」補間することでした。それはおそらくより良いマップをもたらしたでしょうが、これは結局コードゴルフですので、私は最小要件を満たすもので行きました。


2 ^ 64 + 1グリッドを要求する必要がありました。:)
jsh 14

@jsh 2つの隣接する方向に8つの選択肢がありました。コードは多少長くなりますが、それでも同様に簡単で、2 ^ 67個の一意のグリッドが可能になります。しかし、心配しないでください、私はそれがまだ素晴らしいコードゴルフだと思います-グラフィック出力ゴルフをすることは(必要な客観性のために)難しく、あなたはそれでかなり良い仕事をしたと思います。
マーティンエンダー14

補間のアイデアは好きですが、4つの角のそれぞれが中心を指すとき、どのように補間しますか?
flawr 14

4
@MartinBüttner:これは技術的に仕様を満たしていますが、マップを信頼できるものにするというチャレンジの精神に反しているようです。ただの観察。
COTO 14

2
@COTO非常に真実ですが、それはまた、ゴルフをコーディングしており、人気コンテストではありません。また、「信ability性」は客観的な妥当性基準ではありません。
マーティンエンダー14

5

PHP 5.4、549バイト

矢印をグラフィックスとして定義する必要性によって多少妨げられましたが、ここに私の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);

次のようなコマンドラインから引数を取ります。

php windmap.php 123

このソリューションでは、4つのコーナーの定義として入力を使用します。マップの残りの部分は、値の間でスムーズに補間されます。0〜4095のすべての値の結果を定義しました。これは、総計で約11​​.25年の偽予報であり、気象ソフトウェアを修正するのに十分な時間を超えるはずです。

すべての結果のGIFは次のとおりです。

熱風!

また、各マップを含むZIPはこちらからダウンロードできます

(小さな注意:最近注意を払っていなかったため、私のドメインは失効しました。更新しましたが、上記の画像とリンクはDNSが更新されるまで機能しない可能性があります)

スキッシュされていない:

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

補間はどのように機能しますか?
flawr 14

@flawr各コーナーまでの距離を概算し、そのコーナーの値が現在のポイントの値にどの程度影響するかを重みとして使用します。
ニートザダークアブソル14

しかし、この場合、すべての矢印はフレーム1647の中央を指す必要がありますか?tinyurl.com/o7z9grl
flawr

1
@flawr左端の列を下に見て、すべての値6、5、4、3、2を介して7(SE)から1(NE)に「補間」されていることを確認してください。あなたが期待するかもしれない0、1 "。アルゴリズムは、そのような回転を補間するほど洗練されていません。
ニートザダークアブソル14

ああそれはあなたがそれを解決した方法です!「7,0,1」を挿入すると、矢印グラフィックの無効な矢印フィールド=)+1になるため、これは本当に素晴らしいことです。
flawr 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.