几何挑战


23

每个人都喜欢几何。那么,为什么我们不尝试编写高尔夫球代码呢?这项挑战涉及输入字母和数字并根据其形状。

输入

输入将采用的形式(shapeIdentifier)(size)(inverter)

但是shapeIdentifier,大小和逆变器是什么?

形状标识符是您将使用*s 制作的形状类型的标识符。以下是形状标识符:

  • s -正方形
  • t - 三角形

大小将介于之间1-20,它是图形的大小。

逆变器确定形状是否上下颠倒,用a +或a 表示-。请注意: s3-==(等于),s3+因为正方形是对称的。但是,t5-!=(不相等)t5+

在输出中可以使用尾随空白,但不能使用前置空白。

输出实例

Input: s3+
Output:
***
***
***

Input: t5+

Output:
  *
 ***
*****

Input: t3-
Output:
***
 *

特别说明

三角形输入将始终为奇数,因此三角形*的顶部始终以1结尾。

三角形的大小(如果是)是底部的大小,如果是 +,则是顶部的大小-


3
作为现在正在接受几何学(并正在学习几何学决赛)的人,我可以百分百地肯定地说:几何学绝对是一点也不有趣的……D:
Ashwin Gupta

Answers:


9

Pyth,40 36 34 32字节

-1字节@isaacg

JstPz_W}\+zjl#m.[J*\*-J*}\tzyd;J

lambda内的分号现在是lambda变量的全局值,此功能节省一个字节。

                         Implicit: z = input
JstPz                    J = size.
_W }\+z                  Reverse if "+" in z
j l# m                J  Join the nonempty lines in map lambda d:... over range(J)
      .[J            ;   Pad the following with spaces (;) to length J
         *\*               "*", this many times:
            -J*}\tzyd        J if "t" not  in z,
                             otherwise the correct number for a triangle.

在这里尝试。

测试套件


1
太长了,但是击败了Japt 15个字节?我等不及要看如何打高尔夫球了:)
ETHproductions'1

不错的解决方案!您可以通过替换qez\+为来保存字节}\+z,因为+它只能出现在最后一个位置。
isaacg

6

Pyth,38个字节

JsPtzj?}\szm*\*JJ_W}\-zm.[J*\*hyd;/hJ2

测试套件

基本上就这么简单。我希望我可以为这两种形状结合一些逻辑,但是目前它是分开的。


5

的JavaScript(ES6),142 146 147

编辑保存的1字节thx @ETHproductions 编辑保存的 2字节sve thx @ user81655

i=>([,a,b]=i.match`.(.+)(.)`,Array(l=i<'t'?+a:-~a/2).fill('*'.repeat(a)).map((r,i)=>l-a?(' '.repeat(i=b<'-'?--l:i)+r).slice(0,a-i):r).join`
`)

测试(在FireFox中运行)

F=i=>(
  [,a,b]=i.match`.(.+)(.)`,
  Array(l=i<'t'?+a:-~a/2).fill('*'.repeat(a))
  .map((r,i)=>l-a?(' '.repeat(i=b<'-'?--l:i)+r).slice(0,a-i):r)
  .join`\n`
)

function test() { O.textContent=F(I.value) }

test()
Input: <input id=I oninput="test()" value="t11-"/>
<pre id=O></pre>


\d-> .,因为保证前后只有一个非数字
ETHproductions

@ETHproductions对,谢谢
edc65 '16

真好 我认为这是JS中的最佳算法,找不到较短的算法。
ETHproductions 2016年

i.match(/.(.+)(.)/)->i.match`.(.+)(.)`
81655

@ user81655很好的提示,谢谢
edc65 '16

5

Python 2,106字节

s=raw_input()
n=int(s[1:-1])
for i in[range(1,n+1,2),n*[n]][s<'t'][::2*('+'in s)-1]:print('*'*i).center(n)

输出是一个完美的矩形,每行都用尾随空格填充,根据OP中的注释,我认为这是可以的。

注意:我仍然不确定是否input会在Python 2中允许此类问题...


4

Japt,62 60 55 52 51字节

V=Us1 n;U<'t?Vo ç*pV):0oV2 £S²pY iY'*pV-X})·z2*!Uf-

