确定国际象棋方块的颜色


58

您的挑战是编写一个程序,从棋盘输出给定正方形的颜色。这是棋盘的外观:

在此处输入图片说明

您会看到正方形a1是深色的,而h1是浅色的正方形。当给定一个正方形时,您的程序需要输出darklight。一些例子:

STDIN:  b1
STDOUT: light

STDIN:  g6
STDOUT: light

STDIN:  d4
STDOUT: dark

规则:

  • 您需要提供一个使用STDIN并使用STDOUT输出dark或的完整程序light
  • 假设输入始终有效([a-h][1-8]
  • 这是,所以最短的字节数获胜!

计分板

var QUESTION_ID=63772,OVERRIDE_USER=8478;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <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><div id="language-list"> <h2>Winners 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><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>


1
为什么没有人尝试<> ^ Fish?
ghosts_in_the_code

Answers:


46

GS217 15个字节

de♦dark•light♠5

源代码使用CP437编码。在线尝试!

验证

$ xxd -r -ps <<< 6465046461726b076c696768740635 > chess.gs2
$ wc -c chess.gs2 
15 chess.gs2
$ gs2 chess.gs2 <<< b1
light

这个怎么运作

d               Add the code points of the input characters.
 e              Compute the sum's parity.
  ♦             Begin a string literal.
   dark
       •        String separator.
        light
             ♠  End the string literal; push as an array of strings.
              5 Select the element that corresponds to the parity.

8
太棒了!由于9个不可避免的字节,Pyth和CJam超出了3个字节,这是惊人的。
isaacg 2015年

29
伙计们,圣牛,GS2是新的Pyth!有人在Denni之前弄清楚了如何很好地使用它...没关系。
ETHproductions 2015年

56

Python 2,41 38字节

print'ldiagrhkt'[int(input(),35)%2::2]

感谢Mego提供3个字节的字符串隔行扫描

接受类似的输入"g6"。光明与黑暗交织在一起。


字符串交织那真是太好了。
韦恩·沃纳

5
我实际上会说这int(input(),35)是最出色的部分。我想到了字符串隔行扫描,但是您的输入法保存了最多的字节数。
mbomb007

26

六边形34 32字节

,},";h;g;;d/;k;-'2{=%<i;\@;trl;a

展开并带有注释的执行路径:

在此处输入图片说明
Timwi的惊人HexagonyColorer生成的图。

紫色路径是初始路径,该路径读取两个字符,计算它们的差并将其取模2。<然后充当分支,在该分支中,将1打印深灰色路径(结果)dark和浅灰色路径(结果0light

至于我如何计算差异和模,这是内存网格的示意图(其中输入值取a1):

在此处输入图片说明
使用Timwi更加惊人的Esoteric IDE(具有用于Hexagony的可视调试器)生成的图表。

内存指针始于标记为row的边缘,我们在此处读取字符。}移动到标记为col的边缘,在此处读取数字。"移动到标记为diff的边缘,-计算两者之差。'移动到我们放置的未标记单元格2,并{=移动到标记为mod的单元格,在其中使用来计算模%

通过重用一些,可以使高尔夫球运动几个字节;,但是我怀疑它可以运动很多,当然不能减小到侧面长度3。


7
哦,漂亮的颜色!
Celeo,2015年

1
这种语言对我来说是新语言,但是您为我想出的东西比我
想像的还要复杂

18
我真的不懂所有这些高尔夫语言。
juniorRubyist

4
@ codeSwift4Life Hexagony远不是打高尔夫球的语言。对于像这样的琐碎任务,它可能具有一定的竞争力,因为它具有单字符命令,但这更是由许多其他2D语言(包括Befunge,Piet和> <>)共享的。由于Hexagony的怪异内存模型,任何不平凡的任务都将需要非常大量的代码和复杂的程序。它绝不是简明的语言,而是一种异国情调的怪异语言,正在探索六角形网格上的编程。
马丁·恩德

3
@qwr我以为做人是esolangs的重点。;)
Martin Ender 2015年

21

CJam,18个字节

r:-)"lightdark"5/=

在线演示

解剖

r               e# Read a token of input
:-              e# Fold -, giving the difference between the two codepoints
)               e# Increment, changing the parity so that a1 is odd
"lightdark"5/   e# Split the string to get an array ["light" "dark"]
=               e# Index with wrapping, so even => "light" and odd => "dark"

34
您的代码在微笑:-)
Doorknob

8
我确实认为同样有效:^)
Peter Taylor

2
请您解释一下它是如何工作的。
Fogmeister 2015年

@Fogmeister,添加了解释。
彼得·泰勒


14

Pyth,18个字节

@c2"lightdark"iz35

将输入解释为以35为基数的数字,将其切lightdark成两半并打印。


13

ShadyAsFuck,91字节/ BrainFuck,181字节

