首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >素Nerd剪模式

素Nerd剪模式
EN

Code Golf用户
提问于 2015-06-21 15:15:19
回答 1查看 3.4K关注 0票数 16

一年中最长的一天-这是浪费额外时间的东西.

概述

注意,这不是一个受欢迎的竞赛,也不是一个图形输出挑战--你只需要输出65,536个0和1的字符串。问题底部的堆栈片段将显示为256乘256的黑白图像,并计算出您的官方分数。然后,您可以保存该图像并将其与代码一起上传到您的答案中(因为字符串输出将不适合于30万个字符的堆栈Exchange答案)。

评分

图像的分数是单个像素的分数之和。单个像素的分数是与被评分像素颜色相反的每个非正交素数距离像素的子分数之和。每个像素的子分数是1/p,其中p是素数距离。

在这个问题上,这些术语有以下定义:

  • 非正交的:如果像素不在同一行,且不在同一列,则它与正在得分的像素是非正交的。
  • 素数距离:一个像素与被打分的像素之间的素数距离,如果用一个欧几里得距离来分隔,那正是一个素数。特别是,距离是测量的最小距离,左上角像素是sqrt(2)与右下角像素之间的距离(所有四个边缘都是环绕的)。
  • 相反颜色:如果像素的值之和为1,则像素的颜色与被评分像素的颜色相反。也就是说,第一个是0,第二个是1,或者第一个是1,第二个是0。

Stack代码片段包括示例代码,这些代码显示如何为图像评分,但不包括任何优化或有效的方法,只需正确的代码就可以对最终图像进行一致的评分。

如果代码中有不正确的地方,请在注释或聊天中告诉我。

JavaScript可能不一定是解决这一特殊挑战的最佳语言。请注意,代码片段无意给出任何关于更快方法的线索。它只会带来已经在现有答案中得到证明的效率。

Visualisation

得分像素

为了直观地感觉评分像素的分布,这里(紫色)是256×256图像像素(128,128)的非正交素数距离像素:

随机图像

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

输入

代码不需要输入。

输出

代码应该输出65,536个零和1的字符串,表示一个黑白256乘256图像的像素。数字应该是一个连续字符串,没有分隔符。如果输出到文件,您可能会发现复制和粘贴更容易,但这取决于您。

您的代码还可能输出其他您认为有用的信息,只要字符串可以被复制并粘贴到堆栈片段中。例如,您可能希望定期将最好的字符串输出到文件中,并将最好的分数输出到STDOUT,这样用户就可以选择何时停止搜索。

堆栈片段

正如Sp3000所指出的,这个片段需要10分钟才能计算出一个分数,这有点太慢了,即使对于一个故意低效率的引用实现来说也是如此。我已经编辑了在Sp3000's建议改进预计算像素偏移的得分,现在需要几秒钟来计算一个分数。

代码语言:javascript
复制
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
}
代码语言:javascript
复制
<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>

如果您使用输出或另一个答案的代码作为您自己的代码的起点,请记住给予信任并链接到支持答案。此问题的答案不需要归功于问题中的示例答案或代码。

这是兰德尔·蒙罗的功劳未定义

EN

回答 1

Code Golf用户

发布于 2015-06-21 15:15:19

Python 3,得分138267.64

这是一个最低限度的答案,作为一个例子,什么是必要的,并作为某种东西,以击败.

它包括

  • 语言名称。
  • 问题中堆栈片段的得分。
  • 从堆栈片段中保存的图像。
  • 用于生成65,536个零和1的字符串的代码。

输出

代码语言:javascript
复制
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不一定是解决这一特殊挑战的最佳语言。

票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/51972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档