从编程难题到代码高尔夫


74

您的任务是编写一个输出确切字符串的程序Programming Puzzles(可选的换行新行),但是当所有空格,制表符和换行符都被删除时,它的输出Code Golf(可选的换行新行)。

您的字节数是第一个程序的计数,尚有空格。

笔记

  • 在空间Code Golf Programming Puzzles将作为去除的部分被除去,所以相应的计划。

  • 在0x09、0x0A和0x20分别不是制表符,换行符或空格的编码中,这些字符将被删除。

  • 如果您的代码是

    42  $@ rw$
    @42
    

    然后必须输出Programming Puzzles。而且,用相同的语言

    42$@rw$@42
    

    必须输出Code Golf

这是,因此以字节为单位的最短代码胜出!祝好运!


3
也会Code Golf删除其中的空间,那其中的空间呢Programming Puzzles
colsw

2
至少在WhirlWhitespace中这是不可能的。
Engineer Toast

13
票数是多少?
OldBunny2800

12
@ OldBunny2800好问题。我不断地问这一点,但评论被删除...
programmer5000

12
票数接近的原因是缺乏投入和产出以及对投入和产出格式的限制。100%(如果您有一个标有“规则”的部分,其中用项目符号指向的列表列出了您认为对于挑战很明显的事情),则您的票数为0。这完全是与CompSci员工的演讲有关,如果我们能想到一个看似愚蠢的问题,问这个问题可能会为我们节省一个字节,或者,我们将尝试反驳这种愚蠢行为,那么您将是一个出色的问题作家。
Magic Octopus Urn

Answers:


65

Python 2,50个字节

print["Code\40Golf","Programming Puzzles"][" ">""]

在线尝试!

删除所有空格:

print["Code\40Golf","ProgrammingPuzzles"]["">""]

在线尝试!

感谢Stephen S提供3个字节,感谢Outrik的Erik提供1个字节


2
该死,忍者!我正要单击“发布答案”!+1
HyperNeutrino

1
我想你只是伤了我朋友的大脑。这怎么工作?
Stevoisiak

11
@StevenVascellaro真的很简单。在第一种情况下," ">""返回True,因为在字典上,空格大于空字符串。在第二种情况下,"">""return False,因为没有什么可以大于自身。TrueFalse实际上分别是数据类型中的just 10bool而不是intor long。在第一种情况下,保留了空格,因此,"Programming Puzzles"逐字返回索引为1的项目。在第二种情况下,空格消失了,因此\x20索引0的项目中的"Code\x20Golf"保留了一个空格。
暴民埃里克(Erik the Outgolfer)'17年

9
@StephenS不,因为与JavaScript不同,Python对隐式强制转换没有痴迷。
Mego

1
如果发现Python缺乏痴迷困扰。
John Dvorak


22

05AB1E,15 个字节

”ƒËŠˆ”" "v”–±ÇÀ

在线尝试!

说明

”ƒËŠˆ”           # push "Code Golf"
      " "v       # for each character in the string " " do
          ”–±ÇÀ  # push "Programming Puzzles"
                 # implicitly output top of stack

...我只是不明白。这会使用字典压缩还是其他?
LegionMammal978 '17

@ LegionMammal978我很确定。
NoOneIsHere

@ LegionMammal978:它确实使用字典压缩。
Emigna '17

5
@Emigna好的,因为最后我检查了一下,所以这些字符串都不能装入4个字节:p
LegionMammal978 '17

1
@ Draco18s:Kevin在提示页面上写了一个不错的教程,您可以使用它来更好地了解如何使用它。
Emigna

21

C,64 62 53 52字节

f(){puts(*" "?"Programming Puzzles":"Code\40Golf");}

在线尝试!

使用C字符串以空字符结尾的事实


16

CJam,38个字节

