레고 기어 비율


23

나는 거대한 레고 로봇을 만들고 있는데 기어 세트를 사용하여 특정 기어비를 생성해야합니다. 8, 16, 24 또는 40 개의 이빨과 같은 일반적인 레고 기어 크기의 기어가 많이 있습니다. 기어비를 입력 할 때 사용할 수있는 프로그램을 작성하면 요청 된 비율을 얻기 위해 사용해야하는 기어 조합을 알려줍니다.

입력 비율은 콜론으로 구분 된 두 개의 정수로 표준 입력 (또는 귀하의 언어와 동등한 것)에 지정됩니다. 비율은 a:b출력 샤프트가 a/b입력 샤프트만큼 빠르게 회전해야한다는 것을 의미합니다 .

표준 출력으로 출력 형태의 기어 비의 공간 분리 된 목록을 포함하는 단일 라인이어야 x:y여기서 x입력축 기어의 크기 및 y출력 축의 기어의 크기이다. 주어진 비율에 대해 가능한 최소 기어 수를 사용해야합니다. 각 xy중 하나 여야합니다 8,16,24,40.

예 :

1:5 -> 8:40
10:1 -> 40:8 16:8
9:4 -> 24:16 24:16
7:1 -> IMPOSSIBLE
7:7 ->
6:15 -> 16:40

원하는 기어비가 불가능한 경우 "불가능"을 인쇄하십시오. 기어가 필요하지 않으면 빈 줄을 인쇄하십시오.

이것은 코드 골프이며, 가장 짧은 답변이 이깁니다.


치아의 비율이 각속도에 반비례하지 않습니까? 예를 들어 원하는 입력 출력 속도가 1 : 5 인 경우 비율이 8:40 대신 40 : 8이 아니어야합니까? 또는 왼쪽 비율이 실제 기어 이빨 대 실제 기어 이빨 비율입니까?
DavidC

재미있는 질문 ... 1:5 -> 8:4010:1 -> 40:8메이크업 감각하지만 너무 많은 다른 사람.
Rob

@DavidCarraher : 어느 쪽이든 정의 할 수 있다고 생각합니다. 나는 내부적으로 일관성을 유지하려고 노력했다. 1:5이는 출력 샤프트가 5 배 느리게 회전한다는 것을 의미하며, 입력에 8 개의 톱니 기어가 있고 출력에 40 개의 톱니 기어가 있습니다.
Keith Randall

@ MikeDtrick : 글쎄, 10:1 -> 40:8 16:8당신이 말한 것이 아닙니다. 다른 사람들이 당신을 혼동하는 것은 어떻습니까? 두 번 9:4수행 3:2됩니다. 3:2를 사용하여 구현됩니다 24:16.
Keith Randall

2
@ MikeDtrick : 첫 번째 질문에 그렇습니다. 10 : 1을 얻으려면 5 : 1 (40 이빨 / 8 이빨 사용)과 2 : 1 (16 이빨 / 8 이빨 사용)을 수행 할 수 있습니다. 7:7와 동일 1:1하므로 구현할 기어가 필요하지 않습니다.
Keith Randall

답변:


4

파이썬-204

좋아, 먼저 갈게

def p(n,a=[1]*9):
 n=int(n)
 for i in(2,3,5):
    while n%i<1:n/=i;a=[i]+a
 return a,n
(x,i),(y,j)=map(p,raw_input().split(':'))
print[' '.join(`a*8`+':'+`b*8`for a,b in zip(x,y)if a!=b),'IMPOSSIBLE'][i!=j]
편집하다:

출력을 '최적화'하기 위해 print명령문 앞에 추가 할 수 있습니다 .

for e in x:
 if e in y:x.remove(e);y.remove(e)

나는 총 266 자 까지 가져다 준다고 생각합니다.


1
<1대체 할 수 있습니다 ==0. 또한 일 if b:a=...return a수 있습니다 return b and...or a.
ugoren

예를 들어에서 작동하지 않습니다 23:12.
Keith Randall

