Questions tagged «code-challenge»

代码挑战赛是一种创造性的竞赛,可以用客观的获胜标准来解决编程难题,而其他得分标记(例如,代码高尔夫)则无法涵盖这些目标。

2
猫会去哪里?(轨道力学)
一只几乎没有质量的猫在(x, y, z)速度点上坠落在太空中(不用担心,有了宇航服和所有东西)(vx, vy, vz)。在该点有一个固定的,无限密集的行星(体积为0),(0, 0, 0)它r以加速度吸引远处的物体1/r^2。根据牛顿引力,物体在时间之后会流向何处t? 在这种情况下,几乎无质量表示您正在输出的值lim (mass --> 0) <position of cat>。质量受行星重力的影响,但行星不受猫重力的影响。换句话说,中央主体是固定的。 这有点类似于Code Golf:太空船的命运是什么?[浮点版本],但这有所不同,因为它测量的是精度。 您可以实施基于仿真的解决方案,该方案必须在3秒以内运行,或者您可以实施提供准确值的程序(也必须在3秒以内运行)。请参阅下面的评分详情。如果您执行模拟,则不一定要精确,但是由于不准确,您的分数会降低。 输入:x y z vx vy vz t,不一定是分别表示x,y,z坐标,分别在x,y和z方向上的速度和时间的整数。可以保证猫的速度严格小于该高度下的逃逸速度。输入可以从任何地方进行,包括函数的参数。对于,该程序必须在我的笔记本电脑上运行不到三秒钟t < 2^30,这意味着,如果您正在运行模拟,则必须相应地调整时间步长。如果您打算为每个测试用例都达到3秒的限制,请确保有一个可调整的参数,该参数可使速度提高更为准确/不太准确,以便我可以在计算机上运行三秒钟。 输出:x y z,时间后的位置t。 由于两体问题可以完美解决,因此从理论上讲有可能获得完美,正确的答案。 计分:对于任何测试用例,错误定义为输出与“ true”输出之间的距离。真正的输出定义为测试用例代码段生成的输出。如果误差小于10^(-8),则将误差四舍五入为零。您的分数是100个(或更多)随机测试用例的平均错误。如果您写出的答案非常准确,您的分数应为0;否则,您的分数为0。得分最低的获胜者,并且按码长打破平局。 测试用例: 1 0 0 0 -1 0 1000000000 --> 0.83789 -0.54584 0 在这种情况下,轨道是周期为2 * pi的完美圆形,因此,在绕转159154943次后,猫的视线约为(0.83789,-0.54584)。这不是测试您的代码的测试用例;但是,如果您提交的答案非常准确,则可能需要对此进行测试。 下面的代码片段会随机生成其他测试用例,并将用于判断提交的内容;让我知道是否存在错误: 显示代码段 var …

6
谁说的?2016年总统选举
在这个挑战中,您的任务是编写一个少于300个字符的程序,该程序包含应试者说过的简短段落或几句话,并输出说出它的人。 输入:可以作为函数的参数,也可以作为程序的输入等。它将是一个简短的段落,正确标点。 输出:您认为是的候选人。这可能是其中之一 Ben Carson (1) Ted Cruz (2) John Kasich (3) Marco Rubio (4) Donald Trump (5) Hillary Clinton (6) Bernie Sanders (7) 从3月1日起退学的人的名字,我已经省略了。您可以输出名称本身,或者更方便地输出与名称相对应的数字。 评分: 您的分数是您正确的测试用例的百分比。最高分获胜。领带(或完美分数)会像编码高尔夫球一样被编码长度打断。 测试用例可以从以下方面获取: http://www.presidency.ucsb.edu/debates.php 单击到目前为止(3月1日之前)发生的每场辩论,包括民主党和共和党。每个段落都是一个测试用例,除非“段落”的长度少于20个字符。 以下是从特定页面提取测试用例的代码: var t = $(".tools").parentNode.querySelectorAll("p"); var categ = {}, cur = 0; for (var i = 0; i < t.length; …