" ""Programming Puzzles""Dpef!Hpmg":(?

在线尝试!删除空格

说明

" "                    e# Push this string.
"Programming Puzzles"  e# Push "Programming Puzzles".
"Dpef!Hpmg":(          e# Push "Dpef!Hpmg" and decrement each char, giving "Code Golf".
?                      e# If the first string is true (non-empty) return the second string,
                       e#   else return the third.

程序中是否包含空格将确定第一个字符串是真还是假。


27
您的代码很可悲:(
RomanGräf17年

14
如果您愿意使用不可打印的内容,请"Bncd\x19Fnke":)改用高兴的代码(代替\x19)。
Erik the Outgolfer

15

果冻,18字节

“½ċṭ6Ỵ»ḷ
“Ñ1ɦ+£)G»

在线尝试!

说明

在编写的程序中,第一行是一个永远不会运行的辅助函数。第二行(程序的最后一行)是主程序,是字符串的压缩表示"Programming Puzzles"(然后隐式打印)。

如果删除换行符,则整个过程将成为一个大型程序。“½ċṭ6Ỵ»是字符串的压缩表示"Code Golf"计算但忽略其右手参数,保留与运行前相同的值;它可以用于评估函数的副作用(我之前做过的事情),但也可以用于此处,以有效地注释掉代码。

有趣的是,这里的实际逻辑比05AB1E条目短,但由于字符串压缩器不太擅长压缩这些特定的字符串,因此整个代码的输出时间更长。


事实证明这是有效的。
Erik the Outgolfer

据我所知,假设众所周知的编码,其中一些字符可以使用一个字节保存。在UTF-8中,我得到36个字节...我错了吗?
steffen

@steffen:Jelly使用自己的字符编码,可以将使用的所有256个不同字符存储在一个字节中。(这样做而不是使用预先存在的编码的唯一原因是为了提高可读性(!);您可以编写一些用例如代码页437编码的程序,它可以在Jelly解释器中运行,但通常是很难阅读。)

13

果冻,17个字节

“Ñ1ɦ+£)G“½ċṭ6 Ỵ»Ṃ

在线尝试!

这个怎么运作

与其他Jelly答案相同,Ñ1ɦ+£)G½ċṭ6Ỵ编码字符串Programming PuzzlesCode Golf开始一个字符串文字,然后将一个字符串分隔为另一个,同时»选择文字的类型(基于字典的压缩),因此得出

["Programming Puzzles", "Code Golf"]

然后取最小值,产生Code Golf

但是,通过在½ċṭ6和之间添加一个空格,我们得到了完全不同的第二个字符串,并且文字的计算结果为

["Programming Puzzles", "caird coinheringaahing"]

由于在字典上caird coheringaahing比《Programming Puzzles》要大,所以请选择第一个字符串。


只是做过同样的事情“½ċṭ6Ỵ“Ñ1ɦ +£)G»Ṁ
乔纳森·艾伦

据我所知,假设众所周知的编码方式,这些字符都不能使用一个字节保存。在UTF-8中,我得到34个字节...我错了吗?
steffen

@steffen Jelly使用一个自定义代码页,它将其理解为一个字节的256个字符中的每一个编码。
丹尼斯

@丹尼斯感谢您的澄清。
steffen

13

Javascript,46 43 42字节

x=>" "?"Programming Puzzles":"Code\40Golf"

console.log((x=>" "?"Programming Puzzles":"Code\40Golf")())
console.log((x=>""?"ProgrammingPuzzles":"Code\40Golf")())


5
您可以将\x20第一个字符串中的替换为空格。
毛茸茸的

击败我,做得很好。这需要尾随;吗?
ricdesi

@ricdesi不,不是。

3
@ricdesi,因为它是codegolf,所以如果程序运行,它将起作用。;有时在JavaScript中不需要。
斯蒂芬

2
您可以替换\x20使用\40,以节省一个字节:-)
ETHproductions

10

Wolfram语言,62个字节

"Programming Puzzles"[ToExpression@"\"Code\\.20Golf\""][[0 1]]

中的空格[[0 1]]是隐式乘法,因此等效于[[0]]。没有空格,01就是1。该表达式的第0部分和第1部分是我们想要的字符串。

有效性存在问题的另一种解决方案(44字节,Kelly Lowder保存了2个):

"Programming Puzzles"["Code\.20Golf"][[0 1]]

\.20当在Mathematica环境中键入内容时,gets将立即被空格替换,因此尚不清楚是否将其与其他空格一起删除…


1
一旦将其粘贴(或键入)到Mathematica中(无论是否基于云),转义序列\:0020就会变成一个空间,因此将被删除,因此我不确定这是否符合条件。也\.20短了两个字符。 "Programming Puzzles"["Code"<>FromCharacterCode@32<>"Golf"][[01]]将工作。
凯利·洛德

