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
输入为参数: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)
mob*_*mob 23
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)
Joh*_*ooy 21
确保在输入的%之后没有换行符,
例如
$ 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)
回旋处,但对我来说,代码变得比试图同时生成两半更短
mob*_*mob 14
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)
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程序的一个主要原因是因为我可以在任何时候进入普通编码以使用现有的调试工具/等.)
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