Su Dolu Kase


19

Bir kasenin hacmini ve içindeki suyun hacmini giriş ve çıkış olarak alan veya içinde su bulunan bir kasenin ASCII temsilini istenen hacimlerde alan bir program veya işlev yazmalısınız.

Bir kase aşağıdaki yapıya sahiptir:

 \     /
  \___/

Kase en az bir _karaktere sahiptir. Sayma \'in ve /' s da pozitiftir ve simetri nedeniyle eşittir.

Çanağın hacmi, toplam sayısıdır _ve spacearasındaki karakter \s ve /'nin yanı sıra, her çifti için bir \ve /. Bu, yukarıdaki kasenin hacmine sahip olduğu anlamına gelir 10:

 \     /  =>  xxxxx x (the last one is for the \/ pair)
  \___/        xxx x (the last one is for the \/ pair)

İki farklı kasenin aynı hacme sahip olabileceğini unutmayın. Örneğin, aşağıdaki kaselerin her ikisi de 18 hacme sahiptir:

\       /
 \     /      \         /
  \___/        \_______/

Kaseye biraz su dökebiliriz. Su, ~kasenin içindeki boşluklar yerine bir karakter dizisi olarak temsil edilir . En alt satırda boşluk bulunmadığından ~'leri içeremez . Bu, örneğimizin sadece bir şekilde su ile doldurulabileceği anlamına gelir:

 \~~~~~/
  \___/

Diğer kaseler çeşitli şekillerde doldurulabilir:

 \~~~~~/   \     /
  \   /     \~~~/
   \_/       \_/

Bir kasedeki suyun hacmi , karakterlerin altındaki kase sıralarının hacmidir ~. Yukarıdaki örnekler 4, 6 and 2sırasıyla su hacimlerine sahiptir.

Giriş

  • İki pozitif tamsayı, kasenin hacmi ve su hacmi.
  • İki sayının sırasını seçebilirsiniz.
  • İki tam sayı, herhangi bir ortak liste formatında (liste, grup, dizi vb.) Veya iki ayrı tamsayı olarak girilebilir.
  • Giriş değerleri için en az bir geçerli kase suyu konfigürasyonu garanti edilmektedir.

Çıktı

  • Kasenin ve su hacminin girdiyle eşleştiği su içeren bir kasenin ASCII gösterimi.
  • Sonucu yazdırmak yerine döndürmeyi seçerseniz, sonuç tek dize (veya dilinizin en yakın alternatifi) olarak döndürülmelidir.
  • Sondaki boşluklara izin verilir.
  • Gereksiz önde gelen boşluklara izin verilmez.
  • Birden fazla doğru yapılandırma varsa, hangisini çıktı alacağınızı seçmekte özgürsünüz, ancak bunlardan yalnızca çıktısını alabilirsiniz.

Örnekler

Her bir girdi tamsayı çiftini bir veya daha fazla olası çıkışı takip eder.

6 2
\~~~/
 \_/

10 4
\~~~~~/
 \___/

24 8
\        /
 \~~~~~~/
  \    /
   \__/

42 12 //either of the two output is correct
\           /
 \         /
  \~~~~~~~/
   \     /
    \   /
     \_/

\               /
 \~~~~~~~~~~~~~/
  \___________/

90 68
\~~~~~~~~~~~~~~~~~~~~~/
 \                   /
  \                 /
   \               /
    \_____________/

102 42
\                     /
 \                   /
  \~~~~~~~~~~~~~~~~~/
   \               /
    \             /
     \___________/

Bu kod golf yani en kısa giriş kazanır.

Yanıtlar:


6

CJam, 72 70 69 bayt

q~:QW=3m*{:,2ff*),)ff+}%{::)1fbQ=}=~W%ee_,S*W'_t@,~'~t.{S\+.*"\/".+N}

CJam yorumlayıcısında çevrimiçi deneyin .

Çalışma süresi ve bellek kullanımı O (korkutucu) olduğundan, son üç test durumu Java yorumlayıcısı (ve ek yığın alanı) kullanılarak doğrulanmalıdır.

Örnek çalışma

$ time java -Xmx4G -jar cjam-0.6.5.jar bowl.cjam <<< '[42 102]'
\                     /
 \                   /
  \~~~~~~~~~~~~~~~~~/
   \               /
    \             /
     \___________/

real    0m40.669s
user    3m13.100s
sys     0m11.690s

Nasıl çalışır

q~:Q     e# Read from STIDN, evaluate and save the result in Q.
W=       e# Select the last element of Q (bowl volume B).
3m*      e# Push all vectors of {0,...,B-1} × {0,...,B-1} x {0,...,B-1}.

