Kule dengede kalacak mı?


36

Giriş

Bir ASCII kulesi ve rüzgarın gücü göz önüne alındığında, kulenin dengede olup olmayacağını veya hangi yöne düşeceğini belirlemek için bir program veya işlev yazın.

Örneğin, ilk kule dengede durur ancak ikincisi sola doğru düşer.

  # #            # #
  ###            ### 
 ###            ### 
 # #            # # 
#####          ##### 
 ###            ### 
 ###              #

Bu benim ilk zorluğum. Beğenmenizi ümit ederim.

Talimatlar

Kule, temsil ettiği bağlantılı bloklardan oluşur #ve sert bir nesne oluşturur . Her blok, bir birimin genişliğine ve yüksekliğine sahip bir karedir ve sabit bir yoğunluğa sahiptir. Kule üzerinde etki eden iki kuvveti var, ağırlığı ve rüzgar kuvveti. Tüm kuvvetler her blokta ayrı ayrı hareket eder ve bloğun merkezinden geçer.

  • Ağırlığından dolayı, her blok kendisine etki eden bir birimin aşağı doğru kuvvetine sahiptir.
  • Ayrıca, kendi rüzgar tarafında bitişik olarak başka bir bloğa sahip olmayan her blok , rüzgar yönünde yatay olarak hareket eden bir kuvvete sahiptir. Bu kuvvetin büyüklüğü bir girdi olarak verilmiştir.
  • Rüzgarın yönü girişte bir yerde bir ASCII bayrağıyla belirtilir. Girişte, ancak rüzgar sıfır değilse, bir bayrak olacaktır. Bayrak herhangi bir kuvveti etkilemez.

Bayrak tam olarak aşağıda göründüğü gibi görünecek.

Flag design and corresponding wind direction:

 o~~        ~~o
 |~~        ~~|

--->        <---

Netleştirmek için, kule sağlam bir nesnedir ve parçalanmayacak ve zemine bağlı olmayacaktır. Ancak, programınız kulenin dengede olup olmadığını belirlemek için her bir blok için kuvvetleri ayrı ayrı hesaplamalıdır.

Örnek

  o~~
  |~~
  # #              > > 
  ###              >## 
 ###              >##  
 # #              > >  
#####            >#### 
 ###              >##  
 ###              >##  

Wind force: 1    Wind direction: --->

Rüzgar doğru esiyor ve >yukarıdaki sağda gösterilen blokları itecek . Rüzgarın deliklerin içine etki ettiğini unutmayın.

Kulenin sol alt köşesinde koordinatlar olduğunu varsayalım (0,0). Kulenin sol tabanının etrafındaki moment (0,0)saat yönünde 71 birimdir, böylece kule sola düşmez. Kulenin sağ tabanının etrafındaki an (0,3) saat yönünde 8 birimdir, böylece kule sağa düşecektir.

Rüzgar sola doğru esiyorsa, ilgili anlar saat yönünde 2 birim ve aynı noktalarda saat yönünün tersinde 61 birim olacaktı, böylece kule dengede kalacaktı.

Giriş

  • Programınız veya işleviniz iki girdi almalıdır, ondalık sayı ve yeni satır ayrılmış bir dize.
  • Ondalık sayı sıfırdan büyük olacaktır ve örnekteki gibi her açık blokta rüzgarın uyguladığı kuvveti temsil eder.
  • Dize kuleyi yukarıdan aşağıya temsil eder ve boşluk, #|o~karakter ve yeni satırlar içerebilir . İsteğe bağlı olarak bir takip çizgisi alabilir ve / veya kuleyi bir dikdörtgen oluşturmak için iz boşlukları ile doldurabilirsiniz.
  • Kule #alt sırada en az bir tane olacaktır .
  • Numarayı ve dizeyi iki sırayla da girebilirsiniz.
  • Rüzgar kuvvetinin büyüklüğü sıfır değilse, girişte bir yerde, yerde veya kuleye bağlı bir bayrak olacaktır. Bayrak yukarıda gösterilen şekilde olacaktır.
  • #Blok delikler içerebilir bağlı bir şekil oluşturur. Başka bir deyişle, sadece bir blok olmadıkça tüm bloklar başka bir bloğa bitişik olacaktır.

Çıktı

  • Karakterlerden biri B, Lya R, kule dengeleyecek bağlı olarak sol (yönünün tersine) doğru düşmek, ya da sağa (saat yönünde) doğru düşer.
  • Çıktı isteğe bağlı bir izleyen yeni hatta olabilir.

Bu ; standart kurallar ve boşluklar geçerlidir.

B Test Durumları:

Wind: 1
    ~~o
    ~~|
      # #
      ###
     ###
     # #
    #####
     ###
     ###

Wind: 0
##
# ##
###

Wind: 1.7
o~~
|~~
#
##

Wind: 0.768
      o~~
      |~~
      # #
      ###
     ###
     # #
    #####
     ###
     ###

Wind: 0.1
#
#
#
#
#
# o~~
# |~~

Wind: 0
#

Wind: 0
############

