시소에 무게 세트 균형


32

밸런싱 법

개요

가중치 세트를 나타내는 3 자리 한 자리 양의 정수를 입력하면 레버 효과를 고려하여 무게 중심이 중심 피벗 주위에 균형을 이루도록 가중치를 배치 한 시소의 ASCII 표현을 출력합니다.

각 숫자의 가중치는 해당 값과 같습니다. 각 숫자의 토크는 무게가 중심으로부터의 거리를 문자로 곱한 값입니다. 시소가 균형에있을 경우, 시소의 왼쪽에있는 가중치의 합 토크는 같은 오른쪽에 그, 그와 동일해야 .

입력

1-9 범위의 정수 3 개 정수를 입력 할 수는 있지만 튜플, 쉼표로 구분 된 3 개의 값 등이 편리합니다. 그러나 프로그램은 입력 된 숫자를 임의의 순서로 처리 할 수 ​​있어야합니다 (즉, 값이 정렬된다고 가정하지 않아야 함). 중복 번호가 입력 될 수 있습니다 (예 : 2,3,2).

입력은 항상 수학적으로 유효한 출력을 허용합니다. 그렇지 않으면 입력이 유효하지 않습니다.

산출

출력물은 무게를 넣은 시소의 2 줄 ASCII 표현이어야합니다. 첫 번째 줄에는 시소에서 균형을 맞추기 위해 간격이있는 숫자가 있습니다.

거리와 토크가 0이되는 스케일의 가장 중앙에 숫자를 배치 할 수 없습니다. 중심으로부터의 유효 거리는 피벗의 왼쪽 또는 오른쪽을 포함하여 1-10 자입니다.

숫자가 차지하지 않는 공간에는 밑줄 문자 18 개가 있습니다 (중심 밑줄과 양쪽에 10 개, 숫자가 차지하는 3 개의 위치 빼기). 마지막 줄에는 피벗을 나타내는 스케일 중심에 정렬 된 단일 캐럿 문자가 있습니다.

입력:

4,7,2

산출:

________7___42_______
          ^

7 * 2 = 4 * 2 + 2 * 3

어느 쪽이든 숫자를 출력 할 수 있습니다. 예를 들어 다음과 같이 유효합니다.

_______24___7________
          ^

2 * 3 + 4 * 2 = 7 * 2

다음과 같이 균형을 유지하는 한 숫자를 스케일의 어느 곳에 나 배치 할 수 있습니다.

입력:

3,1,5

산출:

_____5________1__3___
          ^

5 * 5 = 1 * 4 + 3 * 7

또는

____5________1_____3_
          ^

5 * 6 = 1 * 3 + 3 * 9

또는

____5___________1_3__
          ^

5 * 6 = 1 * 6 + 3 * 8

기타

프로그램은 유효한 출력 중 하나만 출력하면됩니다. 입력이 유효하지 않은 경우 오류를 출력 할 필요가 없습니다.

노트

  • 이것은 이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다.
  • 프로그램은 독립형이거나 숫자를 입력으로 받아서 문자열을 리턴하는 함수일 수 있습니다.
  • 마지막 줄에서 후행 줄 바꿈과 공백은 선택 사항입니다.
  • 시소 가 무엇인지 모르는 경우 시소 흔들림 또는 티 터보 드라고도합니다.

다음은 유효한 입력과 솔루션을 보여주는 붙여 넣기입니다 (일부 중복).
samgak

11
훌륭한 첫 도전! 흥미로운 문제와 철저한 사양.
xnor

2
알고리즘에 따라 정수 벡터가 주어지면 모든 항목이 다른 정수 직교 벡터를 찾도록 요청합니다.
자랑스런 Haskeller

답변:


13

CJam, 40 39 38 바이트

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

온라인으로 사용해보십시오.

작동 원리

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 바이트

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

여기에서 테스트하십시오.

설명

첫째, 관찰 : 우리는 시소 끝에 두 자리 숫자를 넣을 필요가 없습니다. 그것이 유효한 해결책 일 때, 적어도 하나의 다른 유효한 해결책이 있습니다 (챌린지에 대한 의견의 페이스트 빈에 따라).

'_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

자바, 519 414 321 바이트

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

골프에 대한 나의 첫 번째 시도.

로 전화 할 수 있습니다 f(a,b,c). 여기 사용해보십시오

편집 : 중고 izlin 방법 확인(a*i+b*j+c*k)==0

편집 : J Atkin의 골프 제안에 감사드립니다.


1
당신의 서명을 변경하여 몇 바이트를 저장할 수 p에를 Object a다른 2 개의 장소에서 사용할 System.out.print(ln)들.
J Atkin

1
그리고 a한 번만 사용되므로 인라인 할 수 있습니다.
J Atkin

5

피스, 67 58 53 49 바이트

이것은 Pyth에게는 큰 측면에서 약간의 느낌이 들지만, 나는 이것을 훨씬 더 작게 할 수있는 언어에 익숙하지 않습니다. 50 바이트 이하, 마침내 이것에 만족합니다!

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

입력은 예를 들어 정수 배열로 예상됩니다 [1,2,3]. 여기에서 시도 하십시오.

설명 :

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

마지막으로 몇 가지 입력 및 출력 예 :

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

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

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

4

C- 237228 바이트

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

로 전화 할 수 있습니다 f(a,b,c).

여기에서 시도 하십시오 .

출력 예 :

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

f(3,1,5)
3____1___________5___
          ^       

3

파이썬 2.7 235 226 219 바이트

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

몇 가지 기본 예제로 테스트 하면 다음과 같은 (1,1,1),(1,2,1),(3,1,5),(4,7,2)결과가 나타납니다.

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

여기에 붙여 넣은 모든 가능한 입력에 대한 출력


"".join(l) -> 'l'[2::5]1 바이트 더 짧습니다 (따옴표를 백틱으로 대체).
Kade

또한 함수에서 프로그램으로 접근 방식을 변경하려는 경우이를 222 바이트로 골프화 할 수 있습니다.
Kade

@samgak 죄송합니다. 내 나쁜, 내가 질문을 올바르게 읽는 줄 알았습니다. 2 바이트 더 :(
Kamehameha

@ Vioz- 멋진 팁. 에 대해 몰랐습니다 repr. :)
Kamehameha

3

PHP, 278 바이트

여러 개의 중첩 루프와 몇 가지 테스트를 사용하는 무차별 대입 솔루션입니다.

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

항상 그렇듯이 파일에 파일을 넣고 (이름을 지어주십시오 seesaw.php), 줄을 결합하십시오 (가독성을 위해 여기에 쪼개십시오), <?php파일의 시작 부분에 PHP 마커 ( )를 넣으십시오 (기술적으로는 프로그램의 일부가 아닙니다) 다시 가다

실행 예 :

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

리플렉션없이 모든 솔루션을 생성 및 표시하지만 입력 값에 중복이 포함 된 경우 중복을 제거하지 않습니다.


3

줄리아, 154 바이트

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

언 골프 + 설명 :

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) 바이트

명령 행에서 a, b, c를 인수로 호출하십시오.

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

main을 생략 할 수 있으면 함수의 바이트 수는 214로 떨어집니다.

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

둘 다 첫 번째 가중치를 왼쪽에 배치 한 다음 가능한 두 번째 가중치 위치를 따라 스캔하고 세 번째 가중치를 계산하는 동일한 전략을 사용합니다. 내부 루프를 제거 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.