首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NX源长度问题

NX源长度问题
EN

Code Golf用户
提问于 2018-02-05 23:00:19
回答 2查看 738关注 0票数 17

在PPCG上,我们遇到了许多挑战:输出的长度取决于源代码的长度。为了这个挑战,我们将把这些源长度问题称为“源长度问题”。两个最著名的源文件长度问题的例子是

更简单地说,NX源代码长度问题是创建一个输出恰好是源代码长度N倍(X)的程序的挑战。甚至有一些关于这类挑战的变体,例如

虽然实现起来相当简单,但这些通常都很有趣。然而,我们从来没有一个广义源长度问题。直到今天。以下是您今天的挑战:

给定一个正整数N,用同一种语言输出一个NX源长度问题的答案.

例如,假设您用语言foo编写了一个提交。如果您的程序或函数被赋予输入3,则必须输出一个新的foo程序或函数s,该程序或函数不需要输入,并且输出的长度正好是s的3倍。借用马丁关于第一次挑战的规则,这里有一些要求:

  • 您的代码和您的S可以使用任何一致的编码,您喜欢。但是,S只能在可打印的ASCII范围(0x20到0x7E (包括在内)或换行符(0x0A或0x0D)中输出字节。
  • S不能是quine,所以代码和输出必须至少有一个字节的不同。
  • S必须至少有一个字节长。
  • 如果输出包含尾换行符,则这些行是字节计数的一部分。
  • 只要您能够证明每个可能的输出都满足上述要求,输出就不一定总是相同的。
  • 通常的奎因规则不适用。您可能会阅读源代码或其大小,但我怀疑这将比硬编码它在大多数语言。

加上我自己的一些规则

  • 错误输出不计入输出长度。
  • 如果您的解决方案由于整数大小限制而导致大N失败,这是可以的。请记住,这并不意味着您可以滥用本机号码类型

我强烈建议用不同数字的输入来测试代码,因为对于1位Ns有效的简单方法对于2位Ns来说是失败的。还请包括一个解释,说明你如何知道你的程序是有效的。虽然这不是强制性的,但还是受到鼓励的。

由于这个任务在REPL语言中要容易得多,如果您在REPL中做了答案,请将您的答案发布为

代码语言:javascript
复制
# Foo REPL, N bytes

所以它与foo中的常规答案是不同的。

当然,由于这是一个密码-高尔夫挑战,请尽可能以字节编写最短的答案!

主板

请将您的答案格式化如下,以便它出现在主板上:

代码语言:javascript
复制
# <Language-name>, <n> bytes

    code
    code
代码语言:javascript
复制
/* Configuration */

var QUESTION_ID = 154961; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 31716; // This should be the user ID of the challenge author.

/* App */

var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;

function answersUrl(index) {
  return "https://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

function commentUrl(index, answers) {
  return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}

function getAnswers() {
  jQuery.ajax({
    url: answersUrl(answer_page++),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      answers.push.apply(answers, data.items);
      answers_hash = [];
      answer_ids = [];
      data.items.forEach(function(a) {
        a.comments = [];
        var id = +a.share_link.match(/\d+/);
        answer_ids.push(id);
        answers_hash[id] = a;
      });
      if (!data.has_more) more_answers = false;
      comment_page = 1;
      getComments();
    }
  });
}

function getComments() {
  jQuery.ajax({
    url: commentUrl(comment_page++, answer_ids),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      data.items.forEach(function(c) {
        if (c.owner.user_id === OVERRIDE_USER)
          answers_hash[c.post_id].comments.push(c);
      });
      if (data.has_more) getComments();
      else if (more_answers) getAnswers();
      else process();
    }
  });  
}

getAnswers();

var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;

var OVERRIDE_REG = /^Override\s*header:\s*/i;

function getAuthorName(a) {
  return a.owner.display_name;
}