在线尝试!

我们需要做的第一件事是弄清楚我们的形状需要多大。这很简单:

      // Implicit: U = input string, S = space
V=    // Set variable V to
Us1   // everything after the first char of U,
n;    // converted to a number. This turns e.g. "12+" into 12.

现在,我们组织输出的形状:

U<'t?      // If U comes before "t" lexicographically (here, if the first char is "s"),
Vo         //  make a list of V items,
ç*pV)      //  and set each item to V asterisks.
:0oV2      // Otherwise, create the range [0, V) with steps of 2 (e.g. 7 -> [0,2,4,6]),
£       }) //  and map each item X and index Y to:
S²pY       //   Repeat 2 spaces Y times. This creates a string of Y*2 spaces.
iY'*pV-X   //   At position Y in this string (right in the middle), insert V-X asterisks.
·          // Join with newlines.

到目前为止,我们已经考虑了输出的大小和形状。剩下的就是旋转。当前已指向三角形,因此如果第三个字符为+:,我们需要翻转三角形:

!Uf-    // Take the logical not of U.match("-").
        // If U contains "-", this returns false; otherwise, returns true.
2*      // Multiply by two. This converts true to 2, false to 0.
z       // Rotate the list 90° that many times.
        // Altogether, this turns the shape by 180° if necessary.

有了隐式输出,我们的工作就完成了。:-)


4

Python 2中,235 193 167 157字节

更新:

使用列表推导和str.center()进行了一些重要的优化。我觉得我可以做些更多的事,以后再重新看一看。

更新2

根据Sherlock9的建议保存了10个字节。非常感谢!:)

d=raw_input()
x=int(d[1:-1])
o="\n".join("*"*x for i in range(x))if d<"t"else"\n".join(("*"*i).center(x)for i in range(x,0,-2))
print o[::-1]if"+"in d else o

旧答案

d=raw_input()
x=int(d[1:-1])
if "s" in d:
 for y in range(x):
    o+="*"*x+"\n"
 o=o[:-1]
else:
 b=0
 while x+1:
    o+=" "*b+"*"*x+" "*b+"\n"
    x-=2
    b+=1
 o=o[:-1]
 if d[-1]=="+":
    o=o[::-1]
print o

相当简单的方法。每行写一行到最后输出的字符串中。三角形始终绘制为倒角,并在需要时将其反转。您可以将一个整数与一个整数相乘的事实为我节省了很多字节!

我将尝试稍后再打高尔夫球,同时,我会提出一些建议,因为我对此还没有太多的了解。

编辑:在注释的帮助下大量使用它,并从其他python-answer之一中窃取大小计算。我认为这是我使用该算法所能做的最多的事情。


你怎么算的?使用wc此命令时,字节数为235。我错了吗?
ბიმო

1
这确实是235个字节。打高尔夫球的建议:使用制表符代替两个空格,这在Python 2中有效,并且会减少5个字节。
Doorknob

另外,您无需使用raw_input,使用input可以节省4个字节。此外,您不需要第二行的括号,而完全不使用变量x(使用if"s"in d)可以为您节省9个字节。
2016年

2
@DenkerAffe在窗口中计数时,每个换行符减去1个字节-换行符在Windows中为2个字节,而在其他环境中为1个字节
edc65 2016年

1
首先,您可以删除[]每个join函数调用中的括号。其次,if d<"t"else它更短并且更有效,因为"s3+"<"t"<"t3+"在Python中。第三,else"\n".join.center(x)for。没有空间。不需要。第四,print o[::-1]if"+"in d else o我将内容重新排列为两个字节(],并if和彼此之间if"+"
Sherlock9

3

JavaScript,220个字节。

q=s=>+s.slice(1,s.length-1);f=s=>s[0]=="s"?("*".repeat(q(s))+"\n").repeat(q(s)):Array.apply(0,Array(-~(q(s)/2))).map((_,n)=>(s[s.length-1]=="-"?~~(q(s)/2)-n:n)).map(n=>(" ".repeat(q(s)/2-n)+"*".repeat(n*2+1))).join("\n")