4
在POSIX和Windows上运行的可执行脚本文件
挑战:编写一个脚本文件foo.cmd,可以从原始Windows cmd.exe提示符(不是PowerShell,不是以管理员模式)中调用该脚本文件,以执行任意Windows特定的代码... > .\foo.cmd Hello Windows! ...也可被调用从符合POSIX标准典型(Linux的/ OSX)不变shell提示符(bash,tcsh,或zsh),执行任意特定POSIX的代码: $ chmod a+x foo.cmd $ ./foo.cmd Hello POSIX! ...无需安装或创建第三方解释器/工具。 我知道这是可能的,但是使用了草率(即在Windows上,在“ Hello Windows!”之前,将一到两行垃圾/错误消息打印到stderr或stdout)。 获胜标准是最小化(第一)粗线的数量和(第二)细线字符的数量。 可以将Cruft定义为(任意)有效负载代码未产生的任何控制台输出(stdout或stderr)。空行计入行数。换行符不计入字符数。Cruft分数应在两个平台上求和。让我们忽略这样的机制cls,这些机制会清除残骸,但同时也会浪费掉先前的终端输出。如果Windows由于@echo off尚未旋转而回显您的命令,则排除在打印当前目录和提示时花费的字符。 第二个标准是内部解决方案的简单性/优雅性foo.cmd:如果将“基础结构”定义为任意有效载荷代码中不直接涉及的任何字符,则首先最小化包含基础结构字符的行数,其次将基础结构总数减少字符。 如果文件具有CRLF行尾,即使POSIX部分仍可以工作,请多加赞赏!(不确定最后一部分是否可能。) 我现有的解决方案(将在其他人有机会的情况下在此处发布)使用6行基础结构代码(52个字符,不包括换行符)。它产生5行粗体,其中2条为空白,所有这些都发生在Windows上(30个字符,不包括换行符,也不包括出现在其中两行的当前目录/提示字符串)。

30
从最少的输入获得最大的输出
显然,代码打高尔夫球就是要充分利用最少的代码。谁真正关心实际输出是多少? 尽管我们面临着最高输入输出比的挑战,但这是在给定代码长度的情况下要求最有限和确定性输出的要求。具有讽刺意味的是,这个挑战不是代码高尔夫。 规则: 编写三个独立的片段(不是完整的程序/功能)。 片段必须使用相同的语言。 得分是输出字节的总数。 输出可以是结果,STDOUT等形式。 这些片段可能不会引起任何错误。 这些片段可能导致不同形式的输出。 尾随换行符不计算在内。 第一个代码段必须为1个字节或产生至少1个字节输出的最小长度。 第二个片段必须比该片段长一个字节。 第三段必须比第一个长两个字节。

6
那个概率分布是谁?
介绍 在此挑战中,将为您提供与某些概率分布无关地绘制的非负浮点数的列表。您的任务是从数字推断该分布。为了使挑战切实可行,您只有五个分布可供选择。 U,间隔[0,1]上的均匀分布。 T,模式c = 1/2时间隔[0,1]上的三角分布。 B,则间隔[0,1]上的beta分布具有参数α=β= 1/2。 E,间隔[0,∞)上的指数分布,速率为λ= 2。 G,间隔为[0,∞)且参数k = 3和θ= 1/6时的伽马分布。 请注意,上述所有分布的均值均精确为1/2。 任务 您的输入是一个非负浮点数数组,长度在75到100之间(含75和100)。您的输出应为字母之一UTBEG,根据您猜测数字是从上述分布中的哪一个得出的。 规则和计分 您可以提供完整的程序或功能。不允许出现标准漏洞。 在此存储库中,有五个文本文件,每个分发文件一个,每个文件的长度恰好为100行。每行包含一个由逗号分隔的列表,其中包含75至100个浮点数,它们独立于分布而绘制,并被截断为小数点后的7位数字。您可以修改定界符以匹配您语言的本机数组格式。要获得答案的资格,您的程序应正确地对每个文件中的至少50个列表进行分类。有效答案的分数是字节数+错误分类列表的总数。最低分获胜。

