一年中最长的一天-这是浪费额外时间的东西.
注意,这不是一个受欢迎的竞赛,也不是一个图形输出挑战--你只需要输出65,536个0和1的字符串。问题底部的堆栈片段将显示为256乘256的黑白图像,并计算出您的官方分数。然后,您可以保存该图像并将其与代码一起上传到您的答案中(因为字符串输出将不适合于30万个字符的堆栈Exchange答案)。
图像的分数是单个像素的分数之和。单个像素的分数是与被评分像素颜色相反的每个非正交素数距离像素的子分数之和。每个像素的子分数是1/p,其中p是素数距离。
在这个问题上,这些术语有以下定义:
sqrt(2)与右下角像素之间的距离(所有四个边缘都是环绕的)。Stack代码片段包括示例代码,这些代码显示如何为图像评分,但不包括任何优化或有效的方法,只需正确的代码就可以对最终图像进行一致的评分。
如果代码中有不正确的地方,请在注释或聊天中告诉我。
JavaScript可能不一定是解决这一特殊挑战的最佳语言。请注意,代码片段无意给出任何关于更快方法的线索。它只会带来已经在现有答案中得到证明的效率。
为了直观地感觉评分像素的分布,这里(紫色)是256×256图像像素(128,128)的非正交素数距离像素:

这是示例Python3答案中随机生成的图像。它的得分为138,267.64,给了你一些可以击败的东西。

代码不需要输入。
代码应该输出65,536个零和1的字符串,表示一个黑白256乘256图像的像素。数字应该是一个连续字符串,没有分隔符。如果输出到文件,您可能会发现复制和粘贴更容易,但这取决于您。
您的代码还可能输出其他您认为有用的信息,只要字符串可以被复制并粘贴到堆栈片段中。例如,您可能希望定期将最好的字符串输出到文件中,并将最好的分数输出到STDOUT,这样用户就可以选择何时停止搜索。
正如Sp3000所指出的,这个片段需要10分钟才能计算出一个分数,这有点太慢了,即使对于一个故意低效率的引用实现来说也是如此。我已经编辑了在Sp3000's建议改进预计算像素偏移的得分,现在需要几秒钟来计算一个分数。
canvas = document.getElementById('canvas')
ctx = canvas.getContext('2d')
scoreArea = document.getElementById('scoreArea')
pastedData = document.getElementById('pastedData')
timeout = 0
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499]
primesSquared = []
for (i=0; i<primes.length; i++) {
primesSquared.push(primes[i] * primes[i])
}
width = canvas.width
height = canvas.height
area = width * height
scoringFilter = calculateScoringFilter()
function calculateScore() {
var percentage = Math.floor(currentIndex / 65536 * 10000) / 100
scoreArea.value = 'Calculating:' + percentage + '%'
for (var t=0; t<1000; t++) {
if (currentIndex < 65536) {
partialScore += pixelScore(currentIndex)
currentIndex += 1
} else {
scoreArea.value = 'Score: ' + partialScore
return
}
}
timeout = setTimeout(calculateScore, 10)
}
function pixelScore(i) {
var score = 0
var x = i % width
var y = Math.floor(i / width)
var a, b, xd, yd, j, k, d, m
for (k=0; k<scoringFilter.length; k++) {
bundle = scoringFilter[k]
m = bundle[0]
a = m % width
b = Math.floor(m / width)
j = ((x+a) % width) + width * ((y+b) % height)
d = bundle[1]
score += Math.abs(pixels[i] - pixels[j]) / d
}
return score
}
function display(pixels) {
for (var i=0; i<area; i++) {
ctx.fillStyle = pixels[i] ? 'white' : 'black'
ctx.fillRect(i % width, Math.floor(i / width), 1, 1)
}
}
function stop() {
clearTimeout(timeout)
scoreArea.value = 'Calculation cancelled.'
}
function isPrimeSquared(n) {
return primesSquared.indexOf(n) > -1
}
function applyToImage() {
var potentialPixels = []
var pastedString = pastedData.value
if (pastedString.length !== 65536) {
scoreArea.value = 'Incorrect length:' + pastedString.length
return
}
var i, digit
for (i=0; i<pastedString.length; i++) {
digit = pastedString.substring(i, i + 1)
if (digit === '0') {
potentialPixels.push(0)
} else if (digit === '1') {
potentialPixels.push(1)
} else {
scoreArea.value = 'Invalid character ' + i + ':' + digit
return
}
}
pixels = potentialPixels
display(pixels)
scoreArea.value = 'Calculating score...'
partialScore = 0
currentIndex = 0
timeout = setTimeout(calculateScore, 10)
}
function calculateScoringFilter() {
var scoringFilter = []
var i, x, y, xd, yd
for (i=0; i<area; i++) {
x = i % width
y = Math.floor(i / width)
xd = Math.min(x,(-x+width)%width)
yd = Math.min(y,(-y+height)%height)
dSquared = xd*xd + yd*yd
if (xd && yd && isPrimeSquared(dSquared)) {
d = Math.sqrt(dSquared)
scoringFilter.push([i, d])
}
}
return scoringFilter
}<canvas id='canvas' width='256' height='256'></canvas>
<br>
<input id='scoreArea' rows='1' readonly></input>
<br>
<button onclick='applyToImage()'>Apply string to image</button>
<button onclick='stop()'>Stop</button>
<br>
<br>
Paste in string of 65,536 zeroes and ones here:
<br>
<input id='pastedData'></input>如果您使用输出或另一个答案的代码作为您自己的代码的起点,请记住给予信任并链接到支持答案。此问题的答案不需要归功于问题中的示例答案或代码。
发布于 2015-06-21 15:15:19
这是一个最低限度的答案,作为一个例子,什么是必要的,并作为某种东西,以击败.
它包括

from random import random
output_string = ''
filename = '65536digits.txt'
for t in range(65536):
digit = int(random() * 2)
output_string += str(digit)
with open(filename, 'w') as output_file:
output_file.write(output_string)这只是一个例子。Python不一定是解决这一特殊挑战的最佳语言。
https://codegolf.stackexchange.com/questions/51972
复制相似问题