与运行 f(input here)

在这里尝试

正方形具有尾随换行符,但三角形没有。说明:

q=s=>+s.slice(1,s.length-1);                                                                                                                                                                                                 Define a function, q, that takes returns the argument, without the first and last character, casted into an integer.
                            f=s=>                                                                                                                                                                                            Define a function, f, that takes one argument, s. (This is the main function)
                                 s[0]=="s"?                                                                                                                                                                                  If the first character of s is "s" then...
                                           ("*".repeat(q(s))     )                                                                                                                                                           Repeat the "*" character q(s) times.
                                           (                +"\n")                                                                                                                                                           Append a newline to that
                                                                  .repeat(q(s))                                                                                                                                              Repeat that q(s) times.
                                                                               :                                                                                                                                             Else... (the first character of s isn't "s")
                                                                                Array.apply(0,Array(          ))                                                                                                             Create an array of length...
                                                                                Array.apply(0,Array(-~(q(s)/2)))                                                                                                             floor(q(s)/2)+1
                                                                                                                .map((_,n)=>                                   )                                                             Map each element, _ with index n to...
                                                                                                                .map((_,n)=>(s[s.length-1]=="-"?              ))                                                             If the last element of s is "-" then...
                                                                                                                .map((_,n)=>(s[s.length-1]=="-"?~~(q(s)/2)-n  ))                                                             floor(q(s)/2)-n
                                                                                                                .map((_,n)=>(s[s.length-1]=="-"?            : ))                                                             Else...
                                                                                                                .map((_,n)=>(s[s.length-1]=="-"?             n))                                                             Just n
                                                                                                                                                                .map(n=>                                        )            Map each element into...
                                                                                                                                                                .map(n=>(" ".repeat(q(s)/2-n)                   )            Repeat " ", q(s)/2-n times.
                                                                                                                                                                .map(n=>(                   )+"*".repeat(n*2+1)))            Append "*", repeated 2n+1 times.
                                                                                                                                                                .map(n=>(" ".repeat(        )+"*".repeat(n*2+1))).join("\n") Join with newlines

第一行的长度为338个字符。我只需要一个显示器就可以显示一半。
isanae


1
我不会点击随机的tinyurl链接,但请再次检查。无论如何,请尽量避免在代码框中使用滚动条,这样会使阅读起来更加困难。
isanae

1
@Loovjo我认为他的意思是解释的第一行。对于JavaScript答案,我通常缩进解释而不是采用这种样式,因此您无需滚动即可查看其中的一半。
user81655'1

@ user81655是的,我的意思是在解释中。现在我明白了困惑!
isanae '16

3

Python 2中,157个 132字节

def f(s):
 S=int(s[1:-1])
 for n in([range(1,S+2,2),range(S,0,-2)]['-'in s],[S]*S)['s'in s]:
  print "{:^{S}}".format('*'*n,S=S)

第一次尝试表明,+/-最后是可选的,摆脱了这一点,让我剃了一堆

这里的想法是制作一个可以放入通用输出中的列表。最难的部分是从输入中分离出长度。


为了获得长度,我使用x=int(d[1]if len(d)<4 else d[1:3])d作为输入字符串。那比您的解决方案短5个字节。您仍然遥遥领先于我的python-answer tho,必须尝试了解您在这里所做的一切,并在下次击败您!:)
Denker

1
其实x=int(d[1:-1])要短得多,只是在另一个python答案中看到了。
Denker

@DenkerAffe,无论出于何种原因,我都记得逆变器是可选的,因此无法正常工作,但我想我只是弥补了这一点
wnnmaw

2

视网膜102 85字节

字节计数假定源代码编码为ISO 8859-1。

\d+
$0$*:¶
^((\w)+):(:+)
$1$2$3$2¶$0
m`s$|:t

)`(.+)¶-(\D*)
-$2¶$1
m`^.

G`.
T`ts:` *

在线尝试。

我稍后再尝试打高尔夫球。