4
在高维格子状图中找到最大的独立集合
对于给定的正整数n,请考虑所有长度为二进制的字符串2n-1。对于给定的字符串S,令其L为一个长度数组,n其中包含1每个长度n为的子字符串中s 的数量S。例如,如果n=3和S = 01010再L=[1,2,1]。我们称L的计数数组S。 我们说两个字符串S1和S2相同长度的比赛,如果他们各自的计数阵列L1和L2具有这样的性质L1[i] <= 2*L2[i],并L2[i] <= 2*L1[i]为所有i。 任务 为了n从开始增加n=1,任务是找到最大的字符串集的大小,每个字符串的长度,2n-1以便没有两个字符串匹配。 您的代码应为的每个值输出一个数字n。 得分了 您的分数是最高n的,没有人为您的任何答案发布更高的正确答案。显然,如果您拥有所有最佳答案,那么您将获得n您发布的最高分数。但是,即使您的答案不是最佳选择,如果没有其他人能打败它,您仍然可以获得分数。 示例答案 因为n=1,2,3,4我得到2,4,10,16。 语言和图书馆 您可以使用任何喜欢的语言和库。在可行的情况下,能够运行您的代码将是一件好事,因此,请尽可能提供有关如何在Linux中运行/编译代码的完整说明。 领先的作品 5由MartinBüttner在Mathematica中撰写 6由Reto Koradi用C ++编写。值是2, 4, 10, 16, 31, 47, 75, 111, 164, 232, 328, 445, 606, 814, 1086。已知前5个是最佳的。 7由Peter Taylor在Java中撰写。值是 2, 4, 10, 16, 31, 47, 76, 111, 166, 235。 9由joriki用Java编写。值是2, …

2
总理书呆子狙击模式
一年中最长的一天-这会浪费一些额外的时间... 总览 请注意,这不是普及竞赛,也不是图形输出挑战-您只需要输出65,536个零和一的字符串即可。问题底部的堆栈片段将显示为256 x 256黑白图像,并计算您的官方成绩。然后,您可以保存图像并将其与代码一起上传到答案中(因为字符串输出不适合30,000个字符的Stack Exchange答案)。 计分 图像的分数是其各个像素的分数之和。单个像素的得分是与所得分像素颜色相反的每个非正交,素数距离像素的子得分总和。对于每个这样的像素的子分数是其中是主要的距离。1/pp 在此问题的上下文中,这些术语具有以下定义: 非正交:如果像素不在同一行且不在同一列中,则该像素与被计分的像素不正交。 质数距离:如果一个像素与要刻划的像素相距一个质数距离,则它们之间的距离就是恰好是质数的欧几里德距离。尤其是,距离是环形测量的最小距离-左上像素是到sqrt(2)右下像素的距离(所有4条边都环绕)。 相反的颜色:如果像素的值总和为1,则该像素与被计分像素的颜色相反。即,第一个为0,第二个为1,或者第一个为1,第二个为0。 Stack Snippet包含示例代码,该代码显示如何对图像评分,但不包括任何优化或有效方法,仅提供正确代码即可对最终图像进行评分。 如果代码中的任何内容不正确,请在注释中或在chat中让我知道。 JavaScript不一定是回答此特定挑战的最佳语言。请注意,Snippet代码故意不提供有关更快方法的任何线索。只会引入现有答案中已经证明的效率。 可视化 得分像素 为了直观了解评分像素的分布,此处(紫色)是256 x 256图像的像素(128、128)的非正交素距离像素: 随机图像 这是从示例Python 3答案中随机生成的图像。它的分数为138,267.64,可为您提供一些优势。 输入值 该代码不需要输入。 输出量 该代码应输出65,536个零和一的字符串,代表黑白256 x 256图像的像素。这些数字应该是一个连续的字符串,没有分隔符。如果输出到文件,则可能会发现复制和粘贴更加容易,但这取决于您。 您的代码还可以输出您认为有用的其他信息,只要可以将字符串复制并粘贴到堆栈片段中即可。例如,您可能希望定期将最佳字符串输出到文件,并将最佳分数输出到STDOUT,从而允许用户选择何时停止搜索。 堆栈片段 正如指出的SP3000,该片段正在采取10分钟,计算得分,这是一个有点过于缓慢,甚至故意低效的参考实现。我已经对Sp3000的建议改进进行了编辑,该改进是对计分的像素偏移进行预先计算,现在需要几秒钟来计算分数。 显示代码段 canvas = document.getElementById('canvas') ctx = canvas.getContext('2d') scoreArea = document.getElementById('scoreArea') pastedData = document.getElementById('pastedData') timeout = 0 primes …

