Bir tahterevalli üzerindeki ağırlık kümesini dengeleyin


32

Dengeleme Yasası

genel bakış

Bir ağırlık kümesini temsil eden 3 tek basamaklı pozitif tamsayıların bir girdisi göz önüne alındığında, üzerine bir ağırlığa sahip bir tahterevalli ASCII temsili çıktısı alıncaya kadar, kol etkileri hesaba katılarak merkezi bir pivot etrafında dengede tutulur.

Her sayının değerine eşit bir ağırlığı vardır. Her sayının torku, ağırlığın merkezden uzaklığı karakter cinsinden çarpmasıdır. Tahterevalli dengede olması için tahterevalli solunda ağırlıkların toplamı torku gibi sağda olanlar, bu eşit olmak zorundadır bu .

Giriş

1-9 aralığında 3 tam sayı. Ancak tamsayıları girebilirsiniz, örneğin uygun, örneğin bir virgül, 3 virgülle ayrılmış değer vb. Çift sayılar girilebilir (örneğin 2,3,2).

Girişler her zaman matematiksel olarak geçerli bir çıktıya izin verir, aksi takdirde giriş geçerli değildir.

Çıktı

Çıktı, tahterevalin üzerine yerleştirilmiş ağırlıklar ile birlikte 2 satırlık bir ASCII gösterimi olmalıdır. İlk satırda, onları tahterevalli üzerinde dengelemek üzere aralıklı sayılar bulunur.

Sayılar ölçeğin tam ortasına yerleştirilmeyebilir, bu durumda mesafe ve bu nedenle tork sıfır olur. Merkezden geçerli mesafeler, milin soluna veya sağına dahil olmak üzere 1-10 karakter arasındadır.

Sayıların boş bıraktığı alanlarda, 18 alt çizgi karakteri vardır (her bir tarafta bir merkez alt çizgi ve 10, eksi sayılar tarafından işgal edilen 3 konum). Son satırda, pivotu temsil eden terazinin ortasına hizalı tek bir şapka karakteri bulunur.

Örnekler

Giriş:

4,7,2

Çıktı:

________7___42_______
          ^

7 * 2 = 4 * 2 + 2 * 3

Her iki tarafta da sayılar çıkarılabilir, örneğin bu da geçerli olur:

_______24___7________
          ^

2 * 3 + 4 * 2 = 7 * 2

Rakamlar, teraziler dengede olduğu sürece herhangi bir yere yerleştirilebilir, örneğin:

Giriş:

3,1,5

Çıktı:

_____5________1__3___
          ^

5 * 5 = 1 * 4 + 3 * 7

veya

____5________1_____3_
          ^

5 * 6 = 1 * 3 + 3 * 9

veya

____5___________1_3__
          ^

5 * 6 = 1 * 6 + 3 * 8

vb

Programınızın yalnızca geçerli çıktılardan birini çıkarması gerekiyor. Giriş geçerli değilse bir hata vermek zorunda değildir.

notlar

  • Bu yani bayt cinsinden en kısa program kazanır.
  • Program, tek başına veya sayıları girdi olarak kabul eden ve bir dize döndüren bir işlev olabilir.
  • Son satırdaki son satırdaki satır sonunu ve beyaz boşluk isteğe bağlıdır
  • Bir tahterevalli ne olduğunu bilmiyorsanız , aynı zamanda bir terlik toterter veya bir terlik tahtası olarak da bilinir.

İşte geçerli girişleri ve çözümleri gösteren bir yapıştırma (bazı çoğaltmalı)
samgak

11
Mükemmel bir ilk meydan okuma! İlginç bir problem ve tam bir şartname.
xnor

2
Algoritmik olarak, tam numaralı bir vektör verildiğinde, bu, sizden, tüm farklı girişleri olan tam numaralı bir ortogonal vektör bulmanızı ister.
Gurur haskeller

Yanıtlar:


13

CJam, 40 39 38 bayt

q~21Ue]e!{21,Af-Aest.*:+!}=0'_erNAS*'^

Çevrimiçi deneyin.

Nasıl çalışır

q~                                     e# Read and evaluate the input.
  21Ue]                                e# Append zeroes to achieve a length of 21.
       e!                              e# Push all unique permutations.
         {               }=            e# Find the first permutation such that:
          21,                          e#  Push [0 ... 20].
             Af-                       e#  Subtract 10 from each.
                Aest                   e#  Replace the element at index 10 with the
                                       e#  current time (ms since epoch) to push
                                       e#  [-10 ... -1 <big number> 1 ... 10].
                    .*                 e#  Multiply each number of the permutation
                                       e#  by the corresponding distance.
                      :+               e#  Add the products.
                                       e#  The timestamp makes sure that this sum
                                       e#  is non-zero for a non-zero element in
                                       e#  the middle of the permutation.    
                        !              e#  Push the logical NOT of the sum.
                           0'_er       e# Replace zeroes with underscores.
                                NAS*'^ e# Push a linefeed, ten spaces and a caret.

5

CJam, 46 44 bayt

'_21*q~K,Am3m*{___&=*Afm1$.*:+!}=.{\t}NAS*'^