Notepad ++表示您的代码为89个字节,而不是85个字节。我使用了ISO-8859-1编码,然后继续使用Edit> EOL Convertion> UNIX / Linux Format,\n而不是使用\r\n。内容的Base64 :(XGQrCiQwJCo6wrYKXigoXHcpKyk6KDorKQokMSQyJDMkMsK2JDAKbWBzJHw6dAoKKWAoLispwrYtKFxEKikKLSQywrYkMQptYF4uCgpHYC4KVGB0czpgICo=从Notepad ++直接复制)。奇怪的是,任何在线解决方案都给我85个字节...哼...
Ismael Miguel

@IsmaelMiguel Notepad ++如何计算。在ISO 8859-1中,它们绝对是一个字节(值182)。
Martin Ender

2

严重的是54个字节

,#i's=`≈;'**@½≈";#dXdXεj' +"£n`@`≈;'**n`@Iƒ('-=WXa0WXü

在线试用

,#i                                                    Take input, push chars separately
   's=                                   Iƒ            IF the first char is "s":
                                `      `@                run the quoted function
                                 ≈;'**n                  make list of n strings of n *'s
      `                       `@                       ELSE run the quoted function:
       ≈;                                                make two copies of int n
         '**                                             use one to make string of n *'s
            @½≈                                          cut the other in half (e.g. 5->2)
               "           "£n                           run n/2 times the quoted function:
                ;#                                        copy the string as list of chars
                  dXdX                                    discard the last 2 *'s
                      εj                                  join back into string
                        ' +                               prepend a space
                                           ('-=WX 0WX  IF the third character is "-":
                                                 a       invert the stack
                                                     ü pop and print the entire stack

@Mego:看到了#dXdXεj吗?STRING SLICING ???


2

ES6,178个 172 159字节

s=>(p=s.match(/d+|./g),u=n=+p[1],m=n+1>>1,t=' '.repeat(n)+'*'.repeat(n),v=s<'t'?0:p[2]<'-'?(u=m,1):-1,[...Array(s<'t'?n:m)].map(_=>t.substr(u,u,u+=v)).join`
`)

之所以有效,是因为我做了一个有趣的观察。如果重复n空格和n星号,则会得到(例如n=5):

     *****

现在,以相同的开始和长度获取子字符串:

     |*****| (5)
    | ***| (4)
   |  *| (3)

这些子字符串正是我们需要的字符串t5

编辑:由于@ edc65,节省了6个字节。

编辑:由于隐藏了u+=v第三个参数,substr因此节省了13个字节,从而使我可以简化初始化。


@ThomasKwa Huh,在我更正了t处理代码之后,结果证明了这一点,w并且u变得等效,并且为我节省了足够的字节,可以将我带回178!
尼尔

[,b,c]=s.match及更高版本s<'t'...应该保存一些字节(仅
适用

@ edc65只是不保存比赛s允许我使用s<'t'哪个保存了6个字节,谢谢。
尼尔

2

MATL,48个字节

' *'jt4Y2m)U1$l't'Gm?2MQ2/:1L3$)R!P!R'+'Gm?P]]Q)

使用当前版本(10.1.0)语言/编译器的。

该代码以任何顺序接受输入字符:all s11+11s+甚至1+s1是有效的输入字符串。

编辑(2016年7月30日):链接的代码替换为1L3$)Y)以符合语言的最新更改

在线尝试!

说明

' *'        % push string. Will be indexed into to obtain final result
j           % input string
t           % duplicate
4Y2         % predefined literal string '0123456789'
m           % logical index of digits in input string
)           % index into input string to obtain substring with digits
U           % convert to number
1$l         % generate square of ones with that size
't'         % push character 't'
G           % push input string
m           % true if input string contains 't'
?           % if so...
  2M        % push argument of call to function `l`, i.e. square size
  Q2/       % add 1 and divide by 2. Call result T
  :         % generate vector [1, 2, ... T]
  1L        % predefined literal representing Matlab's `:` index
  3$)       % two dimensional index. Transforms square into rectangle
  R         % remove (set to zero) lower-left corner
  !P!       % flip horizontally
  R         % remove lower-left corner. This gives inverted triangle
  '+'       % push character '+'
  G         % push input
  m         % true if input contains '+'
  ?         % if so...
    P       % flip vertically
  ]         % end if
]           % end if
Q           % add 1. This gives array of values 1 and 2
)           % index string ' *' with this array to produce char array
            % implicitly display that char array

