打印一些JSON


74

这个挑战很简单,但是希望有很多方法可以解决:

您需要打印/返回至少15个字符的有效JSON 对象,并且不计算不必要的空格。 您的程序应该无需任何输入即可运行。

为了清楚起见,JSON对象以花括号开头和结尾{},并且包含零个或多个以逗号分隔的key:value对。完整的JSON规范可在json.org上找到,并且代码的输出必须通过此验证器

因此,任何几种情况会不会是有效的:

4                               //Too short, not an object
"really, really long string"    //A string, not an object
["an","array","of","values"]    //An array is not a JSON object
{"this":4      }                //You can't count unessential whitespace
{"1":1,"2":3}                   //Too short
{"a really long string"}        //Not valid JSON, it needs a value
{'single-quoted':3}             //JSON requires double-quotes for strings

但是,以下内容有效:

{"1":1,"2":2,"3":3,"4":4}       //Long enough
{"whitespace      ":4}          //This whitespace isn't unessential

允许使用非编程语言来应对这一挑战。您可以从函数返回字符串,也可以将其打印出来。这是一个,所以请使用尽可能少的代码来回答!


1
我喜欢这个答案的多种选择
罗伯特·弗雷泽

嗯,您对JSON的定义是有限的。输出有效JSON但不输出花括号的代码呢?
Konijn

4
就像我说的@Konijn,它必须是有效的JSON 对象。该对象由花括号定义。
内森·梅里尔

明白了,对物体有压力;)
Konijn

1
@Masterzagh不幸的是,本机JS对象不计在内。“您可以从函数返回字符串,也可以将其打印出来”
Nathan Merrill

Answers:


72

Python 2,14个字节

print{`str`:1}

输出:

{"<type 'str'>": 1}

反引号在Python 2中获取字符串表示形式。通常,此输出在内部创建单引号,Python会将其识别为定界字符串,而JSON则不然。但是Sp3000观察到,在对类型进行字符串化时,类型描述已经包含单引号,这迫使外部引号成为双引号。


20
@ Sp3000这真是太糟糕了。
xnor

6
而且我认为JS是唯一可以真正滥用类型转换的语言...
Downgoat 16-10-25

相同的方法适用于20字节的print({repr(str):1})
py3

1
@dahrens for Py3:print({"'"*9:9})16岁(print{"'"*9:9}在Py2中又是14岁)
Jonathan Allan

37

jq,6个字符

(3个字符的代码+ 3个字符的命令行选项。)

env

CW,因为我确信这不是您打算允许的答案。

样品运行:

bash-4.3$ jq -n 'env'
{
  "GIT_PS1_SHOWDIRTYSTATE": "1",
  "TERM": "xterm",
  "SHELL": "/bin/bash",
  "GIT_PS1_SHOWUNTRACKEDFILES": "1",
  "XTERM_LOCALE": "en_US.UTF-8",
  "XTERM_VERSION": "XTerm(322)",
  "GIT_PS1_SHOWSTASHSTATE": "1",
  "GIT_PS1_SHOWUPSTREAM": "auto",
  "_": "/usr/bin/jq"
}

(输出明显缩短。)


6
这绝对是有效的提交方式(无需CW)
Nathan Merrill


1
这算是将解决方案转移到内置的解决方案上,这几乎是一个禁止的漏洞。关键字:差不多
John Dvorak

1
@JanDvorak这并不总是一个漏洞,因为在某些情况下,看到内置的用法很有趣。这就是其中之一。
王凤阳

1
我不会违反您的明确意愿,但是我同意这应该是非维基化的。同样,当前的共识是解释器标志必须计算带有和不带有标志的调用之间的差异,因此-n,空格占三个额外的字节。
丹尼斯

31

果冻,11 字节

“Ɠɼ'ẸẠḌȷżÑ»

在线尝试!

输出量

{"Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch":0}


1
它连续两次(pwllgwbwllll)有6个辅音。这到底是什么?
史蒂文H.

2
@ETHproductions可以,但是我至少需要9个字母才能符合限制。所有带有6个以上字母的单词都在长词典中,因此选择哪个单词并不重要。
丹尼斯


8
等待,果冻已经内置了这个
缓冲区已读

19

记事本,7击键

如果您有一台装有记事本程序的Windows计算机,请键入以下内容:

{"F5":0}

至少在我的Windows 7计算机上,这会为您提供以下信息:

{"3:42 PM 10/25/2016":0}

1
@cat这是一个程序,不是编程语言,但是话又说回来,我相信Vim是一样的。
ETHproductions