1
@KellyLowder,嗯,这很不错。我添加了另一种应避免该问题的解决方案。(感谢您的\.20建议-您是怎么找到的?我以为我会仔细阅读整个文档……)
不是一棵树

1
\.20通过打错字找到了。似乎仅适用于两位数的字符代码。我认为它不在文档中。
凯莉·洛德

8

Excel-56字节

=IF(""=" ","Code"&CHAR(32)&"Golf","Programming Puzzles")

与大多数其他答案非常相似。。。


8

Haskell,48个字节

a _="Programming Puzzles";a4="Code\32Golf";f=a 4
a_="ProgrammingPuzzles";a4="Code\32Golf";f=a4

定义函数f,该函数返回相应的字符串。

供参考,旧版本是:

Haskell,49/47字节

f""="Code\32Golf";f(_)="Programming Puzzles";f" "

删除空格

f""="Code\32Golf";f(_)="ProgrammingPuzzles";f""

两个简单的模式匹配。(_)匹配所有模式。您可以通过将第二个模式定义为f" "=/ 来将无空格版本提高一个字节f""=,但这会发出“模式匹配是多余的”警告。

具有相同字节数的替代解决方案:

last$"Code\32Golf":["Programming Puzzles"|" ">""]
last$"Code\32Golf":["ProgrammingPuzzles"|"">""]

7

欧姆33 32字节

使用CP437编码。

▀Bn¬i≈╣Ü╝Rb╡°╧S½uÇ▀
▀4>~H├MS░l╬δ

在线尝试!尝试不使用空格

说明

带空格:

▀Bn¬i≈╣Ü╝Rb╡°╧S½uÇ▀    Main wire

▀Bn¬i≈╣Ü╝Rb╡°╧S½uÇ▀    Push "Programming Puzzles" (compressed string)
                       Implicitly output the top stack element


▀4>~H├MS░l╬δ           Helper wire (never called)

没有空格:

▀Bn¬i≈╣Ü╝Rb╡°╧S½uÇ▀▀4>~H├MS░l╬δ    Main wire

▀Bn¬i≈╣Ü╝Rb╡°╧S½uÇ▀                Push "Programming Puzzles" (compressed string)
                   ▀4>~H├MS░l╬δ    Push "Code Golf" (compressed string)
                                   Implicitly output top stack element

我很高兴我终于完成了字符串压缩!
尼克·克利福德

1
@NickClifford我注意到的一件奇怪的事是,Code Golf压缩后它变得更长。我想那是因为首都?无论哪种方式,它都比通常编写的要短,因为我在这里不能使用文字空间。
Business Cat

是的,Smaz有点奇怪。
尼克·克利福德

仅供参考,如果您有任何关于Ohm的问题或功能要求,请随时在聊天中ping我。
尼克·克利福德

7

Japt,29个字节

带空格:

`Co¸{S}Golf`r `PžgŸmÚÁ Puzz¤s

在线尝试!

没有空格:

`Co¸{S}Golf`r`PžgŸmÚÁPuzz¤s

在线尝试!


这利用了以下事实:在Japt中,空格关闭了方法调用。使用空格,代码大致等同于以下JavaScript代码:

("Code"+(S)+"Golf").r(),"Programming Puzzles"

评估为JavaScript,然后将结果发送到STDOUT。由于最后一个表达式是"Programming Puzzles",因此将打印该字符串。

没有空格,代码大致等效于:

("Code"+(S)+"Golf").r("ProgrammingPuzzles")

(如果您现在还没有弄清楚,则S变量是一个空格。).r()如果给定一个参数,则字符串上的方法将从字符串中删除该参数的所有实例。由于"Code Golf"不包含"ProgrammingPuzzles",因此返回"Code Golf"不变,然后将其发送到STDOUT。


我什至没有想到要使用替换。好东西!
汤姆(Tom),

据我所知,假设众所周知的编码,其中一些字符可以使用一个字节保存。在UTF-8中,我得到36个字节...我错了吗?
steffen

@steffen Japt使用ISO-8859-1编码,其中每个字符代表一个字节。但是某些字符在该程序中无法打印,因此我在这里使用了Windows-1252编码(实际上,它是由TIO自动生成的)
ETHproductions's

6

Brachylog,44位元组

" "Ṣ∧"Programming Puzzles"w|"Code"wṢw"Golf"w