我的第一个真正的BrainFuck程序,感谢Mego的帮助,并向我指出了算法存档。(这意味着我并不是真正地自己做,而是复制了一些现有算法。仍然是一个经验=)

NKnmWs3mzhe5aAh=heLLp5uR3WPPPPagPPPPsuYnRsuYgGWRzPPPPlMlk_PPPPPP4LS5uBYR2MkPPPPPPPP_MMMkLG]

这当然是我脑子里的答案:

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

使用此解释器/调试器进行开发。

我偷了两个代码段用于divmodif/else来自这里。(感谢@Mego!)

,>,               read input
[<+>-]            add
++<               set second cell to 2 

现在我们有了单元格配置>sum 2,现在执行divmod算法:

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

divmod的输出看起来像这样,0 d-n%d >n%d n/d但我们将调零d-n%d并且也将下一个单元调零:

>[-]

将一个单元格填充到该值100,以便于输出:

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

现在的配置是>cond 0 100,要应用if/else算法,我们需要两个临时变量,因此我们选择配置temp0 >c temp1 100

c[<temp0+>>temp1+<c-]<temp0[>c+<temp0-]+
>>temp1[
 #>++++++++.---.--.+.++++++++++++.<         outputs light
 <<temp0-
>>temp1[-]]
<<temp0[
 #>>>.---.+++++++++++++++++.-------.<<<     outputs dark
temp0-]

12

Python 2,45个字节

print'dlairgkh t'[sum(map(ord,input()))%2::2]

接受类似的输入"a1"在线尝试


由于缺少用于打印的paren,这在Python 3中不起作用。
isaacg 2015年

现在无法测试,但是"ldiagrhgt"[expression::2]在保存一两个字节的同时应该可以工作
FryAmTheEggman 2015年



9

图灵机代码,235字节

使用此处定义的规则表语法

0 a _ r 1
0 c _ r 1
0 e _ r 1
0 g _ r 1
0 * _ r 2
1 2 _ r 3
1 4 _ r 3
1 6 _ r 3
1 8 _ r 3
2 1 _ r 3
2 3 _ r 3
2 5 _ r 3
2 7 _ r 3
* * _ r 4
3 _ l r A
A _ i r B
B _ g r C
C _ h r D
D _ t r halt
4 _ d r E
E _ a r F
F _ r r G
G _ k r halt

这可能是我见过的最神奇的事情
Lucas

9

TI-BASIC,66字节

在TI-84 +计算器上测试。