2
那么,Vim的编程的“语言”,既因为它满足PPCG规则(不是图灵完备性),而且在图灵完备性(至少,我敢肯定)

1
@猫我明白了。我不确定记事本是否已完成图灵处理。我对此表示怀疑,但也许;毕竟,///已被证明是这样,并且记事本可以很好地重新创建其单个功能。
ETHproductions 16-10-26的

1
Vim与记事本不同-您可以保存脚本并在编辑器中运行。记事本中没有此类功能。因此,记事本中允许其为TC的功能(基本的搜索和替换,复制和粘贴)每次都需要导航对话框-这意味着需要更多的击键。
Mego

1
@cat是的,很抱歉,我的意思是自我们讨论以来,允许这样做。
ETHproductions 2016年

15

Java(JDK 10),20字节

v->"{\"\":"+1/.3+"}"

在线尝试!

输出量

{"":3.3333333333333335}

3
Java是过去的语言,我会希望过载+String.concat>:^(

3
@cat是的,它实际上是唯一存在的重载。问题是它甚至没有过载String.concat!如果检查字节码,这是Java编译成的:()->new StringBuilder("{\"\":").append(1/.3).append("}").toString()。另外,不用担心,这仍然是此页面上最长的答案,除了Brainfuck和Java 7之外。因此Java保持了自己的地位;)
OlivierGrégoire16年

14

PHP,14 13字节

{"":<?=M_E?>}

打印一个几乎可以假装数学对象,它是有用的

{"":2.718281828459}

使用php逐字打印标记外的任何内容以保存在某些引号上的事实,这M_E是我能找到的最短的足够长的常数。

编辑:感谢琳恩,节省了一个字节。可悲的是,它不再是一个“好”的数学对象。


""是有效的JSON密钥。
林恩

14

JavaScript,17个 15字节

感谢@Neil。无输入呼叫。

_=>`{"${_}":0}`

产出 {"undefined":0}

旧版本,16字节

感谢@ kamoroso94在此版本上的-1

_=>`{"":${9e9}}`

产出 {"":9000000000}


您可以将其变成箭头函数以删除4个字节。
DanTheMan '16

1
你可以有一个空钥匙吗?(例如删除a
Conor O'Brien

_=>`{"a":${_}}`结果为{"a":undefined},正好是15个字符。注意,调用此函数时不使用任何输入
Bassdrop Cumberwubwubwub 16-10-25

1
@BassdropCumberwubwubwub巧合的是,您的代码也是15个字符。我不确定这undefined是JSON中的有效值,但是可以通过将其设为属性名称并使用零值来解决此问题_=>`{"${_}":0}`
尼尔

3
删除a以使密钥成为空字符串,这是JSON中的有效密钥。少1个字节。
kamoroso94

12

Brainfuck,50个字节

+[+<---[>]>+<<+]>>+.>>>--.<+++<[->.<]>>.<+.-.<<++.

输出{"999999999999999999999999999999999999999999999999999999999999999999999999999999999":9}。假设一个解释器具有8位单元,并且在左侧是无界的。在线尝试!




9

Pyth,7个字节

.d],`G0

创建一个包含单个键"'abcdefghijklmnopqrstuvwxyz'"和值的字典0

.d         Dictionary from:
  ]         The single-element list containing:
   ,         The two-element list containing:
    `G        The representation of the alphabet (the key)
      0       and 0 (the value)
          Implicitly print the stringification of this.

9

批处理,16字节

印刷品{"Windows_NT":0}

@echo {"%OS%":0}

您能否添加(示例)输出?
凹槽复数

8

///,15个 14个字符

/a/{":1234}/aa

(至少输出比代码长1 2个字符。)

在线尝试!

谢谢:

  • ETH生产用于将对象分隔符作为键的一部分重用(-1个字符)

样品运行:

bash-4.3$ slashes.pl <<< '/a/{":1234}/aa'
{":1234}{":1234}

只是为了使其更具可读性:

bash-4.3$ slashes.pl <<< '/a/{":1234}/aa' | jq ''
{
  ":1234}{": 1234
}

1
这是一种节省字节的聪明方法:-)
ETHproductions 16-10-25

