Код Гольф: Песочные Часы



вызов



самый короткий код по количеству символов для вывода песочных часов в соответствии с пользовательским вводом.



вход состоит из двух чисел: первое число больше, чем 1 целое число, которое представляет высоту ламп, второе число - это процент (0-100) от емкости песочных часов.



высота песочных часов сделана путем добавлять больше линий к шарикам песочных часов, поэтому размер 2 (минимальный принятый размер) был бы быть:



_____
/
/
/
/___


размер 3 добавит больше линий, что позволит луковицам поместиться больше "песка".



песок будет нарисован с помощью символа x. Верхний шарик будет содержать N процентов 'песок' в то время как Нижний шарик будет содержать (100 - Н) процентов песка, где N-переменная.



"емкость" измеряется количеством пробелов () песочные часы содержит. Там, где процент не является точным,он должен быть округлен.



песок нарисован снаружи внутри, давая приоритет правой стороны в случае, если процентный результат четный.



тесты



Input:
3 71%
Output:
_______
x xx/
xxx/
x/
/
/
/__xx_




Input:
5 52%
Output:
___________
/
xx xx/
xxxxx/
xxx/
x/
/
/
/
/ xxx
/xxxxxxxxx




Input:
6 75%
Output:
_____________
x x/
xxxxxxxxx/
xxxxxxx/
xxxxx/
xxx/
x/
/
/
/
/
/
/_xxxxxxxxx_


отсчет кода включает вход-выход (т. е. полную программу).

651   13  

13 ответов:

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 Символов
Убедитесь, что вы не сохраните его с дополнительной новой строкой в конце или он будет печатать дополнительное число

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

Golfscript - 144 Символы

);' ':|/(~:^.*: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/

завершите верхнюю половину, заменив " _ "на"", но сохраните копию для создания нижней половины

нижняя половина создается путем реверсирования всего этого

  /x\
 /xxx\
/xx__x\

замена всех 'x' С '' а затем '_' с 'х'

  / \
 /   \
/  xx \

наконец замените ''в нижней строке на'_'

  / \
 /   \
/__xx_\

Карусель но для меня код получился короче, чем попытка сгенерировать обе половинки сразу

C / C++, мрачный 945 символов...

принимает входные данные в качестве параметров: а. из 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 x";
        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? "_x_":
   " x ";p("%*s/",h-i,"");
  for(k=0;k<3;k++,q++,z+=2)for(
 j=0;j<*q;j++)p(z);p("\\n") ;}}

...и расшифрованная версия этого для нас, простых людей:

#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 x";
        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 ? "_x_" : " x ";
        p("%*s/",h-i,"");
        for (k = 0; k<3; k++,q++,z += 2) {
            for (j = 0; j<*q; j++) {
                p(z);
            }
        }
        p("\\n") ;
    }
}

Perl, 191 char

205199 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

требуется явная новая строка между 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

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

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\

О нет! :)

(Примечание: основная причина, по которой я могу писать и отлаживать программы Rebmu, заключается в том, что я могу взломать обычное кодирование в любой момент, чтобы использовать существующие инструменты отладки/и т. д.)

Хаскел. 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

запустить с например:x 5 50

ответ на c++, это 592 символы до сих пор, все еще имея разумное форматирование.

#include<iostream>
#include<string>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef string S;
typedef int I;
typedef char C;
I main(I,C**v){
    I z=atoi(v[1]),c=z*z,f=ceil(c*atoi(v[2])/100.);
    cout<<S(z*2+1,'_')<<'\n';
    for(I i=z,n=c;i;--i){
        I y=i*2-1;
        S s(y,' ');
        C*l=&s[0];
        C*r=&s[y];
        for(I j=0;j<y;++j)
            if(n--<=f)*((j&1)?l++:--r)='x';
        cout<<S(z-i,' ')<<'\'<<s<<"/\n";
    }
    for(I i=1,n=c-f;i<=z;++i){
        I y=i*2-1;
        S s(y,'x');
        C*l=&s[0];
        C*r=&s[y];
        for(I j=0;j<y;++j)
            if(n++<c)*(!(j&1)?l++:--r)=(i==z)?'_':' ';
        cout<<S(z-i,' ')<<'/'<<s<<"\\n";
    }
}

Если я решу просто забыть форматирование его разумно, я могу получить его так же низко, как 531:

#include<iostream>
#include<string>
#include<cstdlib>
#include<cmath>
using namespace std;typedef string S;typedef int I;typedef char C;I main(I,C**v){I z=atoi(v[1]),c=z*z,f=ceil(c*atoi(v[2])/100.);cout<<S(z*2+1,'_')<<'\n';for(I i=z,n=c;i;--i){I y=i*2-1;S s(y,' ');C*l=&s[0];C*r=&s[y];for(I j=0;j<y;++j)if(n--<=f)*((j&1)?l++:--r)='x';cout<<S(z-i,' ')<<'\'<<s<<"/\n";}for(I i=1,n=c-f;i<=z;++i){I y=i*2-1;S s(y,'x');C*l=&s[0];C*r=&s[y];for(I j=0;j<y;++j)if(n++<c)*(!(j&1)?l++:--r)=(i==z)?'_':' ';cout<<S(z-i,' ')<<'/'<<s<<"\\n";}}

Баш: 639 - 373 символов

Я думал, что дам Баш попробовать (не видел много кода-гольф в нем). (моя версия:GNU bash, версия 3.2.48 (1)-release (i486-pc-linux-gnu))

на основе хороший ответ python Mobrule.

оптимизация все еще должна быть доступна, поэтому все предложения приветствуются!

начните с командной строки, например:./hourglass.sh 7 34%

function f () { for i in `seq `;do printf "";done; }
N=;S=$[*-**$[100-${2/\%/}]/100]
b='\';o=$b;n="\n";r=1;while [ $N -gt 0 ];do
N=$[N-1];z=" ";s=$r;[ $N -eq 0 ]&& z=_;[ $S -lt $r ]&& s=$S
S=$[S-s];t=$[r-s];v=$[s/2];w=$[s-v];r=$[r+2]
o=$n`f $N " "`$b`f $v x;f $t " ";f $w x`/$o$b$n`f $N " "`/`f $w "$z";f $t x;f $v "$z"`$b
done;f $r _;echo -e "${o/\/\\//}"

Java; 661 символов

public class M{public static void main(String[] a){int h=Integer.parseInt(a[0]);int s=(int)Math.ceil(h*h*Integer.parseInt(a[1])/100.);r(h,h-1,s,true);r(h,h-1,s,false);}static void r(int h,int c,int r,boolean t){if(c<0)return;int u=2*(h-c)-1;if(t&&c==h-1)p(2*h+1,0,'_','_',true,0,false);int z=r>=u?u:r;r-=z;if(t)r(h,c-1,r,true);p(u,z,t?'x':((c==0)?'_':' '),t?' ':'x',t,c,true);if(!t)r(h,c-1,r,false);}static void p(int s,int n,char o,char i,boolean t,int p,boolean d){int f=(s-n);int q=n/2+(!t&&(f%2==0)?1:0);int e=q+f;String z = "";int j;for(j=0;j<p+4;j++)z+=" ";if(d)z+=t?'\':'/';for(j=0;j<s;j++)z+=(j>=q&&j<e)?i:o;if(d)z+=t?'/':'\';System.out.println(z);}}

мне нужно найти лучший набор клюшек для гольфа.

PHP-361

<?$s=$argv[1];$x='str_pad';$w=$s*2-1;$o[]=$x('',$w+2,'_');
$r=$s*ceil($w/2);$w=$r-($r*substr($argv[2],0,-1)/100);$p=0;
$c=-1;while($s){$k=$s--*2-1;$f=$x($x('',min($k,$w),' '),$k,'x',2);
$g=$x($x('',min($k,$w),'x'),$k,' ',2);$w-=$k;$o[]=$x('',$p)."\$f/";
$b[]=$x('',$p++)."/$g\";}$b[0]=str_replace(' ','_',$b[0]);
krsort($b);echo implode("\n",array_merge($o,$b));?>

Python-272 символов

X,p=map(int,raw_input()[:-1].split())
k=X*X;j=k*(100-p)/100
n,u,x,f,b,s='\n_x/\ '
S=list(x*k+s*j).pop;T=list(s*k+u*(2*X-j-1)+x*j).pop
A=B=""
for y in range(X):
 r=S();q=T()
 for i in range(X-y-1):r=S()+r+S();q+=T();q=T()+q
 A+=n+s*y+b+r+f;B=n+s*y+f+q+b+B
print u+u*2*X+A+B

Java Exabyte18 преобразуется в C#, 655 байт:

public class M {public static void Main(){int h = Convert.ToInt32(Console.ReadLine());
int s = Convert.ToInt32(h * h * Convert.ToInt32(Console.ReadLine()) / 100);r(h,h-1,s,true);
r(h,h-1,s,false);Console.ReadLine();}static void r(int h, int c, int r, bool t){
if(c<0) return;int u=2*(h-c)-1;if (t&&c==h-1)p(2*h+1,0,'_','_',true,0,false);
int z=r>=u?u:r; r-=z;if (t)M.r(h,c-1,r,true); p(u,z,t?'x':((c==0)?'_':' '), t?' ':'x',t,c,true);
if(!t)M.r(h,c-1,r,false);}static void p(int s, int n, char o, char i, bool t, int p, bool d)
{int f=(s-n);int q=n/2+(!t&&(f%2==0)?1:0);int e=q+f;string z="";int j;for(j=0;j<p+4;j++) z+=" ";if(d)z+=t?'\':'/';
for (j=0;j<s;j++) z+=(j>=q&&j<e)?i:o; if(d)z+=t?'/':'\';Console.WriteLine(z);}}

Руби, 297 254 (после сжатия)

работать как с ruby -a -p f.rb

n,p = $F.map{|i|i.to_i}
r="\n"
y=''
g,s,u,f,b=%w{x \  _ / \}
$> << u*2*n+u+r     # draw initial underbar line
a=u
c=100.0/n/n         # amount of sand a single x represents
e = 100.0           # percentage floor to indicate sand at this level
n.times{ |i|
  d=2*n-1-2*i       # number of spaces at this level
  e-= c*d           # update percentage floor
  x = [((p - e)/c+0.5).to_i,d].min
  x = 0 if x<0
  w = x/2           # small half count
  z = x-w           # big half count
  d = d-x           # total padding count
  $> << s*i+b+g*w+s*d+g*z+f+r
  y=s*i+f+a*z+g*d+a*w+b+r+y
  a=s
}
$_=y

Руби, 211

Это mobrule ' s tour de force в Ruby. (И все еще нет окончательной новой строки. : -)

m,p=$F.map{|i|i.to_i}
q=m*m-m*m*(100-p)/100
_,e,x,b,f=%w{_ \  x \ /}
n="\n"
o=''
r=1
while m>0
m-=1
z=m>0?e:_
s=q<r ?q:r
q-=s
t=r-s
v=s/2
w=s-v
r=r+2
o=n+e*m+b+x*v+e*t+x*w+f+o+n+e*m+f+z*w+x*t+z*v+b
end
$_=_*r+o

Comments

    Ничего не найдено.