Code Golf:沙漏

Lir*_*una 51 language-agnostic code-golf rosetta-stone

挑战

按字符计算的最短代码根据用户输入输出沙漏.

输入由两个数字组成:第一个数字是大于1的整数,表示灯泡的高度,第二个数字是沙漏容量的百分比(0 - 100).

沙漏的高度是通过向沙漏的灯泡添加更多线条来实现的,因此尺寸2(最小可接受尺寸)将是:

_____
\   /
 \ /
 / \
/___\
Run Code Online (Sandbox Code Playgroud)

尺寸3将增加更多的线条,使灯泡能够适应更多的"沙子".

将使用角色绘制沙子x.顶部灯泡将包含N%的"沙子",而底部灯泡将包含(100 - N)%的沙子,其中N是第二个变量.

"容量"是通过沙漏所包含的空格()来衡量的.如果百分比不准确,则应将其四舍五入.

沙子是从外面抽出的,如果百分比结果是偶数,则给出右侧优先权.

测试用例

Input:
    3 71%
Output:
    _______
    \x  xx/
     \xxx/
      \x/
      / \
     /   \
    /__xx_\
Run Code Online (Sandbox Code Playgroud)
Input:
    5 52%
Output:
    ___________
    \         /
     \xx   xx/
      \xxxxx/
       \xxx/
        \x/
        / \
       /   \
      /     \
     /  xxx  \
    /xxxxxxxxx\
Run Code Online (Sandbox Code Playgroud)
Input:
    6 75%
Output:
     _____________
     \x         x/
      \xxxxxxxxx/
       \xxxxxxx/
        \xxxxx/
         \xxx/
          \x/
          / \
         /   \
        /     \
       /       \
      /         \
     /_xxxxxxxxx_\
Run Code Online (Sandbox Code Playgroud)

代码计数包括输入/​​输出(即完整程序).

Aar*_*ron 36

C/C++,一个令人沮丧的945个字符......

输入为参数:a.out 5 52%

#include<stdio.h>
#include<memory.h>
#include<stdlib.h>
#define p printf

int h,c,*l,i,w,j,*q,k;const char*
 z;int main(int argc,char**argv)
  {h=atoi(argv[1]);c=(h*h*atoi(
   argv[2])+99)/100;l=new int[
    h*3];for(q=l,i=0,w=1;i<h;
     i++,c=(c-w)&~((c-w)>>31
      ),w+=2)if(c>=w){*q++=
       0;*q++ =0;* q++=w;}
        else {*q++=(c+1)/
         2;*q++=w-c;*q++
          =c/2;}p("_");
           for(i=0;i<h
            ;i ++)p (
             "__");p
              ("\n"
               );q
                =
               l+h
              *3-1;
             for (i=
            --h;i>=0;
           i--){p("%*"
          "s\\",h-i,"")
         ; z= "x\0 \0x";
        for(k=0;k<3;k++,q
       --,z+=2)for(j=0;j<*
      q;j++)p(z);q-=0;p("/"
     "\n");}q=l;for(i=0;i<=h
    ;i++){z =i==h? "_\0x\0_":
   " \0x\0 ";p("%*s/",h-i,"");
  for(k=0;k<3;k++,q++,z+=2)for(
 j=0;j<*q;j++)p(z);p("\\\n") ;}}
Run Code Online (Sandbox Code Playgroud)

......而这个解密版本对我们来说仅仅是人类:

#include <stdio.h>
#include <memory.h>
#include <stdlib.h>

#define p printf

int h, c, *l, i, w, j, *q, k;
const char *z;

