产生一个直角三角形


10

在此挑战中,您必须采用两个数字(以空格分隔)作为输入,并输出由xs 组成的ASCII直角三角形。

第一个数字是您应该输出的三角形的宽度和高度。第二个数字是直角将位于哪个角。这些角的编号为1到4,从左上角开始,以英语阅读顺序排列:

1    2



3    4

例如(输入及其各自的三角形输出):

INPUT | 3 1 | 3 2 | 3 3 | 3 4
------+-----+-----+-----+----
 OUT- | xxx | xxx | x   |   x
 PUT  | xx  |  xx | xx  |  xx
      | x   |   x | xxx | xxx

程序的输出必须与这些示例的输入完全匹配。

输入将始终有效:第一个数字将为≥1的整数,第二个数字将为1、2、3或4。

这是;最短的代码(以字符数计)获胜。

Answers:


9

APL(30)

{' x'[1+(⍎⍵⌷'⌽+⍉⊖')≤/¨⍳2⍴⍺]}/⎕

说明:

  • {... }/⎕:减少输入上的给定函数(因此,如果输入有2个数字,只需使用这两个数字(即左数字和右数字)调用该函数)
  • ≤/¨⍳2⍴⍺:创建一个坐标矩阵,并设置X坐标不大于Y坐标的那些位置,并提供一个位域。
  • (⍎⍵⌷'⌽+⍉⊖'):选择给出的转换函数,以使三角形右上。
  • ' x'[1+... ]:在位字段中添加一个,然后将结果用作字符串的索引' x',因此请为0和x1 放置空格。

1
我阅读的APL越多,我越意识到APL是一场噩梦。(⍎⍵⌷'functions')在决定如何解释整个语句之前,它是否不必实际评估该部分?考虑一下1+(⍵⌷'12+')|40|加上括号的部分之前,它甚至都不知道是单声道还是双声道。整个抽象语法树根据评估而变化。
protist

我的意思是1+(⍎⍵⌷'12+')|40...不会让我编辑。
protist

2
@protist:有趣的事实:f ← { [ }没有给出错误!f 1÷0给...一个域错误!(因为被零除)。只有当你调用函数就像f 123的语法错误。看哪:imgur.com/jtmdi4B
marinus

由众神!!!! 这让我有些伤心。我一直在写一些APL解释器,这证明了在当前的实现中存在极大的弊端。哈哈哈
生物主义者

看起来好像函数是通过某种丑陋的类似于宏扩展的过程常规放置的。它会在某种程度上指示就地文本扩展。
原生

6

红宝石,116 115 109 96

我将从我自己的解决方案开始。

i=gets.split
s=i[0].to_i
(i[1]<?3?s.downto(1):1..s).map{|x|t=?x*x
puts /2|4/=~i[1]?t.rjust(s):t}

我只知道我会立即被30个字符的GolfScript解决方案击败:P

感谢minitech删除了19个字符(哇)!


相反==0,您可以使用<1?x*x保存另一个字符。而且,puts i[1]%2<1?t.rjust(s):t}会成功吗?
Ry-

嗯…您周围有空格??那有必要吗?另外,我认为您可以使用进行相同的操作r=
Ry-

@minitech这是必要的-前导空格,因为否则它将解析1?为单个令牌,而尾随空格因为在其他情况下解析为?t(等效于't')。您如何建议重组r零件?
门把手

你试过了吗?在哪个版本的Ruby下?在2.0上对我来说效果很好。
Ry-

@minitech奇怪,它以前没有用过,现在可以了:P谢谢
Doorknob

4

GolfScript(34 33个字符)

~\:^,{)' x'^*$>^<0(2$?%}%\(2&(%n*

遗憾的是,角点没有旋转编号,因为这将允许采用更优雅的方法来构建一个数组,然后旋转n一次:

~\:^,{)' x'^*$>^<}%{-1%zip}@)*n*

3

C#-195

using System;class P{static void Main(string[]a){int G=int.Parse(
a[0]),O=int.Parse(a[1]),L=O<3?0:G+1,F=O<3?-G:1;G=O%2>0?-G:G;for(;
F<L;F++)Console.Write("{0,"+G+"}\n","".PadRight(F<0?-F:F,'x'));}}

格式:

using System;
class P
{
    static void Main(string[] a)
    {
        int G = int.Parse(a[0]),
            O = int.Parse(a[1]),
            L = O < 3 ? 0 : G + 1,
            F = O < 3 ? -G : 1;

        G = O % 2 > 0 ? -G : G;

        for(; F < L; F++)
            Console.Write("{0," + G + "}\n", "".PadRight(F < 0 ? -F : F, 'x'));
    }
}