Input Str1
"light
If inString("bdfh",sub(Str1,1,1)) xor fPart(.5expr(sub(Str1,2,1
"dark
Ans

第三行有一个更有趣的变化,可悲的是它的大小完全一样:

Input Str1
"dark
If variance(not(seq(inString("bdfh2468",sub(Str1,X,1)),X,1,2
"light
Ans

您可能会认为TI-BASIC会很好地应对这一挑战,因为它涉及模2。这些解决方案似乎是最短的。

我们花了很多字节来获取字符串中的两个字符,但是真正要花的是13个2字节的小写字母。


9

Befunge-9339 37 33 31个字节

所有信贷莱纳斯提出这31个字节的解决方案:

<>:#,_@  v%2-~~
"^"light"_"krad

使用此解释器对其进行测试。

说明

<        v%2-~~

<一开始发送指令指针向左,它环绕的权利。然后,它在从输入的两个字符读取,ASCII,减去它们,并通过2一样的模a1都是奇数(以ASCII码表示),其工作原理。该v指令指针向下重定向...

"^"light"_"krad

...到上_,如果栈顶为0,则向左发送指令指针,否则向右发送指令指针。分别将“浅色”或“深色”字符以相反的顺序压入堆栈。两条路径都触及^左侧的,从而将指令指针向上发送...

 >:#,_@

...到输出段。:复制堆栈的顶部,#跳过,_,然后到,如果堆栈的顶部为0,则将指令指针发送到右侧,否则返回左侧。当堆栈为空时,堆栈的顶部(之后:)为0,因此指令指针到达时@将停止执行。否则,它将命中,,将其作为字符输出堆栈的顶部,然后将其#跳转到:和上>,从而再次开始该过程。


保存一个字节rad"v>"k而没有空格?
莱纳斯(Linus)

@Linus:“空格是必需的,因为否则输出将是dar k。” 在链接的在线解释器中尝试。
El'endia Starman

1
你的权利。无论如何,我本来是要尝试的,但是我只能得到2个字节... <>:#,_@ v%2-~~\n"^"light"_"krad,修复换行符。
莱纳斯(Linus)2015年

@Linus:太好了。谢谢!
El'endia Starman

@JamesHolderness,没有难过的感觉。您是正确的指出,这在原始的Befunge-93解释器中不起作用,实际规格是针对80x25圆环的。您可能要发布自己的版本作为答案,并解释不同之处。我认为至少这比和我辩论一年之久的爱好代码更实际。
莱纳斯(Linus)

8

Japt23 22字节

JaptJa vaScri pt的缩写。口译员

Un19 %2?"dark":"light"

这个怎么运作

          // Implicit: U = input string
Un19      // Convert U from a base 19 number to decimal.
%2        // Take its modulo by 2.
?"dark"   // If this is 1, return "dark".
:"light"  // Else, return "light".
          // Implicit: output last expression

使用新版本0.1.3(11月22日发布),它变为17个字节,比GS2以外的所有字节都短:

Un19 %2?`»rk:¦ght

或者,一个神奇的公式:(26个字节)

Un19 %2*22189769+437108 sH
Un19 %2                    // Convert input to base 19 and modulo by 2.
       *22189769+437108    // Where the magic happens (top secret)
                        sH // Convert to a base 32 string.

8

Java中,157个 127 124字节

interface L{static void main(String[]a){System.out.print(new java.util.Scanner(System.in).nextInt(35)%2>0?"dark":"light");}}

您可以使用如下接口:interface i{static void main由于默认情况下接口中的所有内容都是公开的
Yassin Hajaj 2015年


7

Ruby,删除了44 36个字节

puts %w[light dark][gets.to_i(19)%2]

您可以通过替换puts $><<(无空格)来保存字节。
林恩

@Mauris我知道,但我喜欢终止的换行符
daniero

您可通过更改保存3个字节putsp
Cyoce

7

C,55个字节

s;main(){puts(strtol(gets(&s),0,19)&1?"light":"dark");}

在线尝试

感谢DigitalTrauma提供的许多高尔夫技巧


我认为你有一个额外的(puts
等级河圣

这为55: s;main(){puts(strtol(gets(&s),0,19)&1?"light":"dark");}。假定整数宽度足够容纳3个字符的字符串。您还应该能够执行main(s){puts(strtol(gets(&s),0,19)&1?"light":"dark");}54,尽管由于某种原因get()返回的垃圾s如果不是全局的,则它是段错误的。
Digital Trauma

哦,以19为基。聪明。
蓬松的

7

BotEngine165 14x11 = 154

v acegbdfh
>ISSSSSSSS
 v<<<<>v<<P
vS1   vS2ke
vS3   vS4re
vS5   vS6ae
vS7   vS8de
>     >   ^
>     >  v
^S2   ^S1el
^S4   ^S3ei
^S6  P^S5eg
^S8 te^S7eh
     ^   <

这里突出显示了不同的路径段:

在此处输入图片说明

(任何未突出显示的非空格字符都作为eS指令的参数-这些指令中的每条指令都使用左侧的符号(相对于机器人的行进方向)作为其参数)


7

𝔼𝕊𝕄𝕚𝕟,26个字符/ 34个字节

ô(שǀ(ï,ḣ)%2?`dark`:`light”

Try it here (Firefox only).


1
如果占用更多字节,我不会将其称为“压缩” :P
lirtosiast 2015年

1
在这一点上,我比字符更担心字符。我完全放弃了尝试降低byte中的字节数...
Mama Fun Roll

1
我们总是按字节计分,尽管针对次要目标进行优化通常很有趣,但请记住,最少的字节总是有好处的。
lirtosiast 2015年

是的,我明白。我并不是真的想赢得太多。
妈妈趣味卷

7

C,49个字节

main(c){gets(&c);puts(c+c/256&1?"light":"dark");}

不,那不能编译。
xsot

哦,我的坏东西,我在摆弄别的东西。但是,输出错误。我想你打算做gets(&c)%256+c/256什么?
林恩

哦,很好。尽管在这一点上,由于我们使用的是相同技术,所以我的解决方案比您的解决方案严格得多。看来我有很多东西要学。
xsot

原来,错误的输出是由的返回值引起的gets(&c)。我已经相应更新了我的提交。
xsot

7

Clojure,63个字节

(pr (['light 'dark] (mod (Integer/parseInt (read-line) 35) 2)))
  • 我们用(read-line)从stdin的一行中读取
  • 然后使用对JVM方法的调用将字符串解析为以35为底的整数值
  • 以结果2的mod告诉我们它是偶数还是奇数
  • 使用取模函数返回的结果作为序列的索引并打印

我用单引号将“浅色”和“深色”引出来节省2个字节,以便Clojure将其用作文字,而不是将每个单词都用一对引号引起来。我还使用pr而不是println节省了一些字节。

有关Clojure报价的一些信息


欢迎来到编程难题和Code Golf!这是一个不错的第一答案。:)我对Clojure不太熟悉;您介意添加解释吗?
Alex A.

绝对!妳去 如果您有任何疑问,请告诉我!
MONODA43 2015年

5

Minkolang 0.1228 24个字节

on+2%t"dark"t"light"t$O.

在这里尝试。

说明

o                   Take character from input
n                   Take integer from input
+                   Add
2%                  Modulo by 2
t      t       t    Ternary; runs first half if top of stack is 0, second half otherwise
 "dark" "light"     Pushes the string "dark" or "light", depending.
$O.                 Output the whole stack as characters and stop.

5

C,46个字节

main(c){gets(&c);puts(c%37%2?"light":"dark");}

期望环境 int s存储为低端字节序,并且至少为两个字节。

说明

cargc,因此最初包含01 00 00 00gets将读取两个字符,说a (0x61)1 (0x31),并将它们存储在中c,现在

61 31 00 00

代表数字0x3161或12641。

本质上,在给定的问题下c = x + 256*y,我们要计算(x + y) mod 2,并相应地打印一个字符串。要做到这一点,我可以写c % 255 % 2,然后作为

  (x + 256 * y) % 255 % 2
= (x % 255 + y % 255) % 2      since 256 ≡ 1 (mod 255)
= (x + y) % 2                  since 0 < x, y < 255

但是,37也可以:

  (x + 256 * y) % 37 % 2
= (x % 37 - 3 * (y % 37)) % 2  since 256 ≡ -3 (mod 37)

x的范围为49-57(含1-8)(数字1-8)x % 37 == x - 37

y 在97-104(含)范围内(小写字母ah),因此 y % 37 == y - 74

这意味着我们可以简化为

= (x - 3 * y + 185) % 2
= (x + y + 1) % 2              since -3 ≡ 185 ≡ 1 (mod 2)

并简单地翻转字符串以校正奇偶校验。


5

,127字节

rSr>`+v
   ^  )
n(`)nS<
    >L'''''>`+++++)S>`+++)@---@'''>`+++++)++@-------@H
>L'''''>`+++)S>`++++++)+++@---@--@+@'''>`++++)@H

一个解释 在此处输入图片说明 浅蓝色-从输入光束中读取字符,将光束值保存到存储中,从输入光束中读取字符。

深蓝色-在增加光束的同时将存储减为0,将存储添加到光束

浅绿色-一种奇特的测试构造。如果光束为偶数,则循环将向左退出,如果光束为奇数,则循环将向右退出。

深绿色-输出暗

棕褐色-输出光


5

Ø22 17字节

i#2%“暗”?

这将执行所需的操作,而没有任何其他好处。


5

迷宫48 46 45 42字节

感谢Sp3000节省了两个字节。

-,"
#
%0:::8.5.3.4.116.@
1
00.97.114.107.@

在线尝试!

说明

代码的开头是一个有趣的死胡同。请记住,当迷宫在堆栈底部需要操作数时,它会假定无数个零。该代码以-向右开始的方式开始,试图将两个数字相减,因此堆栈变为:

[ ... 0 ]

然后,读取第一个字符,a说:

[ ... 0 97 ]

"是无操作的,但这也是一个死胡同,因此指令指针转过来并开始向左移动。然后`读取另一个字符,2说:

[ ... 0 97 50 ]

这次,-减去这两个数字:

[ ... 0 47 ]

IP现在跟随“走廊”的弯曲。该#得到的堆栈深度,忽略了隐含为零,从而方便地恰好是2

[ ... 0 47 2 ]

%计算模数:

[ ... 0 1 ]

此时,IP处于连接点。如果堆栈的顶部为零,它将直接向前100.97.114.107.@打印dark。但是,如果堆栈的顶部非零(特别是1),它将向右移动,在该位置0:::8.5.3.4.116.@打印light(请注意,我们可以省略前导1,因为1堆栈上已经存在a 了,我们可以保存重复的10108105103104通过使的几份10当我们第一次到达那里)。


4

Matlab,51个字节

我认为这不需要任何解释=)

a={'light','dark'};disp(a(2-mod(sum(input('')),2)))

4

> <>,31个字节

ii+2%?\"krad"oooo;
l"oc0.\"thgi

在这里,我在想“必须有更好的方法……”


4

Perl,29 27字节

$_=/./&($'+ord)?light:dark

此代码需要-p切换,我将其计为1个字节。

Ideone上在线尝试。

这个怎么运作

  • 由于-p切换,Perl读取一行输入并将其存储在$_

  • /./是匹配一个字符的正则表达式。这有两个含义:

    • 由于匹配成功,/./返回1

    • 比赛后(第二个输入字符)存储在中$'

  • $'+ord将第二个输入字符表示的整数ord与隐变量第一个字符的代码点()相加$_

  • &取的位与返回值的/./和的总和$'+ord,返回1是总和如果奇数,0,如果它是偶数。

  • ?light:dark如果前一个表达式返回1,则返回light,否则返回dark

  • 最后$_=,由于切换$_,将结果分配给Perl自动打印的结果-p

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.