3
建立有毒的葡萄酒测试计划程序
最近在Puzzling.SE上,我遇到一个问题,即当毒药仅在两种成分都被喝下时才激活时,确定更大数量的哪两个瓶子是有毒的。最终,它变得相当折磨,大多数人使用完全不同的算法设法将其减少到18或19个囚犯。 原始问题说明如下: 您是喜欢举行派对的中世纪王国的统治者。这位上次试图毒害您的葡萄酒瓶的朝臣大怒,得知您设法从十名囚犯中识别出他在1,000瓶中毒了。 这次他有点狡猾。他研发了一种复合毒药 P:一种二元液体,只有两种单独无害的成分混合时才致命。这类似于环氧树脂的工作原理。他又给您寄了1,000瓶葡萄酒。一瓶有成分C_a,另一瓶有成分C_b。(P = C_a + C_b) 喝完这两种成分的任何人都将在喝完最后一种成分的夜晚的午夜中途死亡,无论他们在白天何时吸收液体。每种有毒成分都保留在体内,直到第二种成分激活为止,因此,如果一天喝一种成分,第二天喝另一种成分,则第二天结束时您将在午夜死亡。 您下一场聚会还有两天。您需要使用最少多少名囚犯进行测试才能识别出哪两个瓶子受污染,以及在该数目的囚犯身上需要遵循什么算法? 额外的 好处是,假设您有20名囚犯的固定限制,那么理论上可以测试的最大瓶子数量是多少,从而得出关于哪些瓶子受到影响的准确结论? 您的任务是建立一个程序来解决奖金问题。对于n囚犯,您的程序将制定一个测试计划,以便能够m在m尽可能大的瓶子中检测出两个有毒的瓶子。 您的程序最初将N囚犯人数作为输入。然后将输出: M,您将尝试测试的瓶子数量。这些瓶子将被标记为从1到M。 N 行,其中包含每个囚犯将喝的瓶子的标签。 然后,您的程序将输入第一天死亡的囚犯作为输入,第一行的囚犯为1,下一行的囚犯为2,等等。然后,它将输出: N更多的行,其中包含每个囚犯将喝的瓶子的标签。死囚将有空白行。 然后,您的程序将输入第二天哪些囚犯死亡的信息,并输出两个数字A和B,表示您的程序认为哪个瓶子包含毒药。 两个囚犯和四瓶一例输入可能会去这样,如果瓶子1和3中毒: > 2 // INPUT: 2 prisoners 4 // OUTPUT: 4 bottles 1 2 3 // OUTPUT: prisoner 1 will drink 1, 2, 3 1 4 // OUTPUT: prisoner …

2
表达数字-现代的“ des Chiffres et des Lettres”
快递号码 早在60年代,法国人就发明了电视游戏节目“ Des Chiffres et des Lettres”(数字和字母)。节目的“数字”部分的目标是,使用一些半随机选择的数字,尽可能接近某个3位目标数字。参赛者可以使用以下运算符: 串联(1和2为12) 加法(1 + 2是3) 减法(5-3 = 2) 除(8/2 = 4); 仅当结果为自然数时才允许除法 乘法(2 * 3 = 6) 括号,以覆盖运算的常规优先级:2 *(3 + 4)= 14 每个给定的号码只能使用一次或根本不能使用。 例如,目标数字728可以与以下数字精确匹配:6、10、25、75、5和50,其表达式如下: 75 * 10 - ( ( 6 + 5 ) * ( 50 / 25 ) ) = 750 - …

6
模式中程序的王子前缀
您应该编写一个程序或函数,该程序或函数应尽可能输出或返回《小王子》第一章。您的程序或函数必须是M×N的代码块,其中仅包含可打印的ASCII字符(代码点从32到126),并在每行末尾添加换行符。 您最多只能使用 96个可打印的ascii字符(以及行尾的换行符)中选择的26个字符。 在每一行和每一列中,每个字符都必须与数独谜题相似,即每行或每列两次都不能有字母。 正确的例子代码块用M = 4,N = 3并且alphabet = {a,b,c,d,/,*}: abcd bcd* */ac 代码详细信息 您可以选择代码块的形状(即M和N)。 该块必须完全用字符填充,即每一行必须具有相同的长度。 最后一行末尾的换行符是可选的。 如上面在每一行和每一列中所写,每个字符必须是不同的。 输出细节 您应该输出或返回《小王子》第一章的前缀, 而无需任何其他输出。 如果您在文本中找到换行符,则可以将其表示为任何常见的变体(\ r,\ n,\ r \ n),但仅使用其中之一并将其计为分数的1个字节。 额外的尾随换行符是可选的。 您的分数是输出文本的长度,不包括额外的换行符(如果存在)。分数越高越好。 示例答案 ##Python3, score = 6 alphabet = `print('O\ce w)#X` (alphabet element count = 16) print('O\ nce w')#X 您可以使用此Python 3(ideone)程序或@MartinBüttner提供的CJam程序(在线)检查代码的有效性。