int main(int argc, char** argv)
{
    h = atoi(argv [1]);
    c = (h*h*atoi(argv[2])+99)/100;
    l = new int[h*3];
    for (q = l,i = 0,w = 1; i<h; i++,c = (c-w)&~((c-w)>>31),w += 2) {
        if (c>=w) {
            *q++ = 0;
            *q++ = 0;
            *q++ = w;
        } else {
            *q++ = (c+1)/2;
            *q++ = w-c;
            *q++ = c/2;
        }
    }
    p("_");
    for (i = 0; i<h; i++) {
        p("__");
    }
    p("\n");
    q = l+h*3-1;
    for (i = --h; i>=0; i--) {
        p("%*s\\",h-i,"");
        z = "x\0 \0x";
        for (k = 0; k<3; k++,q--,z += 2) {
            for (j = 0; j<*q; j++) {
                p(z);
            }
        }
        p("/\n");
    }
    q = l;
    for (i = 0; i<=h; i++) {
        z = i==h ? "_\0x\0_" : " \0x\0 ";
        p("%*s/",h-i,"");
        for (k = 0; k<3; k++,q++,z += 2) {
            for (j = 0; j<*q; j++) {
                p(z);
            }
        }
        p("\\\n") ;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我想你和IOCCC混淆了:D (9认同)

mob*_*mob 23

Perl,191个字符

205 199 191个字符.

$S=-int((1-.01*pop)*($N=pop)*$N)+$N*$N;$S-=$s=$S>++$r?$r:$S,
$\=$/.$"x$N."\\".x x($v=$s/2).$"x($t=$r++-$s).x x($w=$v+.5)."/$\
".$"x$N."/".($^=$N?$":_)x$w.x x$t.$^x$v."\\"while$N--;print$^x++$r
Run Code Online (Sandbox Code Playgroud)

第2行和第3行之间需要显式换行符.

在新的Acme :: AsciiArtinator模块的帮助下:

$S=-int((1-.01*pop)*($N=pop
)                         *
 $                       N
  )                     +
   $                   N
    *$N;(        ${B},$
     F,${x})=qw(\\ / x
      );while($N){;/l
       ater/g;$S-=$s
        =$S>++$r?$r
         :$S;'than
          you';@o
           =(" "
            x--
            $ N
           .   $
          B     .
         x       x
        (         $
       v           =
      $             s
     /               2
    )     .$"x($t=    $
   r++-$s).x x($w=$v+.5)
  .$F,@o,$"x$N.$F.($^=$N?
 $":_)x$w.x x$t.$^x$v.$B);
$,=$/}print$^x++$r,@o;think
Run Code Online (Sandbox Code Playgroud)

  • 我的代码 - 高尔夫问题也成了IOCCC吗? (2认同)

Joh*_*ooy 21

Golfscript - 136个字符(适合推文)

确保在输入的%之后没有换行符,
例如
$ echo -n 3 71%|./golfscript.rb hourglass.gs

您可以像这样为沙漏设置动画:

$ for((c=100;c>=0;c--));do echo -n "15 $c%"|./golfscript.rb hourglass.gs;echo;sleep 0.1;done;

Golfscript - 136 Chars
请确保您不要在最后添加额外的换行符,否则会打印一个额外的号码

);' ': /(~:
;0=~100.@-
.**\/:t;'_':&&
*.n
,{:y *.'\\'+{[&'x':x]0t(:t>=}:S~
(y-,{;S\+S+.}%;'/'++\+}%.{&/ *}%\-1%{-1%x/ *&/x*}%) /&[*]++n*    
Run Code Online (Sandbox Code Playgroud)

Golfscript - 144 Chars

);' ':|/(~:^.*:X
 ;0=~100.@-X*\/
  X'x':x*'_':&
   @*+:s;&&&+
    ^*n^,{:y
     |*.[92
      ]+{s
       [)
       \#
      :s;]
     }:S~^(
    y-,{;S\+
   S+.}%;'/'+
  +\+}%.{&/|*}
 %\-1%{-1%x/|*&
/x*}%)|/&[*]++n*

工作原理
首先做下划线的顶线,即2n+1 创建沙漏的上半部分,但使用'_'字符而不是空格,所以对于我们的3 71%.

\x__xx/
 \xxx/
  \x/
Run Code Online (Sandbox Code Playgroud)

通过将"_"替换为""来完成上半部分,但保存副本以生成下半部分

下半部分是通过扭转整个事物而创建的

  /x\
 /xxx\
/xx__x\
Run Code Online (Sandbox Code Playgroud)

将所有'x'替换为'',然后将'_'替换为'x'

  / \
 /   \
/  xx \
Run Code Online (Sandbox Code Playgroud)

最后用'_'替换底行中的''

  / \
 /   \
/__xx_\
Run Code Online (Sandbox Code Playgroud)

回旋处,但对我来说,代码变得比试图同时生成两半更短

  • 我喜欢自我记录的方式 (9认同)
  • 当我在其中一个中看到golfscript时,我总是笑. (4认同)

mob*_*mob 14

Python,213 char

N,p=map(int,raw_input()[:-1].split())
S=N*N-N*N*(100-p)/100
_,e,x,b,f,n=C='_ x\/\n'
o=""
r=1
while N:N-=1;z=C[N>0];s=min(S,r);S-=s;t=r-s;v=s/2;w=s-v;r+=2;o=n+e*N+b+x*v+e*t+x*w+f+o+n+e*N+f+z*w+x*t+z*v+b
print _*r+o
Run Code Online (Sandbox Code Playgroud)


Hos*_*ork 8

Rebmu:188个字符

rJ N 0% rN Wad1mpJ2 S{ \x/ }D0 Hc&[u[Z=~wA Qs^RTkW[isEL0c[skQdvK2][eEV?kQ[tlQ]]pcSeg--B0[eZ1 5]3]prRJ[si^DspSCsQfhS]eZ1[s+DcA+wMPc2no]]]Va|[mpAj**2]prSI^w{_}Ls+W2 h1tiVsb1n -1 chRVs{_}hLceVn1

它与这里较短的解决方案竞争,虽然它实际上是以"天真"的方式解决问题.或多或少它正在做"沙子物理学",而不是利用对称性或旋转矩阵或任何东西.

H定义了一个用于打印半个沙漏的函数,在该函数中传入一个数字,即在开始打印"x"字符之前要打印的空格数.如果你在上半部分,沙绳是通过交替附加在头部和尾部构成的.如果你在底部,它会跳过字符串的中间来选择插入源.评论来源:

http://github.com/hostilefork/rebmu/blob/master/examples/hourglass.rebmu

但Rebmu袖子的真正伎俩是它是一种薄的方言,不会破坏其宿主语言(Rebol)的任何解析规则.你可以通过在中间注入普通代码将其转换为世界末日可视化,只要你用小写代码:

>> rebmu [rJ birthday: to-date (ask "When were you born? ") n: (21-dec-2012 - now/date) / (21-dec-2012 - birthday) Wad1mpJ2 S{ \x/ }D0 Hc~[u[Ze?Wa Qs^RTkW[isEL0c[skQdvK2][eEV?kQ[tlQ]]pcSeg--B0[eZ1 5]3]prRJ[si^DspSCsQfhS]eZ1[s+DcA+wMPc2no]]]Va|[mpAj**2]prSI^w{_}Ls+W2h1tiVsb1n -1 chRVs{_}hLceVn1]

Input Integer: 10
When were you born? 23-May-1974
_____________________
\                   /
 \                 /
  \               /
   \             /
    \           /
     \         /
      \       /
       \x  xx/
        \xxx/
         \x/
         / \
        /   \
       /  xx \
      /xxxxxxx\
     /xxxxxxxxx\
    /xxxxxxxxxxx\
   /xxxxxxxxxxxxx\
  /xxxxxxxxxxxxxxx\
 /xxxxxxxxxxxxxxxxx\
/xxxxxxxxxxxxxxxxxxx\
Run Code Online (Sandbox Code Playgroud)

哦不!:)

(注意:我能够编写和调试Rebmu程序的一个主要原因是因为我可以在任何时候进入普通编码以使用现有的调试工具/等.)


Apo*_*isp 6

哈斯克尔.285个字符.(副作用 - 免费的!)

x n c=h s++'\n':reverse(h(flip s)) where h s=r w '-'++s '+' b(w-2)0 p;w=(t n);p=d(n*n*c)100
s x n i o p|i>0='\n':l++s x n(i-2)(o+1)(max(p-i)0)|True=[] where l=r o b++'\\':f d++r(i#p)n++f m++'/':r o b;f g=r(g(i-(i#p))2)x
b=' '
r=replicate
t n=1+2*n
d=div
(#)=min
m=(uncurry(+).).divMod
Run Code Online (Sandbox Code Playgroud)

用例如运行 x 5 50