Wind: 144
               o~~
############   |~~

Wind: 0
#######
 ##
 #
 ##

Wind: 0
                ############
           ############
       ############
    ############
   ############
 ############
############

Wind: 41
                 ############
            ############
        ############
     ############
    ############
  ############     ~~o
 ############      ~~|

L Test Durumları:

Wind: 0
#####
   #


Wind: 42
                 ############
            ############
        ############
     ############
    ############
  ############     ~~o
 ############      ~~|

Wind: 4
########
    ###
 ~~o# ##
 ~~|#  #

Wind: 3
########
    ###
 o~~# ##
 |~~   #

R Test Durumları:

Wind: 1
      o~~
      |~~
      # #
      ###
     ###
     # #
    #####
     ###
     ###

Wind: 2
o~~
|~~
#

Wind: 0.001
                 ############
            ############
        ############
     ############
    ############
  ############     o~~
 ############      |~~

Wind: 145
               o~~
############   |~~

Wind: 1
#
#
#
#
#
# o~~
# |~~

Wind: 0.26
#######
 ##
 #   o~~
 ##  |~~

Referans Çözümü (JavaScript)

Çevrimiçi deneyin.

function balanced(tower, wind) {
    var rows = tower.split('\n').reverse(); // Reverse so row index matches height of row.
    var height = rows.length;
    var leftEdge = rows[0].indexOf('#'); // Find bottom left corner of tower.
    var rightEdge = rows[0].lastIndexOf('#') + 1; // Find bottom right corner of tower.
    var leftMoment = 0, rightMoment = 0; // Moments around the bottoms corners of tower.
    wind *= tower.indexOf('~o')>-1 ? -1 : 1; // Find direction of the wind.

    // Sum the moments for each block in the tower.
    for (var i = height - 1; i >= 0; i--) {
        rows[i].split('').map(function(ch, index, arr) {
            if (ch=='#') {
                // If there's not a block toward the windward side of the current one.
                if ((wind < 0 && arr[index-1] != '#') || (wind > 0 && arr[index+1]!='#')) {
                    // Add moments from wind.
                    leftMoment += (i+0.5)*-wind;
                    rightMoment += (i+0.5)*-wind; 
                }

                leftMoment += leftEdge - (index + 0.5);
                rightMoment += rightEdge - (index + 0.5);
            }
        }, 0);
    }
    if (leftMoment > 0) return 'L';
    else if (rightMoment < 0) return 'R';
    else return 'B';
}

Liderler Sıralaması

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

# Perl, 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


17
PPCG'ye Hoşgeldiniz; Bu mükemmel yazılmış bir ilk mücadeledir! :)
Doorknob

Yanıtlar:


2

JavaScript (ES6), 239 bayt

Referans uygulamamı düşürdüm. For döngüsünü a döngüsünü a map, kullanarak &&ve ||kısa devre yaparsanız ,ve fonksiyonda açık bir geri dönüşü engellemek için operatörü kullanarak bir ifadede her şeyi sığdırmak için baytları biriktirebildim .

(a,b)=>((c=a.split`
`.reverse(),d=c[f=g=0].indexOf`#`,e=c[0].lastIndexOf`#`+1),a.match`o~`&&(b*=-1),c.map((h,i)=>h.replace(/#/g,(j,k,l)=>(b>0&l[k-1]!='#'|b<0&l[k+1]!='#'&&(f+=(i+=0.5)*b,g+=i*b),f+=d-k-0.5,g+=e-k-0.5))),f>0?'L':g<0?'R':'B')

Bu daha çok golf oynamak mümkün olabilir. Önerilerinizi bekliyoruz.



1

JavaScript ES6, 297 293 bayt

Temel olarak verilen uygulamanın sıkıştırılmış bir versiyonu.

b=(n,e)=>{r=n.split`
`.reverse(),t=r.length,a=r[0].indexOf`#`,f=r[i=l=0].lastIndexOf`#`+1;e*=n.indexOf`~o`>-1?-1:1;for(d=t-1;d>=0;d--)r[d].split``.map((n,r,t)=>{(j="#")==n&&((0>e&&j!=t[r-1]||e>0&&j!=t[r+1])&&(i+=(d+.5)*-e,l+=(d+.5)*-e),i+=a-(r+.5),l+=f-(r+.5))},0);return i>0?"L":0>l?"R":"B"}

Yarı genişletilmiş:

b = (n, e) => {
    r = n.split `
`.reverse(), t = r.length, a = r[0].indexOf `#`, f = r[i = l = 0].lastIndexOf `#` + 1;
    e *= n.indexOf `~o` > -1 ? -1 : 1;
    for (d = t - 1; d >= 0; d--) r[d].split ``.map((n, r, t) => {
        (j = "#") == n && ((0 > e && j != t[r - 1] || e > 0 && j != t[r + 1]) && (i += (d + .5) * -e, l += (d + .5) * -e), i += a - (r + .5), l += f - (r + .5))
    }, 0);
    return i > 0 ? "L" : 0 > l ? "R" : "B"
}
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.