1

C,259字节

#define x(y);)putchar(y)
#define m(n)for(n=0;n++<
#define T {m(q)i x(32);m(q)s-i*2 x(42);puts("");}
main(q,v,i,s)char**v;{s=atoi(v[1]+1);if(*v[1]=='s')m(i)s*s x(42)&&!(i%s)&&puts("");else if(strchr(v[1],'+'))for(i=s/2+1;i-->0;)T else for(i=-1;i++<s/2+1;)T}

不打高尔夫球

main(q,v,i,size)char**v; // neat way of declaring variables
{
    size=atoi(v[1]+1);
    if(*v[1]=='s')
    {
        for(i=0;i++<size*size;)
        {
            putchar(42); // returns 42 (true)
            if(!(i%size))
                puts("");
        }
    }
    else if(strchr(v[1],'+')) // if finds plus sign
    {
        for(i=size/2+1;i-->0;) // iterate the height of the triangle
        {
            for(q=0;q++<i;)putchar(32); // conveniently i is the number os spaces before each line
            for(q=0;q++<size-i*2;) putchar(42);
            puts("");
        }
    }
    else for(i=-1;i++<size/2+1;) // does the same as above but inverted order
    {
        for(q=0;q++<i;)putchar(32);
        for(q=0;q++<size-i*2;)putchar(42);
        puts("");
    }
}

欢迎提出建议和批评。


1

露比(99)

->s{n=s[1,2].to_i
n.times{|i|d=(s.ord-115)*(s[-1]<=>?,)*(n-1-i*2)
d<1&&puts((?**(n+d)).center(n))}}

通过计算边的斜率来计算高度n平均宽度 的正方形或三角形n(因此,计算出的三角形宽度在底部为2n-1,在顶端为1。)但它仅打印不超过n字符的。

在测试程序中取消

f=->s{                         #take a string as an argument
  n=s[1,2].to_i                #take 2 characters starting at index 1 and convert to a number for the size
  n.times{|i|                  #iterate through n rows    
    d=                         #calculate how many stars "MORE THAN" n we need on a row
    (s.ord-115)*               #ascii code for 1st character of string - 115 : s-->0, t-->1
    (s[-1]<=>?,)*              #compare last character of input with comma character - --> +1 + --> -1
    (n-1-i*2)                  #row number * 2: 0 at centre, positive above it, negative below it
    d<1&&                      #only output if d is nonpositive (i.e we need less than n or exactly n stars)
    puts((?**(n+d)).center(n)) #print n+d stars, centred in a field of n characters padded by whitespace
  }
}

f[gets.chomp]

1

Jolf,37个字节,无竞争

发布此挑战后,我添加了功能,因此无法考虑接受。这是在ISO-8859-7中编码的。在这里尝试所有测试用例

onFiΒ€ioSgiγ?='sn―sΒ'*―TΒ1'*?='-SZiγγ

第1部分:解析字符串

onFiΒ€ioSgi
on          set n to
  Fi         the first entity of i (the shape identifier)
    Β       set Β (beta) to
     €i      the "inside" of i (in this case, the size) as a number
       oS   set S to
         gi  the last entity of i (the inverter)

第2部分:获得结果

γ?='sn―sΒ'*―TΒ1'*
γ                 set γ (gamma) to the result of the following expression
 ?='sn             if n is the character s,
      ―sΒ'*         then return a pattern "s" (a square) made with "*"s
           ―TΒ1'*    otherwise, return a pattern "T" (triangle) that is centered and
                     has a scale factor of 1, made with "*"s

第3部分:取反结果

?='-SZiγγ
?='-S     if S is a "-"
     Ziγ   return γ, inverted across its lines
        γ  otherwise, return γ untouched
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.