잘 발견되었습니다. 12를 나눌 수 있기 때문에 통과합니다. elif i!=1:return[]원본에 추가 하면 문제가 해결되지만 다른 문제가 발생합니다. $ python gears.py <<< 21:28=> 24:16.. 나는 그것을 조사 할 것이다. 문제가 그렇게 간단하지 않은 것처럼 보입니다. : DI 코드가 더 길어야한다고 생각하거나 다른 접근법이 필요합니다.
daniero

당신은 간다; 나는 이것이 예상대로 작동한다고 생각합니다. 심지어 만든이 작은 :)
daniero

꽤 좋아 보이지만 최적이 아닙니다. 6:15할 수 16:40있지만 코드가 반환 24:40 16:24됩니다.
Keith Randall

4

펄 - 310 306 294 288 272

나는 펄로 조금 녹슬고 코드 골프를 한 적이 없지만 변명은 없습니다. 문자 수는 줄 바꿈이 없습니다. perl v5.14.2 사용.

($v,$n)=<>=~/(.+):(.+)/;
($x,$y)=($v,$n);($x,$y)=($y,$x%$y)while$y;
sub f{$p=shift;$p/=$x;for(5,3,2){
while(!($p%$_)){$p/=$_;push@_,$_*8}}
$o="IMPOSSIBLE"if$p!=1;
@_}
@a=f($v);@b=f($n);
if(!$o){for(0..($#b>$#a?$#b:$#a)){
$a[$_]||=8;
$b[$_]||=8;
push@_,"$a[$_]:$b[$_]"}}
print"$o@_\n"

나는 비평가와 힌트를 기대하고 있습니다. 코드 골프에 대한 팁과 요령을 찾기가 쉽지 않습니다 (펄 단위로).


를 제거하여 9 개의 문자를 저장할 수 있으며 $1:$2 -> 출력에 필요하지 않습니다.
DaveRandom

오, 나는 사양을 잘못 읽었다. 감사.
Patrick B.

당신은 같은 문을 줄일 수 $a[$_]=8 if!$a[$_];$a[$_]||=8;
ardnew

줄 바꿈은 하나의 문자로 계산됩니다.
Timtech

첫 번째 줄은 ($v,$n)=split/:|\s/,<>;(견적되지 않음) 으로 축약 될 수 있습니다 .
msh210

2

SWI-도입부 324 250 248 204 바이트

프롤로그는 이와 같은 문제를 해결하는 데 능숙합니다.

m(P):-(g(P,L),!;L='IMPOSSIBLE'),write(L).
g(A:A,''):-!.
g(A:B,L):-A/C/X,C>1,B/C/Y,!,g(X:Y,L);A/C/X,!,B/D/Y,C*D>1,g(X:Y,T),format(atom(L),'~D:~D ~a',[C*8,D*8,T]).
X/Y/Z:-(Y=5;Y=3;Y=2;Y=1),Z is X//Y,Y*Z>=X.

술어에 입력 매개 변수가 용어 매개 변수로 전달됩니다 m. 출력은 stdout에 기록됩니다. 후행 'true'에 대해 죄송합니다. 그것은 모든 것이 괜찮다는 것을 알려주는 통역사의 방법입니다.

?- m(54:20).
24:40 24:16 24:8 
true.

?- m(7:7).
true.

?- m(7:1).
IMPOSSIBLE
true.

2

C, 246 (216) 213 바이트

내 프롤로그 솔루션을 이길 (거의) 시도에서 C 솔루션을 완전히 다시 작성했습니다.

b,c,d;f(a,b,p){while(c=a%5?a%3?a%2?1:2:3:5,d=b%5?b%3?b%2?1:2:3:5,c*d>1)c<2|b%c?d<2|a%d?p&&printf("%d:%d ",8*c,8*d):(c=d):(d=c),a/=c,b/=d;c=a-b;}main(a){scanf("%d:%d",&a,&b);f(a,b,0);c?puts("IMPOSSIBLE"):f(a,b,1);}

내 원래 C 솔루션 (246 바이트) :

#define f(c,d) for(;a%d<1;a/=d)c++;for(;b%d<1;b/=d)c--;
b,x,y,z;main(a){scanf("%d:%d",&a,&b);f(x,2)f(y,3)f(z,5)if(a-b)puts("IMPOSSIBLE");else
while((a=x>0?--x,2:y>0?--y,3:z>0?--z,5:1)-(b=x<0?++x,2:y<0?++y,3:z<0?++z,5:1))printf("%d:%d ",a*8,b*8);}

목록을 작성하지 않고 수행 할 수 있음을 증명하는 것이 좋습니다.


2

Pyth, 101 바이트

(2012 년 9 월 이전의 언어를 사용함에 따라 경쟁에서 경쟁이 거의 없음)

D'HJH=Y[)VP30W!%JN=/JN=Y+NY))R,YJ;IneKhm'vdcz\:J"IMPOSSIBLE").?V.t,.-Y.-hK=J.-hKYJ1In.*Npj\:m*8d_Np\ 