Burada test et.

açıklama

Birincisi, bir gözlem: Tahterevalin sonlarına asla iki rakam koymamız gerekmiyor. Bu ne zaman geçerli bir çözümse, en az bir başka geçerli çözüm vardır (meydan okuma yorumundaki pastebine göre).

'_21*   e# Push a string of 21 underscores.
q~      e# Read and eval input.
K,      e# Push the array [0 1 .. 19 20]
Am      e# Remove the 10. This is now an array of all valid positions on the seesaw.
3m*     e# Get all 3-tuples of valid positions.
{       e# Select the first tuple for which the following block yields a truthy result.
  ___   e# Make three copies of the tuple.
  &=    e# Intersect the last two copies and check for equality with the first one.
        e# This yields 1 if all positions are distinct, and 0 otherwise.
  *     e# Repeat the original tuple that many times. That is, if the positions are
        e# distinct, leave the tuple unchanged. Otherwise, replace it with an empty array.
  Afm   e# Subtract 10 from each position to get its weight.
  1$    e# Copy the input digits.
  .*    e# Take the pairwise product of weights and digits. If the weights are empty
        e# (because they were not unique), this will just yield a list of the digits.
  :+    e# Sum the weighted digits. If the weights were not unique, this will just sum
        e# the digits and will always be positive.
  !     e# Logical NOT - give 1 if the sum was 0, or 0 otherwise.
}=
.{\t}   e# For each pair of digit and position, replace that position in the underscore
        e# string with the corresponding digit.
N       e# Push a newline.
AS*     e# Push ten spaces.
'^      e# Push a caret.

5

Java, 519 414 321 bayt

static int f(int a,int b,int c){int i,j,k;for(i=-10;i<=10;i++)for(j=i+1;j<=10;j++)for(k=j+1;k<=10;k++){if(a*i+b*j+c*k==0&&i!=0&&j!=0&&k!=0){for(int q=0;q<21;q++){if(q==10+i)p(a);else if(q==10+j)p(b);else if(q==10+k)p(c);else p('_');}p("\n          ^\n");return 0;}}return 0;}static void p(Object a){System.out.print(a);}}

Golfe ilk girişim.

İle arayabilirsiniz f(a,b,c). Burada dene

EDIT: Kullanılan izlin kontrol yöntemi(a*i+b*j+c*k)==0

EDIT: Golf önerileri için teşekkürler, J Atkin.


1
Sen imzasını değiştirerek birkaç byte kaydedebilirsiniz piçin Object ave diğer 2 yerine bunu kullanarak System.out.print(ln)s.
J Atkin

1
Ve asadece bir kez kullanıldığından, onu satır içi yapabilirsiniz.
J Atkin

5

Pyth, 67 58 53 49 bayt

Bu Pyth için çok büyük bir şey hissediyor, ancak dili daha küçük hale getirecek kadar tanıdık değilim. Alt 50 bayt, sonunda nihayet mutluyum!

V.c-KrT-011Z3FY.pQIqs*VNYZjkm?}dN@YxNd\_K+*dT\^.q

Girdi, örneğin bir tamsayı dizisi olarak bekleniyor [1,2,3]. Burada dene .

Açıklama:

V.c-KrT-011Z3FY.pQIqs*VNYZjkm?}dN@YxNd\_K+*dT\^.q
                                                       Implicit: Q = eval(input())
     rT-011                                            Create range from 10 to -10
    K                                                  Store in K
   -       Z                                           Drop 0 from the above
V.c         3                                          For N in (combinations of the above of size 3)
             FY.pQ                                     For Y in (permutations of input)
                     *VNY                              Multiply each element in N by the corresponding element in Y
                    s                                  Take the sum
                  Iq     Z                             If it's equal to zero:
                            m           K              For d in K (K = [10, ..., -10])
                             ?}dN                      Is d in N?
                                 @YxNd                 If so, get corresponding value from Y
                                      \_               Otherwise, get '_'
                          jk                           Join the resulting array into a string (implicit print)
                                         +*dT\^        Join 10 spaces and '^', implicit print
                                               .q      Break all loops and exit

Ve son olarak, bazı örnek girdiler ve çıktılar:

[1,1,1] ->
1__________1_______1_
          ^

[2,9,5] ->
2____5_________9_____
          ^

[9,8,5] ->
5____8______________9
          ^

4

C - 237 228 Bayt

i,j,k;f(a,b,c){char o[]="_____________________\n          ^";for(i=-10;i<9;i+=i+1?1:2){for(j=i+1;j<11;j+=j+1?1:2){for(k=j+1;k<11;k+=k+1?1:2){if((a*i+b*j+c*k)==0){o[i+10]=a+48;o[j+10]=b+48;o[k+10]=c+48;printf("%s",o);return;}}}}}

İle arayabilirsiniz f(a,b,c).

Burada dene .

Örnek çıktılar:

f(4,7,2):
4_____________7_2____
          ^         

f(3,1,5)
3____1___________5___
          ^       

3

Python 2.7 235 226 219 Bayt