在此处输入图片说明


输入必须以空格分隔,而不是逗号分隔。
门把手

@Doorknob:屏幕截图来自一个测试程序,我选择用逗号显示输入内容。执行该程序时,输入实际上是用空格分隔的,尽管这很重要,因为所有C#控制台应用程序都将接收的输入作为字符串数组。
Igby Largeman

2

Golfscript, 39 36 35个字符

~\:y,{' '*'x'y*+y<0~2$?%}%-1@2>?%n*

现场演示:http : //golfscript.apphb.com/? c= OyczIDInCn5cOnkseycgJyoneCd5Kit5PC0xIDIkPyV9JS0xQDI%2BPyVuKgo%3D

太糟糕了,不是要求的 30个字符


更换1${-1%}*-1 2$?%\2>{-1%}*\2>-1\?%将净你2个字符。
波动率

@波动率感谢,合并
约翰·德沃夏克

-1 2可以写出@波动性0~2
霍华德

对于另一个字符,我们还需要重组:~(\:y,{{>'x '=}+y,%0~2$?%}%\2&(%n*
霍华德

2

Mathematica 122(104?)

g@s_ := ({w, p} = ToExpression@StringSplit@s; 
   Array[If[Switch[p, 1, # <= (w + 1 - #2), 2, # <= #2, 3, # >= #2, 4, # > (w - #2)],
   "X", ""] &, {w, w}]) // Grid

GraphicsGrid[{{g["12 1"], g["12 3"]}}]

另一种方法


在对“输出”的自由解释下,以下(104个字符)将起作用。

f@s_ := ({w, p} = ToExpression@StringSplit@s; 
  Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True])


f["50 4"]

三角形


如果允许以列表形式输入,则以下内容(75个字符)就足够了:

f[{w_, p_}] := 
 Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True]


从技术上讲,这违反了规则:P
门把手

它违反了什么规则?
DavidC

输入/输出图表很重要。虽然122个字符很好。我编辑了问题以弄清楚
Doorknob

哎呀 我认为图表只是一个例子。
DavidC

我只是将ASCII艺术版本放在首位。
DavidC

2

J,59 55 42 38 37 36个字符

如果允许在程序末尾输入内容:

(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

如果不是(额外的3个字符):

t=.(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

用法:

   (|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/3 4
  x
 xx
xxx

要么

   t 3 4
  x
 xx
xxx

我认为这可能会短一些,因为大多数字符都用方括号和大写字母来保持隐式样式。

编辑
使用动名词,议程动词砍掉了几个字符,但是我喜欢的还有很多大写字母。

编辑2
有点像它。抛弃需要多少轮换的列表的议程,摆脱了大多数多余的括号和一些上限。

编辑3
在此过程中,删除了最后一个无关的盖子和一对括号。需要找到一种更便宜的方式来编码所需的转数。

编辑4 使用前缀而不是后缀来截断字符。启用另一种创建列表的方式,该方式不保存任何字符。布格

编辑5
使用公式来截断另一个字符。仍然觉得这可能会更短。


1

Python 106个字符

w,d=map(int,raw_input().split())
for e in range(1,w+1)[::d/3*2-1]:print('%'+'-+'[d%2]+str(w)+'s')%('*'*e)

1

Python 3、91

根据阿比吉特的回答。

修改了输出字符串的创建,以避免字符串中的字符串之和和丑陋的1s range。Python 3摆脱了raw_in raw_input,但是必须//用于整数除法并为添加括号print,从而仅保存一个字符。

w,d=map(int,input().split())
for e in range(w)[::d//3*2-1]:print('%*s'%(w-d%2*2*w,'x'*-~e))

0

小猫 140

def s{><replicate}
getLine{' 'neChar}span{readInt fromSome}toBoth->{w n}
w 0 if(n 2>){><}..
{<>w>< -{'X's}{' 's}both if(n 2%0=){><}cat say}each

取消高尔夫:

getLine
{' ' neChar} span
{readInt fromSome} toBoth
->{ width corner }

width 0
if (corner 2 >):
  swap
..

{ ->index
  'X' index replicate
  ' ' (width index -) replicate
  if (corner 2 % 0 =):
    swap
  cat say
} each

我需要实现重载并充实标准库的证据。

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.