@daniero의 python 응답 구현 이지만 Pyth에 대해서는 반 최적화되었습니다.

D'H                               - Define a function (') which takes an argument, H.
   JH                             - J = H (H can't be changed in the function)
     =Y[)                         - Y = []
         V                        - For N in ...
          P30                     - Prime factors of 30 (2,3,5)
             W!%JN                - While not J%N
                  =/JN            - J /= N
                      =Y+NY       - Y = N + Y
                           ))R,YJ - To start of function, return [Y,J]

ENDFUNCTION

If 
         cz\:  - Split the input by the ':'
     m'vd      - ['(eval(d)) for d in ^]
   Kh          - Set K to the first element of the map (before the :)
  e            - The second returned value
             J - The second returned value after the : (The variables are globals)
 n             - Are not equal

Then 
"IMPOSSIBLE" - Print "IMPOSSIBLE"

Else
V                                      - For N in
 .t                1                   - transpose, padded with 1's
             .-hKY                     - 1st function first return - 2nd function first return
           =J                          - Set this to J
       .-hK                            - 1st function first return - ^
    .-Y                                - 2nd function first return - ^
   ,              J                    - [^, J]
                                         (Effectively XOR the 2 lists with each other)
                    I                  - If
                     n.*N              - __ne__(*N) (if n[0]!=n[1])
                         pj\:m*8d_N    - print ":".join([`d*8` for d in reversed(N)])
                                   p\  - print a space seperator

여기 사용해보십시오

또는 모든 경우를 테스트


0

ES6, 230 바이트

x=>([a,b]=x.split`:`,f=(x,y)=>y?f(y,x%y):x,g=f(a,b),d=[],a/=g,f=x=>{while(!(a%x))a/=x,d.push(x*8)},[5,3,2].map(f),c=d,d=[],a*=b/g,[5,3,2].map(f),a>1?'IMPOSSIBLE':(c.length<d.length?d:c).map((_,i)=>(c[i]||8)+':'+(d[i]||8)).join` `)

가장 긴 골프 중 하나이므로 뭔가 잘못한 것 같습니다 ... Ungolfed :

x => {
    [a, b] = x.split(":");
    f = (x, y) => y ? f(y, x % y) : x; // GCD
    g = f(a, b);
    f = x => {
        r = [];
        while (!(x % 5)) { x /= 5; r.push(5); }
        while (!(x % 3)) { x /= 3; r.push(3); }
        while (!(x % 2)) { x /= 2; r.push(2); }
        if (x > 1) throw "IMPOSSIBLE!";
        return r;
    }
    c = f(a);
    d = f(b);
    r = [];
    for (i = 0; c[i] || d[i]; i++) {
        if (!c[i]) c[i] = 8;
        if (!d[i]) d[i] = 8;
        r[i] = c[i] + ":" + d[i];
    }
    return r.join(" ");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.