4
构建最小线索数独解算器
我试图说明这个问题,但提出了更为客观的解决标准。 您的任务是构建一个程序或函数,该程序或函数采用S您选择的格式的已解决的Sudoku网格,并尝试生成具有S唯一解决方案的尽可能少线索的问题网格。(S只要解决方案证明是唯一的,什么方法是唯一的解决方案,包括蛮力都没有关系。) 通过在此文件中找到的一组100,000个解决方案网格中运行该程序,可以对您的程序进行评分(下载7.82 MB),并将解决方案产生的所有100,000个问题网格中的线索总数相加。 上面测试文件中的Sudoku解决方案从左到右,然后从上到下,以81个字符的字符串表示。将测试文件中的输入转换为可用解决方案所需的代码不会计入解决方案的字节数。 就像在我的Flood Paint挑战中一样,您的程序实际上必须为所有100,000个难题产生有效的输出,才能将其视为有效的解决方案。在所有100,000个测试案例中,输出总线索最少的程序是赢家,而较短的代码打破了平局。 当前记分牌: 2,361,024 -Nutki,C 2,580,210 -es1024,PHP 6,000,000 -CarpetPython,Python 2 720万-Joe Z.,Python

2
用尺子和罗盘构造n-gons
任务是仅使用指南针和未标记的标尺绘制n边的规则多边形。 输入(n)是以下10个数字之一:3、4、5、6、8、10、12、15、16、17 方法:因为只有标尺和罗盘,所以只能绘制点,线和圆。 只能画一条线: 通过两个现有点。 只能画一个圆: 以一个点为中心,周长穿过第二个点。 只能画一个点: 在两条线的交点, 在直线和圆的交点处, 在两个圆的交点处, 一开始,您可能会画2点以开始。 通过此过程(并且仅通过此过程),您必须绘制所请求的n-gon的n条线以及达到该阶段所需的所有工作。 编辑:必须计算交点的位置,但是可以通过语言提供的任何方式绘制直线和圆。 输出是n边正多边形的图像,显​​示其工作状态。 图形上对图像大小,格式,线条粗细或此处未提及的其他内容没有任何限制。但是,必须有可能在视觉上区分不同的线,圆及其交点。另外: 构成n形边的n条线必须与“工作”颜色不同(即,任何点,圆或其他线),并且背景颜色也必须再次不同。 工作可以离开绘图区域的边界(点除外),这些点必须全部在图像的可见范围内。 圆可以是一个完整的圆,也可以是一个圆弧(只要它显示所需的相交点即可)。 一条线是无限的(即离开绘图区域),或者在它经过的两个点处被切除。编辑:可以画任何长度的线。只能在绘制的线在视觉上相交的地方创建点。 可以根据需要绘制点,包括不标记点。 评分是双重的,提交支持的每个输入获得1分,最多10分。在平局的情况下,最短的字节数为准。 可以在最少的步骤中构造n-gon或能够在给定范围之外构造n-gon的提交将获得认可,但对您的得分没有帮助。 维基百科的背景信息

3
点和盒最快的播放器
面临的挑战是为经典的纸笔游戏“ 点和盒”编写求解器。您的代码应使用两个整数,m并将其n作为输入,指定板的大小。 从一个空的点网格开始,玩家轮流在两个未连接的相邻点之间添加一条水平或垂直线。一位完成1×1框第四边的玩家将获得一个积分,并转一圈。(通常通过将玩家的识别标记(例如首字母)放在框中来记录积分)。当无法放置更多行时,游戏结束。游戏的赢家是得分最高的玩家。 您可以假设n = mor n = m - 1和m至少为2。 挑战在于solve在一分钟内实现最大的点和盒游戏。一个游戏的规模很简单n*m。您的代码输出应为win,draw或者lose应该是假设两个玩家都发挥最佳状态的第一个玩家的结果。 您的代码必须可以使用易于安装和免费的工具在ubuntu上进行编译/运行。请报告您的分数,以及您在1分钟内可以在计算机上解决的最大问题。然后,我将在计算机上测试代码,并按顺序排列条目表。 在抢七的情况下,获胜者将是在一分钟内可以解决的最大尺寸板上最快的代码。 如果输出的代码不仅输赢,而且输出实际分数,那会更好。这样可以进行正确性检查。