在线尝试!

说明

" "Ṣ                                           If " " = Ṣ (which is itself " ")
    ∧"Programming Puzzles"w                    Write "Programming Puzzles"
                           |                   Else
                            "Code"w            Write "Code"
                                   Ṣw          Write " "
                                     "Golf"w   Write "Golf"

1
划掉44仍然是44 :(在&nbsp;任一侧编辑以修复:)
HyperNeutrino

@HyperNeutrino不会被划掉,带空格的长度为44,没有空格的长度为42。
Fatalize

哦。哎呀 好吧,它太相似了,所以我不得不不去编辑就看降价。没关系:P
HyperNeutrino

5

爱丽丝,44字节

/"floG!"t"edoC"#
 /"selzzuP gnimmargorP"d&o@

在线尝试!

没有空格:

/"floG!"t"edoC"#/"selzzuPgnimmargorP"d&o@

在线尝试!

说明

在第一个程序中,两个镜像/将指令指针重定向到第二行。"selzzuP gnimmargorP"依次推送所需的代码点,d推送堆栈深度并&o打印那么多字节。@终止程序。

没有空格,该程序就全部放在一行上。在这种情况下,指令指针无法在Ordinal模式下移动,因此/有效变为无操作(从技术上讲,IP只是一步不移动,/再次执行相同操作,并且IP反射回Cardinal模式)。因此,如果我们从程序中删除它们,则它看起来像这样:

"floG!"t"edoC"#"selzzuPgnimmargorP"d&o@

为了包含空间Code Golf,我们改用感叹号并用减号t。在将所有代码点都放在堆栈上之后,#跳过下一个命令,即整个第二个字符串。d&o然后再次打印堆栈,并@终止程序。


您必须打高尔夫球(44代表交叉是44)
MilkyWay90

5

PHP,44字节

三元运算符

<?=" "?"Programming Puzzles":"Code\x20Golf";

PHP,51字节

评论

<?=/** /"Code\x20Golf"/*/"Programming Puzzles"/**/;

PHP,57字节

阵列开关

