Seimbangkan satu set bobot pada jungkat-jungkit

32

Usaha menyeimbangkan

Ikhtisar

Diberikan input 3 bilangan bulat positif satu digit yang mewakili satu set bobot, output representasi ASCII dari jungkat-jungkit dengan bobot ditempatkan di atasnya sehingga seimbang di sekitar poros pusat, dengan mempertimbangkan efek tuas.

Setiap angka memiliki bobot yang sama dengan nilainya. Torsi masing-masing angka adalah berat yang dikalikan jarak dari pusat dalam karakter. Agar jungkat-jungkit seimbang, jumlah torsi bobot di sebelah kiri jungkat-jungkit harus sama dengan torsi yang ada di kanan, seperti ini .

Memasukkan

3 bilangan bulat di kisaran 1-9. Namun, Anda dapat memasukkan bilangan bulat dengan mudah, misalnya tupel, 3 nilai yang dipisahkan koma, dll. Namun program Anda harus dapat menangani input angka dalam urutan apa pun (mis. Tidak ada asumsi bahwa nilainya akan diurutkan). Nomor duplikat dapat dimasukkan (mis. 2,3,2).

Input akan selalu memungkinkan secara matematis untuk output yang valid, jika tidak input tersebut tidak valid.

Keluaran

Keluaran harus berupa representasi ASCII 2-baris jungkat-jungkit dengan bobot yang ditempatkan di atasnya. Di baris pertama adalah digit, spasi untuk menyeimbangkan mereka di jungkat-jungkit.

Angka mungkin tidak ditempatkan di tengah skala, di mana jarak dan karenanya torsi akan menjadi nol. Jarak yang valid dari rentang pusat dari 1-10 karakter termasuk ke kiri atau kanan pivot.

Di ruang-ruang yang tidak dihuni oleh angka terdapat 18 karakter garis bawah (center garis bawah dan 10 di setiap sisi, minus 3 posisi yang ditempati oleh angka). Pada baris terakhir adalah karakter tanda tunggal yang disejajarkan dengan pusat skala, mewakili pivot.

Contohnya

Memasukkan:

4,7,2

Keluaran:

________7___42_______
          ^

7 * 2 = 4 * 2 + 2 * 3

Angka dapat berupa output di kedua sisi, misalnya ini juga akan valid:

_______24___7________
          ^

2 * 3 + 4 * 2 = 7 * 2

Angka dapat ditempatkan di mana saja pada skala selama mereka seimbang, misalnya:

Memasukkan:

3,1,5

Keluaran:

_____5________1__3___
          ^

5 * 5 = 1 * 4 + 3 * 7

atau

____5________1_____3_
          ^

5 * 6 = 1 * 3 + 3 * 9

atau

____5___________1_3__
          ^

5 * 6 = 1 * 6 + 3 * 8

dll

Program Anda hanya perlu meng-output salah satu dari output yang valid. Itu tidak harus menghasilkan kesalahan jika input tidak valid.

Catatan

  • Ini adalah sehingga program terpendek dalam byte menang
  • Program dapat berupa fungsi yang berdiri sendiri atau yang menerima angka sebagai input dan mengembalikan string.
  • Mengejar baris baru dan spasi putih di baris terakhir adalah opsional
  • Jika Anda tidak tahu apa itu jungkat - jungkit , itu juga dikenal sebagai jungkat-jungkit atau papan jungkat-jungkit.
samgak
sumber
Berikut adalah pasta yang menunjukkan input dan solusi yang valid (dengan beberapa duplikasi)
samgak
11
Tantangan pertama yang luar biasa! Masalah yang menarik dan spek menyeluruh.
xnor
2
Secara algoritmik, diberi vektor bilangan bulat, ini meminta Anda menemukan vektor ortogonal bilangan bulat dengan semua entri yang berbeda.
haskeller bangga

Jawaban:

13

CJam, 40 39 38 byte

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

Cobalah online.