function process() {
  var valid = [];
  
  answers.forEach(function(a) {
    var body = a.body;
    a.comments.forEach(function(c) {
      if(OVERRIDE_REG.test(c.body))
        body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
    });
    
    var match = body.match(SCORE_REG);
    if (match)
      valid.push({
        user: getAuthorName(a),
        size: +match[2],
        language: match[1],
        link: a.share_link,
      });
    else console.log(body);
  });
  
  valid.sort(function (a, b) {
    var aB = a.size,
        bB = b.size;
    return aB - bB
  });

  var languages = {};
  var place = 1;
  var lastSize = null;
  var lastPlace = 1;
  valid.forEach(function (a) {
    if (a.size != lastSize)
      lastPlace = place;
    lastSize = a.size;
    ++place;
    
    var answer = jQuery("#answer-template").html();
    answer = answer.replace("{{PLACE}}", lastPlace + ".")
                   .replace("{{NAME}}", a.user)
                   .replace("{{LANGUAGE}}", a.language)
                   .replace("{{SIZE}}", a.size)
                   .replace("{{LINK}}", a.link);
    answer = jQuery(answer);
    jQuery("#answers").append(answer);

    var lang = a.language;
    lang = jQuery('<a>'+lang+'</a>').text();
    
    languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
  });

  var langs = [];
  for (var lang in languages)
    if (languages.hasOwnProperty(lang))
      langs.push(languages[lang]);

  langs.sort(function (a, b) {
    if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
    if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
    return 0;
  });

  for (var i = 0; i < langs.length; ++i)
  {
    var language = jQuery("#language-template").html();
    var lang = langs[i];
    language = language.replace("{{LANGUAGE}}", lang.lang)
                       .replace("{{NAME}}", lang.user)
                       .replace("{{SIZE}}", lang.size)
                       .replace("{{LINK}}", lang.link);
    language = jQuery(language);
    jQuery("#languages").append(language);
  }

}
代码语言:javascript
复制
body {
  text-align: left !important;
  display: block !important;
}

#answer-list {
  padding: 10px;
  width: 290px;
  float: left;
}

#language-list {
  padding: 10px;
  width: 290px;
  float: left;
}

table thead {
  font-weight: bold;
}

table td {
  padding: 5px;
}
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=ffb5d0584c5f">
<div id="language-list">
  <h2>Shortest Solution by Language</h2>
  <table class="language-list">
    <thead>
      <tr><td>Language</td><td>User</td><td>Score</td></tr>
    </thead>
    <tbody id="languages">

    </tbody>
  </table>
</div>
<div id="answer-list">
  <h2>Leaderboard</h2>
  <table class="answer-list">
    <thead>
      <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
    </thead>
    <tbody id="answers">

    </tbody>
  </table>
</div>
<table style="display: none">
  <tbody id="answer-template">
    <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>
<table style="display: none">
  <tbody id="language-template">
    <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>
EN

回答 2

Code Golf用户

发布于 2018-02-06 03:10:58

,4字节

代码语言:javascript
复制
;“ x

对于输入n,这将打印程序n x

在网上试试!

程序n x将其参数和返回值设置为n,然后执行x原子以重复n次,从而产生n's数组。

在网上试试!

有效性证明

D是n的数字数,所以程序n x是d+2字节长。

Python3(因此,M)打印n个类似于[n, ..., n]的数组。

由于n的所有n个拷贝都是d字节长,所以n的前n-1拷贝后面跟着, (2字节),[]包围数组(2字节),输出是nd + 2(n-1) +2= nd + 2n = n(d+2)字节。

票数 9
EN

Code Golf用户

发布于 2018-02-06 03:13:13

Python 2,56字节

代码语言:javascript
复制
f=lambda n:"print`f`*"+`n*n`+','+'#'*(33*n-9-len(`n*n`))

创建窗体的字符串。

代码语言:javascript
复制
print`f`*<number>################...#####

其中的数字是n^2,并且有足够的S来使字符串33n字符长。根据操作系统存储内存地址的方式,33可能需要更改。

中间还有一个恼人的+',',因此它符合换行符的要求;如果有人能想出缩短它的方法,那将是非常感激的。

有一个不太稳定的版本,有58个字节,如下所示:

代码语言:javascript
复制
f=lambda n:"print`id`*"+`n*n`+','+'#'*(22*n-10-len(`n*n`))

它的功能相同且更可靠,但代价是使用"id“而不是"f”作为函数,并且必须使用额外的字符减去10而不是9。

给出了该技术的这里解释。

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

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

复制
相关文章

相似问题

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