10
精神错乱检查程序
精神错乱:一遍又一遍地做同样的事情,期望得到不同的结果。 编写一个程序,该程序每次运行时都会引发异常(运行时错误)。面临的挑战是有可能产生多个崩溃,而无需直接调用异常(无throw语句)并且不使用内置的随机或cpu滴答计数功能。 每个可能的错误10点。 如果错误/崩溃发生在另一个进程或系统上,则奖励25分。 规则 响应必须指出可能发生的错误以及如何产生错误。 除非每次程序运行时都使用相同的数字作为种子,否则无法使用系统(内置)随机数字生成器。 除非使用tic或cpu周期数,除非它们相对于主程序线程的开始进行计数。 允许多线程(如果未安排)。 编辑1 GUID生成属于内置随机数生成器。允许自定义“本地” GUID生成。 文件的I / O允许访问文件系统,除非这样做是为了绕过规则(读取随机位或时间戳的文件)。 编辑2 调用abort()或assert()违反制作疯狂软件的挑战的精神,因此,此失败模式将不会获得10分。 祝好运!

2
赢得虚拟击剑比赛(针对您的堆叠交换器)
警告:这是一个相当复杂的问题,在“山上之王”的战斗风格中,它具有更多的随机性,因此最好的代码可能不会总赢。请阅读所有规则,因为它很复杂! FLAVOR TEXT Bill和Steve决定进行一次“友好的”决斗,但是又如此富有和聪明,决定让他们最好的程序员尝试自己的代码,以相互竞争。你说的是程序员。 OBJECTIVE 在击剑中,您的目标是在击中对手时获得最高的命中率,而自己击中的机会最少 MOVES 您的代码将具有以下“动作”选择 攻击 帕里 座 伦哥 和 头 胸 脚 SCORING POINTS 进攻击败 招架,持续1分刺痛阻挡,争取1分 进攻, 击球1分,阻挡搏击,进攻1分, 刺伤联系进攻,刺弓手无法阻挡或招架下一轮,进攻球员无法进攻或弓箭下一轮 阻挡平局招架,招架球员无法阻挡或招架下一轮,而阻塞球员无法进攻或弓箭下一轮 HEIGHT OF ACTION 您还将为自己的行动选择一个“身高”,因此,只有当两个玩家的身高都与进攻高度相匹配时,以上结果才会发生。如果身高不匹配,则两个玩家可能不再选择与之前的绑架回合相同的动作(不限制身高),直到得分,或者所有4个动作都已填满(一旦打破平局,所有动作)再次可用) CODE REQUIREMENTS 对于每个回合,它都应提示对手的上一回合的移动(第1回合除外),将其与自己的回合进行比较,确定上一回合的结果,然后输出下一回合的数字,得分及其选择/位置在那回合 例如: 输入:LC(大胸) 输出:上一轮:PM vs LC-PM得分!目前比分是2-1,下一轮动作是AH(进攻头) WINNER 游戏结束50局后,或获得3分后结束 AGAINST OTHER PLAYERS 只要第一个答案能够正常工作/发挥作用,它就会立即获得保证的胜利。将根据发布顺序对每个答案与先前的获胜者进行评估,如果获胜,将被宣布为新的获胜者。我要求在赢得或等待竞争时,不要更改代码。一旦被击败,您可能不再会使用相同的语言来争夺冠军头衔,但是您可能会提交不同的语言答案(必须大不相同,不得使用相同基本材料的变体)。 我将尝试进行每项挑战,并将结果发表在冠军和挑战者的评论中,并宣布新的冠军-因为我可能无法使用所有语言,尤其是一些比较晦涩的语言为确保您的答案得到解决,您将提供任何可能的帮助。谢谢!

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.