def s(n,p=__import__("itertools").permutations):
 l=["_"]*21
 for p,q in[[(a,x+10),(b,y+10),(c,10-z)]for a,b,c in p(n,3)for x,y,z in p(range(1,11),3)if x!=y and a*x+b*y==c*z][0]:l[q]=`p`
 return`l`[2::5]+"\n"+" "*10+"^"

Bazı temel örneklerle test etmek şöyle (1,1,1),(1,2,1),(3,1,5),(4,7,2)sonuçlanır:

(1, 1, 1)
_______1___11________
          ^
(1, 2, 1)
_____1_____12________
          ^
(3, 1, 5)
________5__3_____1___
          ^
(4, 7, 2)
_2_________47________
          ^

Buraya yapıştırılan tüm olası girişler için çıkışlar


"".join(l) -> 'l'[2::5]bir bayt daha kısadır (tırnak işaretlerini backtick'lerle değiştirin).
Kade

Ayrıca, yaklaşımınızı bir işlevden bir programa değiştirmeye istekliyseniz, bunu 222 bayta kadar golf edebilirsiniz.
Kade

@ samgak ayy. Kötü, soruyu doğru okuduğumu sanıyordum. 2 bayt daha :(
Kamehameha

@ Vioz- Harika bir ipucu. Bilmiyordum repr. :)
Kamehameha

3

PHP, 278 bayt

Bir demet iç içe döngü ve birkaç test kullanan bir kaba kuvvet çözümü.

$p=explode(',',$argv[$i=1]);for(;$i<=10;$i++)for($j=1;$j<=10;$j++)
for($k=1;$k<=10;$k++)if($j-$k)for($l=0;$l<3;$l++){$q=array_shift($p);
if($i*$q==$j*$p[0]+$k*$p[1]){$o=str_repeat('_',21);$o[10-$i]=$q;$o[10+$j]=$p[0];
$o[10+$k]=$p[1];echo($o."\n          ^\n");}array_push($p,$q);}

Her zamanki gibi bir dosyaya yerleştirin (ismini yazalım seesaw.php), satırlara katılın (okunabilirlik için buraya bölün), PHP işaretleyicisini ( <?php) dosyanın başına yerleştirin (teknik olarak programın bir parçası değil) ve siz Gitmek iyi.

Bir yürütme örneği:

$ php seesaw.php 9,2,1
_________9_2_____1___
          ^
_________9__2__1_____
          ^
_________9_1__2______
          ^
________9_____2_____1
          ^
________9______2__1__
          ^
________9_____1__2___
          ^
________9___1_____2__
          ^
_______9_________1__2
          ^
____2______9_1_______
          ^
___2_______9___1_____
          ^
__2________9_____1___
          ^
_2_________9_______1_
          ^

Tüm çözümleri üretir ve görüntüler (yansıtma olmadan), ancak kopyaları çıkarmaz (giriş değerleri kopyaları içerdiğinde).


3

Julia, 154 bayt

f(a,b,c)=(x=replace(join(first(filter(p->p⋅[-10:-1,1:10]==0,permutations([a,b,c,zeros(Int,17)])))),"0","_");print(x[1:10]*"_"*x[11:20]*"\n"*" "^10*"^"))

Ungolfed + açıklama:

function f(a,b,c)
    # Create a 20-element array of the input with 17 zeros
    z = [a,b,c,zeros(Int,17)]

    # Get the set of all permutations of z such that the dot product
    # of the permutation with the distances is 0
    d = filter(p -> p  [-10:-1,1:10] == 0, permutations(z))

    # Join the first element of d into a string and replace all of
    # the zeros with underscores
    x = replace(join(first(d)), "0", "_")

    # Print the output
    print(x[1:10] * "_" * x[11:20] * "\n" * " "^10 * "^")
end

2

C, 252 (214) bayt

A, b, c ile komut satırında argüman olarak arayın.

e=48;main(_,v,x,y,z,a,b,c)char**v;{char s[]="_____________________\n          ^";x=*v[1]-e;y=*v[2]-e;z=*v[3]-e;for(a=-1;a+11;--a)for(b=-10;b-11;++b)_=a*x+b*y,!b|b==a|_%z?0:(c=-_/z,c&c<11&c>-11?s[a+10]=x+e,s[b+10]=y+e,s[c+10]=z+e,puts(s),exit(0):0);} 

Eğer ana girilemezse, bir işlev için bayt sayısı 214'e düşer.

a,b,c;f(x,y,z){char s[]="_____________________\n          ^";for(a=-1;a+11;--a)for(b=-10;b-11;++b)!b|b==a|(a*x+b*y)%z?0:(c=-(a*x+b*y)/z,c&&c<11&&c>-11?s[a+10]=x+48,s[b+10]=y+48,s[c+10]=z+48,puts(s),b=10,a=-b:0);}

Her ikisi de ilk ağırlığı sola yerleştirme stratejisini kullanır, ardından olası ikinci ağırlık pozisyonları boyunca tarar ve üçüncü ağırlığı hesaplar. Bu, bir iç döngünün çıkarılmasını sağlar.

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.