<?=["Code\x20Golf","Programming Puzzles"][(ord("
")/10)];

5

Common Lisp(SBCL),52个字节

(format`,t"~[Programming Puzzles~;Code~@TGolf~]"0 1)

版画 Programming Puzzles

(format`,t"~[ProgrammingPuzzles~;Code~@TGolf~]"01)

版画 Code Golf

取消高尔夫:

(format t "~[Programming Puzzles~;Code Golf~]" 0 1)

说明:

技巧基本上来自#'formatCommon Lisp中的工作方式。

在CL中,只要没有关于令牌在何处开始或结束的歧义,可以省略大多数空格。第一个技巧是将formatt符号分开。我必须明确地结束format符号,而不必更改t其解释方式。幸运的是,CL中的`在处理前一个标记之前将其终止,并,取消了((`用于实现模板化的效果,在该标记之后的下一个表达式被“引用”,但所有以a开头的子表达式都会,被求值并模板中包含的结果(即`几乎是空操作)。

第三个参数format是模板字符串。format与C中的printf相似,但是具有更强大的格式设置指令,并使用〜代替%来指示它们。〜[和〜]使您可以在多个选项之间进行选择,并使用〜;。分开他们。提供了另一个参数来格式化-要打印的数字索引。为了确保Code Golf中的“”得以保留,我使用了制表指令〜T,该指令用于插入空格,通常将文本对齐到列中。〜@ T是一个变体,它仅插入给定数量的空格,默认为1。

最后,格式有两个参数-0和1。在删除空格之前,〜[〜;〜]使用0来选择“ Programming Puzzles”,然后删除多余的格式参数(1)(我是不确定如何删除额外格式参数的标准格式,但这在Steel Bank Common Lisp上有效)。删除空格后,只有一个参数(01)代替选择“ Code Golf”。


1
+1,只有一件事:“但是任何带有a的子表达式都会,被求值并进行拼接”拼接不是,@必需的吗?
PrzemysławP

诚然,“拼接”是一个糟糕的名词。从技术上讲,,评估下一个表达式并将结果包括在模板中,而,@假定该表达式将评估到一个列表并将该列表的内容直接包括在模板中。在Lisp社区中,传统,@上称为“拼接”,但我不确定这是最明显的选择。我会尝试重新措辞。
djeis


4

C#88 81 70 63字节

Func<string>@a=()=>" "==""?"Code\x20Golf":"Programming Puzzles";

除去空格:

Func<string>@a=()=>""==""?"Code\x20Golf":"ProgrammingPuzzles";

感谢BrianJ向我展示了如何在方法返回类型和方法名称之间没有空格,感谢PeterTaylor节省了7个 18字节,Patrick Huizinga节省了7个字节。

同样的方法,每个人都真的,在技术上这可能被视为无效,因为该方法不指定方法的返回类型,但是返回类型和方法名之间的空白。


1
您可以在函数名称前面加上@,这样就void@a...可以避免“ no return type”编译错误(尽管也会增加字节,但:()
Brian J

.Length<1保存一个字节;\u0020如果我计算正确,则保存六;您可以通过提交Lambda而不是顶级函数来做出有效答案(并同时保存一些字节)。Func<string>a=()=>...
彼得·泰勒

@BrianJ Hmm,不知道,想知道为什么从编译器的角度来看这行得通。无论如何,它可能会丢失字节,但从技术上讲,它也不会使该答案失去竞争力,因此值得这样做。谢谢!
Skidsdev

@如果需要使用保留字作为变量名,则主要使用@Mayube ([]在VB.NET(和MS SQL Server)中包含等效项)。
布赖恩J

1
是的,它需要返回字符串;但是如果您使用=>而不是,return则不需要任何空格。(即使您使用return,也可以return(...))。
彼得·泰勒

4

Java 8,74 50 48字节

()=>" "==""?"Code\040Golf":"Programming Puzzles"

@NonlinearFruit您说得对,我已将其更改为不称职
Khaled.K

1
我认为打印不是必需的,因此您只需返回字符串即可。我没有测试过,但==操作员也应该工作,()=>""==""?"Code\u00A0Golf":"Programming Puzzles"
NonlinearFruit

1
\u00A0-> \040节省2个字节。





3

直流 50

[pq]sm[Programming Puzzles]dZ19=m[Code]n32P[Golf]p

在线尝试

[ ]定义一个字符串- Z测量其长度。如果长度为19,则它包含一个空格,并调用存储在m寄存器中的宏,该宏将打印Programming Puzzles并退出。否则Code Golf打印。


您可以链接到dc解释器/ docs / github吗?
程序员

@ programmer5000只需在TIO上选择dc,然后单击语言名称即可。
丹尼斯

@Dennis谢谢,我什至不知道TIO会做到这一点!
程序员


3

T-SQL,96 82 81 67字节

print+iif(len(' x')=2,'Programming Puzzles','Code'+char(32)+'Golf')

在线试用 | 没有空格

旧版本(96字节):

select(case'x'when(replace(' ',' ','x'))then'Programming Puzzles'else'Code'+nchar(32)+'Golf'end)

做得很好,您可以通过丢失外部括号并将条件更改为iif(len(' x')=2
BradC

@BradC关闭,但是外部括号防止在后面需要空格print。我用一个+代替,它的工作。
mbomb007

必须粘贴并计算错了一个。而且我也不知道,但是加号是我尝试的第一个字符,它起作用了。
mbomb007

3

Perl 5中43 41个字节

say" "?"Programming Puzzles":Code.$".Golf

在线尝试!

使用' '在perl 中为true且''为false 的事实。的$"变量设置为默认的空间。

感谢@NahuelFouilleul删除了两个字节。


也许迟,但"Code$\"Golf"更短,Code.$".Golf
纳乌艾尔乌Fouilleul

@NahuelFouilleul是的,我写这个答案的时候还很新。不过谢谢!
克里斯


2

Befunge,76个字节

" "0`#v_"floG"84*"edoC",,,,,,,,,@
,,,,,@>"selzzuP gnimmargorP",,,,,,,,,,,,,,

在线尝试!

不是最紧凑的解决方案,但是再次编写没有空格的Befunge代码非常困难。

在一开始,它将空格字符与0进行比较。如果大于0,则将其移至最底行。如果不是这样(当您不使用任何空格替换空间时会发生这种情况),它将停留在第一行。


什么的,就做?
程序员

@ programmer5000每个都打印一个字符。
Martin Ender

提示要打印大量字符直到达到0的技巧>:#,_可以节省大量字节
MildlyMilquetoast
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.