예측 가짜


15

새로운 기상 예보 슈퍼 컴퓨터가 도착했지만 작동하지 않습니다.

그 동안 상사는 매일 바람지도를 가짜로하여 기술자를 언젠가 구매하기를 원합니다.

당신의 임무는 바람의 방향을 나타내는 화살표 격자를 그리는 것입니다.

그리드는 다음과 같습니다.

  • 15px 정사각형 타일로 구성
  • 8 타일 8 타일
  • 총 120px 제곱
  • 000 배경

각 그리드 타일에는 바람 방향을 나타내는 8 가지 잠재적 방향이 있습니다.

  1. 북쪽
  2. 북동
  3. 동쪽
  4. 남동
  5. 남쪽
  6. 남서
  7. 서쪽
  8. 북서

다음과 같이 표시되어야합니다.

N 엔 NE NE E 이자형 SE SE S 에스 SW SW W 여 NWNW

믿을 수 있으려면 지도가 점진적 으로 달라져야합니다.

이것은 각 타일이 한 단계 씩 이웃 타일과 다를 수 있음을 의미합니다. 구체적으로 특별히:

  • 타일은 인접한 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은 내일의 예측, 365는 1 년 시간).
  • 출력은 이미지로서 맵입니다.
  • 출력은 재현 가능해야하며 동일한 입력은 항상 동일한 출력을 제공합니다
  • 최소 8 년 동안 고유 한 맵을 제공해야합니다. 즉 1에서 2920 사이의 입력에 대해 동일한 출력이 없어야합니다 (윤년을 무시하고 있습니다).
  • 2920보다 큰 입력에 대해서는 정의 된 출력이 없습니다.

우승 작은 가장 적은 바이트의 소스 코드로 유효한지도 (2920 일까지)를 생성합니다.


처리해야하는 최대 입력은 얼마입니까? 예를 들어, 두 가지 연속적인 방법의 예측이 최대량만큼만 달라야하는 제한이 있습니까?
Ingo Bürk

처리해야하는 최대 입력은 2920 입니다. 연속적인 예측에는 제한이 없습니다 (독특해야 함을 제외하고)
jsh

죄송합니다. 마지막 글 머리 기호를 간과해야합니다. :)
Ingo Bürk

8
약간 벗어난 주제 : 일기 예보 전문가 인 친구에게이 정보를 보여 주었고, 날씨 정보를 무료로 가져 오기 때문에 여기서 얻을 수있는 날씨 앱 중 일부는 우리가 여기서하는 것보다 훨씬 나쁘지 않다고 말했습니다. 큰 공항을 보간하고 보간하는 것보다 더 자주 보간하지 않습니다.
flawr

2
"슈퍼 컴퓨터를 예측하는 새로운 날씨가 도착했지만 작동하지 않습니다." 국제 기후 과학 저널에 제출하십시오. 과정에 필적 할 것입니다. : P
COTO

답변:


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역순으로합니다.

ungolfed 코드는 다음과 같습니다. BBC 기본에서는 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의 경우 프로그램 종료시 글꼴이 재설정되지 않으므로 숫자 0과 1은 처음 두 예제에서 화살표로 나타납니다. 여기에 이미지 설명을 입력하십시오


좋은 생각! :) 그러나 타일은 15x15입니까?
마틴 엔더

@ MartinBüttner BBC basic에서는 8x8 그리드에서 글꼴을 재정의 할 수 있습니다. 숫자를 작게 유지하기 위해 인식 가능한 가장 작은 동쪽 화살표 (그리드의 오른쪽 상단 모서리에 압착 된 5x5)를 수행하고 가장 유사한 동북 화살표를 만들었습니다. 여기에 사용 된 화면 모드에서 정의는 픽셀과 1 : 1 대응하고 행 사이에 충분한 간격을 두지 만 Windows 페인트의 격자 크기를 두 배로 늘려 SE에서 더 나은 크기의 이미지를 얻습니다. BBC 기본의 다른 화면 모드 중 일부는 그리드 요소 당 1 픽셀 이상을 가지며 사용자 정의 문자는 일반 글꼴보다 눈에 띄게 더 거칩니다.
Level River St

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

@ krs013 전체 이미지의 크기를 조정하는 것을 의미합니다. 예를 들어 정확히 8 * 16 픽셀의 너비를 갖는 방법을 아직 찾지 못했습니다.
flawr

15

매쓰, 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 개의 서로 다른 그리드는 두 방향 (I N및 m을 사용 하고 있음 NE) 만 사용하여 매우 쉽게 달성 할 수있어 연속성 규칙을 간단하게 충족시킵니다. 의 비트를 기반으로 N과 NE 중 하나를 선택 n하기 때문에 실제로는 2 개의 64 개의 다른 바람지도 가 생성 됩니다.

처음 10 개의지도는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

추신 : 내 원래 아이디어는 4 개의 모서리에 대해 8 개의 4 개의 조합을 모두 열거 하고 나머지 그리드를 "선형으로"보간하는 것이 었습니다 . 아마도 더 멋진 맵을 만들었을 것입니다. 그러나 이것은 결국 코드 골프입니다. 그래서 나는 최소 요구 사항을 충족시키는 것으로갔습니다.


2 ^ 64 + 1 그리드를 요청해야했습니다. :)
jsh

@ jsh 나는 두 개의 인접한 방향에 대해 8 가지 선택을했습니다. 코드가 다소 길어졌지만 여전히 비슷해졌으며 2 ^ 67 고유 그리드를 허용합니다. 그러나 걱정하지 마십시오. 여전히 훌륭한 코드 골프라고 생각합니다. 그래픽 출력 골프를하는 것은 (필요한 객관성으로 인해) 어렵다고 생각합니다.
마틴 엔더

보간에 대한 아이디어가 마음에 들지만 네 모서리가 각각 중심을 가리킬 때 어떻게 보간 했습니까?
flawr

4
@ MartinBüttner : 기술적으로 사양을 충족하지만 도전의 정신에 위배되는 것 같습니다.지도를 믿을 수있게 만드는 것입니다. 단지 관찰.
COTO

2
@COTO 매우 사실이지만 코드 골프이며 인기 경연 대회가 아니며 "신뢰성"은 객관적인 유효성 기준이 아닙니다.
마틴 엔더

5

PHP 5.4, 549 바이트

화살표를 그래픽으로 정의해야 할 필요성에 방해가 된 부분은 다음과 같습니다.

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

이 솔루션은 입력을 네 모서리의 정의로 사용합니다. 나머지 맵은 값 사이에 부드럽게 보간됩니다. 그것은 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

@flawr 각 모퉁이까지의 거리를 근사값으로 계산하여 해당 모퉁이 값이 현재 포인트 값에 영향을 미치는 정도를 가중치로 사용합니다.
어둠의 절대자 니트

그러나이 경우 모든 화살표는 프레임 1647에서 가운데를 가리켜 야합니까? tinyurl.com/o7z9grl
flawr

1
@flawr 가장 왼쪽의 열을 살펴보면 더 짧은 "7, 0, 1 "예상 할 수 있습니다. 알고리즘은 그런 회전으로 보간하기에 충분히 정교하지 않습니다.
암흑의 절대자

아 그게 당신이 어떻게 해결! '7,0,1'의 보간으로 인해 화살표 그래픽에 잘못된 화살표 필드 =) +1이 발생했기 때문에 이것은 정말 좋습니다.
flawr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.