{        e# For each vector [X Y Z]:
  :,     e#   Push [[0 1 ... X-1] [0 1 ... Y-1] [0 1 ... Z-1]].
  2ff*   e#   Multiply each coordinate by 2.
  ),)    e#   Pop the last vector, compute its length and increment.
  ff+    e#   Add the result to each component of each vector.
}%       e# Result: [[Z Z+2 ... Z+2(X-1)] [Z Z+2 ... Z+2(Y-1)]]

{        e# Find:
  ::)    e#   Increment each coordinate (to account for the volume in "\/").
  1fb    e#   Sum the coordinate of both vectors.
  Q=     e#   Compare the result to Q (desired volumes).
}=       e# If they match, push the array and break.

~        e# Dump both vectors on the stack.
W%       e# Reverse the rightmost one (corresponds to the bowl volume).
ee       e# Enumerate its coordinates.
         e# [Z+2(Y-1) ... Z+2 Z] -> [[0 Z+2(Y-1)] ... [Y-2 Z+2] [Y-1 Z]].
_,S*     e# Compute the length (Y) and push a string of Y spaces.
W'_t     e# Replace the last space with an underscore.
@        e# Rotate the leftmost vector (corresponds to the water volume) on top.
,        e# Compute its length (X).
~'~t     e# Replace the space at index X from the right with a tilde.

.{       e# For each enumerates coordinate and the corresponding character:
  S\+    e#   Append the character to the string " ".
  .*     e#   Vectorized repetition: [1 2] " ~" -> [" " "~~"]
  "\/".+ e#   Append the first (second) solidus to the first (second) string.
  N      e#   Push a linefeed.
}

2

C 231 229 bayt

Erken teslim :) Burada yapacak daha çok golf var.

v,V,w,h,H,i,j;main(c,a)char**a;{V=atoi(a[1]);v=atoi(a[2]);for(;++H;)for(h=0;h++<H;){for(w=1;h*h+w*h-h<v;++w);if(H*H+w*H-H==V){for(;H--;){printf("%*s",++i,"\\");for(j=0;j++<w-1+2*H;)putchar(H?H==h?'~':32:95);puts("/");}exit(0);}}}

Ungolfed:

int v,V,w,h,H,i,j;
int main(int c, char **a)
{
    V=atoi(a[1]); /* Volume of bowl */
    v=atoi(a[2]); /* Volume of water */

    for(;++H;) /* Make the bowl taller */
    {
        for(h=0;h++<H;) /* Make the water taller */
        {
            for(w=1;h*h+w*h-h<v;++w); /* Make the bowl wider until the water volume matches */
            if(H*H+w*H-H==V) /* if the bowl volume matches, then we're good */
            {
                for(;H--;) /* Print out the bowl, one line at a time */
                {
                    printf("%*s",++i,"\\"); /* Print the left edge */
                    /* Print the inside (either with air/water, the top of the water, or the bottom of the bowl */
                    for(j=0;j++<w-1+2*H;)
                        putchar(H?H==h?'~':32:95);
                    /* Print the right edge of the bowl */
                    puts("/");
                }
                exit(0); /* die, we're done */
            }
        }
    }
}

Kase hacmine uyan ancak su hacmini karşılayamayan bir kâseye rastlamak mümkün mü?
Vartan

At least one valid bowl-water configuration is guaranteed for the input values.- OP
Cole Cameron

2

Javascript ES5, 364 bayt

Bu benim öğle yemeği sırasında hızla gelip, vardiyam sona erdiğinde bana golf yardım!

Kaynak

function V(x,v) { // calculate volume of bowl/water
    for(i=v,j=x;i--;j+=2) {
      v+=j; 
    }
    return v
}
function B(x,y,l) { // draw bowl/water
    for(s="",h=y,w = x+2*y;y--;s+="\n")
        for(i=w;i--;) {
            f= i>h-y-1 && w-i > h-y;
            s+=i==h-y-1?"/": 
                w-i == h-y? "\\":
                y==l-1 && f? "~" :
                !y && f?"_":" "
        }
    return s;
}
n=prompt().split(" ");
b=+n[0]; // bowl volume
w=+n[1]; // water volume
for(x=b;x;x--)  // loop through possible widths
  for(y=b;y;y--)  // loop through possible heights
    if(V(x,y)==b) // check if we found bowl volume
       for(y2=y;y2;y2--) { // check possible water heights
         v = V(x,y2-1);
         if(v==w){ // see if volume matches
          alert(B(x,y,y2));
          x=1;break;
         }
       }

golfed:

(sıkıştırmak için madenciden koştu, öğle vardiyası sona erdi)

function V(f,r){for(i=r,j=f;i--;j+=2)r+=j;return r}function B(r,y,n){for(s="",h=y,w=r+2*y;y--;s+="\n")for(i=w;i--;)f=i>h-y-1&&w-i>h-y,s+=i==h-y-1?"/":w-i==h-y?"\\":y==n-1&&f?"~":!y&&f?"_":" ";return s}for(n=prompt().split(" "),b=+n[0],w=+n[1],x=b;x;x--)for(y=b;y;y--)if(V(x,y)==b)for(y2=y;y2;y2--)if(v=V(x,y2-1),v==w){alert(B(x,y,y2)),x=1;break}

2

Perl, 227172 bayt

-N seçeneği ile çalıştır:

/ /;for$h(1..$`){for$w(1..$`){for$l(1..($h*($w+$h)==$`)*$h){if($l*($w+$l)==$'){for(0..$h-1){print$"x$_."\\".($_<$h-1?$_==$h-$l-1?"~":$":"_")x($w+($h-$_-1)*2)."/
"}exit}}}}

Bu golf için yardım için Dennis teşekkürler.

Kase hacmini yükseklik * (genişlik + yükseklik) olarak hesaplar; burada genişlik _karakter sayısı ve yükseklik \karakter sayısıdır .

Her yükseklik ve genişlik kombinasyonu, doğru hazne hacmi bulunana kadar bir çift iç içe ilmek halinde test edilir, daha sonra bu genişlikte doğru su hacminin mümkün olup olmadığını bulmak için olası su yüksekliği seviyeleri üzerinde başka bir döngü yapılır.

Üçüncü döngüyü, istenen su hacminin negatifi olarak genişlik ve c olarak 1, b olarak kuadratik formülü kullanarak ve sadece bir tamsayı olup olmadığını kontrol ederek, ancak daha fazla bayt alan kontrol ederek su seviyesini hesaplamak mümkündür. bir döngü yapmaktan çok. İşte zaten (183 bayt):

/ /;for$h(1..$`){for$w(1..$`){if($h*($w+$h)==$`){$l=(sqrt($w*$w+4*$')-$w)/2;if(int$l==$l){for(0..$h-1){print$"x$_."\\".($_<$h-1?$_==$h-$l-1?"~":$":"_")x($w+($h-$_-1)*2)."/
"}exit}}}}

2

Python 2, 162 bayt

V,W=input()
r=1
while r*r<V:a=V/r-r;k=1;exec"if(a+k)*k==W*(V%r<1):i=1;exec\"print' '*~-i+'\%s/'%(' _~'[(i==r)-(i==r-k)]*(a+2*(r-i)));i+=1;\"*r;r=V\nk+=1\n"*r;r+=1

Biraz dağınık, ama ilk denemem. Olabilecek tüm ralt satır sayısını dener ve alt çizgi sayısını belirler a = V/r-r. Daha sonra mümkün olan tüm su seviyesi yüksekliklerini dener kve kabın geçerli olup olmadığını kontrol eder, varsa yazdırır.


1

Python 2.7, 284 270 260 Bayt

def f(b,w,i=1,e='while s<%s:j+=2;s+=j'):
 while 1:
    i+=1;j=s=i;exec e%w
    if s==w:p=j;exec e%b
    if s==b:break
 h=(j-i)/2+1;t=w=i+(h-1)*2+1
 for j in range(h):r,s,t=((' '*(t-2),'_'*(i-1))[j==h-1],'~'*(t-2))[j==h-(p-i)/2-2],(w-t)/2,t-2;print" "*s+"\\"+r+"/"+" "*s

Bu temelde kova ve suyun yüksekliğini ve genişliğini hesaplar ve yazdırır.

Başlangıçta çirkin döngü parçasını kaldırmak için çok uğraştım (burada kova yüksekliğini ve suyun çizilmesi gereken yüksekliği hesaplıyorum. yükseklik). Hala deniyorum: P

Farklı durumlar için test -

>>> execfile("buckets.py")
(6, 2)
\~~~/
 \_/

(10, 4)
\~~~~~/
 \___/

(24, 8)
\        /
 \~~~~~~/
  \    /
   \__/

(42, 12)
\           /
 \         /
  \~~~~~~~/
   \     /
    \   /
     \_/

(90, 68)
\~~~~~~~~~~~~~~~~~~~~~/
 \                   /
  \                 /
   \               /
    \_____________/

(102, 42)
\                     /
 \                   /
  \~~~~~~~~~~~~~~~~~/
   \               /
    \             /
     \___________/
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.