2
您可以保存一个又一个与/a/{":1234}/aa(输出{":1234}{":1234}
ETHproductions

太神奇了,@ ETHproductions。谢谢。
manatwork

7

R,19个字节

cat('{"',lh,'":1}')

变得更长一点,因为需要对引号进行转义\"。此外,lh是内置数据集中的数据集之一R,并且(据我所知)是具有最短名称的对象,该对象包含填充密钥长度所需的9个字符。(编辑:事实证明pi,使用标准选项也能解决问题,我被@JDL打败了,他很聪明,可以使用单引号而不是多余的反斜杠进行转义)

lhR文档中的描述为:

一个定期的时间序列,以48分钟的间隔从人类女性那里以10分钟的间隔给出血液样本中的黄体生成素。

这是键的一个相当意外的名称,但是,它可以工作并产生输出:

{" 2.4 2.4 2.4 2.2 2.1 1.5 2.3 2.3 2.5 2 1.9 1.7 2.2 1.8 3.2 3.2 2.7 2.2 2.2 1.9 1.9 1.8 2.7 3 2.3 2 2 2.9 2.9 2.7 2.7 2.3 2.6 2.4 1.8 1.7 1.5 1.4 2.1 3.3 3.5 3.5 3.1 2.6 2.1 3.4 3 2.9 ":1}

可以将答案与仅用“随机”字母填充键以使输出至少15个字符(24个字节)相比:

cat("{\"HeloWorld\":1}")

1
您可以通过在R表达式中使用单引号来避免转义的反斜杠:cat('{"',lh,'":1}')就像我上面所做的一样(尽管我使用pi而不是lh)。在寻找两个字母的变量时,我遇到了el一个我不知道存在的函数。将来可能会有用...
JDL

7

PowerShell 22 20 14字节

'{"":'+1tb+'}'

输出量

{"":1099511627776}

使用为1TB定义的常量(以字节为单位)来达到字符数限制,并使用一个静态整数的值来生成有效的json。感谢TimmyD通过消除一些冗余将字符减少了5个。


较早的帖子40字节

"{$((1..9|%{'"{0}":{0}'-f$_})-join",")}"

输出量

{"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}

接受一个整数数组,并为每个数组创建一个键值对。加入逗号并用大括号括起来。



6

视网膜,11字节

 
{"9$*R":1}

输出量

{"RRRRRRRRR":1}

注意:换行符很重要,因为没有任何东西可以替换为结果输出,我已经用一个不间断的空格来说明这一点!

在线尝试!


5

V,9个字节

i{"¹*":0}

在线尝试!

非常简单。进入插入模式,输入以下文本:

{"*********":0}

这么短的原因是因为¹重复以下字符9次。


我期望0字节一个:P
Maltysen '16

1
@maltysen我确实发布了它。我删除了它,因为它使用了单引号而不是双引号... :(
DJMcMayhem

5

JavaScript(ES6)+ jQuery,15个字节

因为jQuery。

_=>`{"${$}":0}`

{"function (a,b){return new n.fn.init(a,b)}":0}调用时输出。在这里尝试:


1
任务是输出一些东西。如果没有,alert()您将不会输出任何内容
nl-x

1
@ nl-x OP已进行编辑,以澄清允许返回字符串的函数。
ETHproductions 2016年

5

Dyalog APL,9 个字节

JSONDMX

在线尝试!

在PC上干净的工作区中,结果是

{"Category":"","DM":[],"EM":"","EN":0,"ENX":0,"HelpURL":"","InternalLocation":["",0],"Message":"","OSError":[0,0,""],"Vendor":""}

⎕JSON 转换为JSON

⎕DMX 的(普遍可用)d iagnostic 中号 essageË X倾向于对象


4

疯子,83字节

--[-->+++++<]>.+[---->+<]>+++.>-[>+<-----]>.........<<.[----->+<]>.>.>--[-->+++<]>.

产出 {"333333333":3}

可能还有另一个更短的解决方案,但我尚未找到它。

说明:

--[-->+++++<]>. {
+[---->+<]>+++. "
>-[>+<-----]>.  3
........
<<.             "
[----->+<]>.    :
>.              3
>--[-->+++<]>.  }

在线尝试



4

Java 7,36个字节

String c(){return"{\"a\":"+1e6+"}";}

Java 8,21字节

()->"{\"a\":"+1e6+"}"

取消测试代码:

在这里尝试。

class M{
  static String c(){
    return "{\"a\":" + 1e6 + "}";
  }

  public static void main(String[] a){
    System.out.println(c());
  }
}

输出(长度15):

{"a":1000000.0}

第二个解决方案给出了一个错误
Numberknot

1
“长度根据哈希值在15到16之间变化”。从技术上讲,散列的长度可以小到1请参阅System.identityHashCode(Object)参考资料)。
奥利维尔·格雷戈雷

1
另外,您还可以通过""用作键和1e7值来打高尔夫球1个字节。""是在验证器中尝试的有效密钥。
奥利维尔·格雷戈尔(OlivierGrégoire),2013年

2
@OlivierGrégoire好吧,我将删除this代码。至于""with 1e7,不幸的是将无法正常工作。1e6输出1000000.0,但1e7输出1.0E7
凯文·克鲁伊森

1
哦,我的错误,我没有检查。
奥利维尔·格雷戈尔(OlivierGrégoire),

4

R,19个字节

这适用于英国英语语言环境;其他可能需要+2个字节。(编辑:它可能不会---查看评论。)

cat('{"',pi,'":1}')

我一直希望有一些聪明的东西(也许从诸如之类的既有函数中提取了一行代码q),但是找不到任何东西。结果:

{" 3.141593 ":1}

请注意,如果使用单引号将字符串引起来,则不必在R中转义双引号(反之亦然)。但是,此行为取决于语言环境。我希望它也可以在美国英语语言环境中工作。

这也需要您的默认 digits选项至少为六个(这是出厂默认值),并且scipen至少为-digits(出厂新默认值为零)。


1
不好意思 R的语法随语言环境而变化?

是的,哪些字符需要转义取决于options(quote)用户可以指定哪些字符,但是据我所知,默认值取决于语言环境。
JDL

@cat我认为这是一个误会。的存在options('quote') 没有 记录,对其进行更改没有明显的效果,尽管我在RI中遇到了很多恶作剧,但他们怀疑运行时选项是否会改变其解析方式。当然,它可能会更改输出-但此答案的代码中不会更改。
康拉德·鲁道夫,

@Konrad,您可能是对的。我想,我在想“useFancyQuotes”,它只影响的quotesquote等等
JDL


3

元素,18字节

\{\"a\"\:`9 9^`\}`

在线尝试!产出{"a":387420489}

仅比朴素的解决方案短三个字节。输出的前半部分是硬编码的(太多的转义字符使其他方法无法实现),而计算得出的值9^9使得数字足够长。


3

Perl的5,16 15个字节

使用该程序启动的那一刻UNIX时间戳作为一个元素对象的内容。如果您在1973年3月3日的10:46:39之前运行它,它将提供有效的输出。但是由于我们无法回到过去,这似乎是合法的。

say"{\"$^T\":1}"

使用FORMAT_TOP_HANDLE变量$^,默认为STDOUT_TOP

say"{\"$^\":1}";

-E标志运行,无需额外费用。

perl -E 'say"{\"$^\":1}";'

输出为16个字节长。

{"STDOUT_TOP":1}

RIP时间依赖性答案:(
CalculatorFeline

@CalculatorFeline是吗?
simbabque

3

切达(Cheddar),17岁 14字节

@ ConorO'Brien节省了3个字节

->'{":1234}'*2

返回的匿名函数{":1234}{":1234},它是有效的JSON对象:

{
  ":1234}{": 1234
}

在线尝试!


3

Windows批处理,10字节

{"%OS%":5}

环境变量OS包含字符串Windows_NT(自2000年以来所有的Windows操作系统,根据堆栈溢出的问题)


@ETHproductions哎呀
佩纳洛萨

这实际上是输出什么吗?NeilBatch回答当然可以,但是不记得任何隐式的批处理输出。
manatwork

@manatwork是的,因为打开回显功能,所以会回显当前命令,从而评估进程中的OS变量。
penalosa

哦。因此,实际上它尝试执行该{"%OS%":5}命令,就像执行命令一样,您将从基本跟踪功能中受益吗?那很棘手。
manatwork

@manatwork是的,完全是。
penalosa

3

HQ9 +,15个字节

{"Quineland":0}

输出本身。我认为8字节的答案将是可能的,如下所示:

{":11QQ}

输出{":11QQ}{":11QQ},这几乎是有效的JSON,但11QQ不是有效值。

按照PPCG标准,HQ9 + 不是有效的编程语言,但是OP允许使用非编程语言。


1
这绝对是无效的。所有提交都必须使用有效的编程语言。
Mego

这主要是kolmo的复杂性(主要是因为,如果输出的结果有所不同,它仍然会计算在内),所以我认为这可能是有效的
Destructible Lemon

@DestructibleWatermelon使用非编程语言是一个标准漏洞
Mego

@Mego OP现在已明确允许使用非编程语言
ETHproductions
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.