Bagaimana itu bekerja

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.
Dennis
sumber
5

CJam, 46 44 byte

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

Uji di sini.

Penjelasan

Pertama, sebuah pengamatan: kita tidak perlu meletakkan dua digit di ujung jungkat-jungkit. Setiap kali itu solusi yang valid, setidaknya ada satu solusi valid lainnya (menurut pastebin dalam komentar pada tantangan).

'_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.
Martin Ender
sumber
5

Java, 519 414 321 byte

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);}}

Upaya pertama saya bermain golf.

Anda bisa menyebutnya dengan f(a,b,c). Coba di sini

EDIT: Digunakan metode pemeriksaan izlin(a*i+b*j+c*k)==0

EDIT: Terima kasih, J Atkin untuk saran golfnya.

QSilver
sumber
1
Anda dapat menyimpan beberapa byte dengan mengubah tanda tangan pke Object adan menggunakannya sebagai pengganti 2 System.out.print(ln)detik lainnya.
J Atkin
1
Dan karena ahanya digunakan satu kali, Anda bisa memasukkannya.
J Atkin
5

Pyth, 67 58 53 49 byte

Ini terasa sedikit di sisi besar untuk Pyth, tapi saya hampir tidak cukup akrab dengan bahasa untuk bisa mendapatkan ini jauh lebih kecil. Sub 50 byte, saya akhirnya senang dengan ini!

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

Input diharapkan sebagai array bilangan bulat, misalnya [1,2,3]. Coba di sini.

Penjelasan:

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

Dan akhirnya, beberapa contoh input dan output:

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

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

[9,8,5] ->
5____8______________9
          ^
Sok
sumber
4

C - 237 228 Bytes

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;}}}}}

Anda bisa menyebutnya dengan f(a,b,c).

Coba di sini .

Output contoh:

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

f(3,1,5)
3____1___________5___
          ^       
izlin
sumber
3

Python 2.7 235 226 219 Bytes

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+"^"

Mengujinya dengan beberapa contoh dasar - (1,1,1),(1,2,1),(3,1,5),(4,7,2)hasil di-:

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

Output untuk semua input yang mungkin disisipkan di sini

Kamehameha
sumber
"".join(l) -> 'l'[2::5]lebih pendek satu byte (ganti tanda kutip dengan backticks).
Kade
Juga, jika Anda ingin mengubah pendekatan Anda dari fungsi ke program, Anda dapat menurunkan ini ke 222 byte.
Kade
@samgak oops. Buruk saya, pikir saya membaca pertanyaan dengan benar. 2 byte lagi :(
Kamehameha
@ Vioz- Tip yang luar biasa. Tidak tahu repr. :)
Kamehameha
3

PHP, 278 byte

Solusi brute-force yang menggunakan banyak loop bersarang dan beberapa tes.

$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);}

Seperti biasa, masukkan ke dalam file (beri nama seesaw.php), gabungkan baris (pisah di sini agar mudah dibaca), letakkan penanda PHP (<?php ) di awal file (secara teknis, ini bukan bagian dari program) dan Anda baik untuk pergi.

Contoh eksekusi:

$ 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_
          ^

Ini menghasilkan dan menampilkan semua solusi (tanpa refleksi), tetapi tidak menghapus duplikat (ketika nilai input mengandung duplikat).

aksioma
sumber
3

Julia, 154 byte

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*"^"))

Penjelasan + tidak dikumpulkan:

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
Alex A.
sumber
2

C, 252 (214) byte

Panggil dengan a, b, c sebagai argumen di baris perintah.

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);} 

Jika main dapat dinonaktifkan, jumlah byte turun ke 214 untuk suatu fungsi.

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);}

Keduanya menggunakan strategi yang sama yaitu menempatkan bobot pertama di sebelah kiri, kemudian memindai di sepanjang posisi bobot kedua yang mungkin dan menghitung bobot ketiga. Ini memungkinkan penghapusan loop dalam.

LambdaBeta
sumber