লেগো গিয়ার অনুপাত


23

আমি একটি দৈত্য লেগো রোবট তৈরি করছি এবং গিয়ার্সের সেট ব্যবহার করে আমার কিছু নির্দিষ্ট গিয়ার অনুপাত উত্পন্ন করতে হবে। আমার প্রচলিত লেগো গিয়ার আকারের সাথে প্রচুর গিয়ার রয়েছে: 8, 16, 24 বা 40 টি দাঁত। এমন একটি প্রোগ্রাম লিখুন যেখানে আমি একটি গিয়ারিং অনুপাত ইনপুট করতে পারি এবং প্রোগ্রামটি আমাকে অনুরোধক অনুপাতটি পেতে কী গিয়ারগুলির সংমিশ্রণটি ব্যবহার করা উচিত তা আমাকে বলে।

ইনপুট অনুপাতটি কোলন দ্বারা পৃথক দুটি পূর্ণসংখ্যার সাথে স্ট্যান্ডার্ড ইনপুট (বা আপনার ভাষার সমতুল্য) এ নির্দিষ্ট করা হবে। এর একটি অনুপাতের a:bঅর্থ যে আউটপুট শ্যাফ্টটি a/bইনপুট শ্যাফ্টের চেয়ে দ্রুতগতির হয়ে যায়।

স্ট্যান্ডার্ড আউটপুট থেকে আউটপুট থেকে গিয়ার অনুপাতের স্থান-বিভাজিত তালিকা সমেত একটি একক লাইন হওয়া উচিত , ইনপুট শ্যাফটে গিয়ারের আকার x:yকোথায় এবং আউটপুট শ্যাফটের গিয়ারের আকার is প্রদত্ত অনুপাতের জন্য আপনাকে ন্যূনতম সম্ভাব্য গিয়ারগুলি ব্যবহার করতে হবে। প্রতিটি এবং অবশ্যই একটি হতে হবে ।xyxy8,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

যদি পছন্দসই গিয়ার অনুপাত অসম্ভব হয় তবে "IMPOSSIBLE" মুদ্রণ করুন। যদি কোনও গিয়ারের প্রয়োজন হয় না, খালি স্ট্রিংটি মুদ্রণ করুন।

এটি কোড গল্ফ, সংক্ষিপ্ত উত্তর জয়।


দাঁতগুলির অনুপাতটি কৌণিক গতির সাথে বিপরীতভাবে আনুপাতিক নয়? সুতরাং, উদাহরণস্বরূপ, যদি পছন্দসই ইনপুট আউটপুট বেগ 1: 5 হয়, তবে অনুপাতটি 8:40 এর পরিবর্তে 40: 8 হওয়া উচিত নয়? বা বাম-হাতের অনুপাতটি কী আপনি চান গিয়ার দাঁতগুলির যথাযথ গিয়ার দাঁতগুলিতে?
ডেভিডসি

আকর্ষণীয় প্রশ্ন ... 1:5 -> 8:40এবং 10:1 -> 40:8বোধগম্য করুন তবে অন্যরা এতটা না।
রব

@ ডেভিডকার্যাহার: আমার ধারণা আপনি যে কোনও উপায়ে এটি সংজ্ঞায়িত করতে পারেন। আমি অভ্যন্তরীণভাবে সামঞ্জস্যপূর্ণ থাকার চেষ্টা করেছি। 1:5মানে আউটপুট শ্যাফ্টটি পাঁচগুণ ধীর হয়ে যায় এবং ইনপুটটিতে একটি 8 টি দাঁত গিয়ার এবং আউটপুটে 40 টি দাঁত গিয়ার ঘটায়।
কীথ র্যান্ডাল

@ মাইকডট্রিক: ঠিক আছে, 10:1 -> 40:8 16:8আপনি যা বলেছিলেন তা নয়। অন্যরা আপনাকে কী বিভ্রান্ত করে? দুইবার করে 9:4প্রয়োগ করা 3:2হয়। 3:2ব্যবহার করে বাস্তবায়ন করা হয় 24:16
কীথ র্যান্ডাল

2
@ মাইকডট্রিক: আপনার প্রথম প্রশ্নে হ্যাঁ। 10: 1 পেতে আপনি 5: 1 করতে পারেন (40 টি দাঁত / 8 দাঁত ব্যবহার করে) এবং তারপরে 2: 1 (16 টি দাঁত / 8 দাঁত ব্যবহার করে)। 7:7এর মতোই 1:1, সুতরাং এটি প্রয়োগ করার জন্য কোনও গিয়ারের প্রয়োজন নেই।
কিথ র্যান্ডাল

উত্তর:


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)

আমি বিশ্বাস করি মোট মোট ২ bringing6 টি চরিত্র পর্যন্ত পৌঁছেছে


1
<1প্রতিস্থাপন করতে পারেন ==0। এছাড়াও, if b:a=...return aহতে পারে return b and...or a
ugoren

যেমন কাজ করে না 23:12
কিথ র্যান্ডাল

ভাল বিক্ষোভ. এটি 12 দিয়ে বিভাজ্য হওয়ার পরে চলে। মূলটিতে যুক্ত elif i!=1:return[]করা সমস্যার সমাধান করে তবে অন্য একটিটির পরিচয় দেয়। $ python gears.py <<< 21:28=> 24:16.. আমি এটি খতিয়ে দেখছি। দেখে মনে হচ্ছে সমস্যাটি এতটা সহজ ছিল না: ডিআই ভাবেন কোডটি আরও দীর্ঘ হতে হবে, অথবা আমার অন্য পদ্ধতির প্রয়োজন।
দানিরো

এই নাও; আমি মনে করি এটি প্রত্যাশার মতো কাজ করে। এমনকি এটি আরও ছোট করে
রেখেছে

দেখতে বেশ সুন্দর লাগছে, তবে এটি অনুকূল নয়। 6:15সঙ্গে কাজ করা যেতে পারে 16:40কিন্তু আপনার কোড প্রদান 24:40 16:24
কিথ র্যান্ডাল

4

পার্ল - 310 306 294 288 272

আমি পার্লের সাথে কিছুটা মরিচা এবং কোনও কোড-গল্ফ করিনি ... তবে কোনও অজুহাত নেই। চর-গণনা লাইন ব্রেক ছাড়াই। পার্ল 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 -> , আউটপুটটিতে এটি প্রয়োজন হয় না।
ডেভর্যান্ডম

ওহ, আমি অনুমানটি ভুলভাবে লিখেছি। ধন্যবাদ।
প্যাট্রিক বি

তোমার মত বিবৃতি কমে যায় $a[$_]=8 if!$a[$_];থেকে$a[$_]||=8;
ardnew

নিউলাইনগুলি একটি চরিত্র হিসাবে গণনা করে।
টিমটেক

প্রথম লাইনটি সংক্ষিপ্ত করা যেতে পারে ($v,$n)=split/:|\s/,<>;(অনির্ধারিত)।
msh210

2

swi-prolog, 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 লিখিত হয়। 'সত্য' অনুমানের জন্য দুঃখিত; এটাই দোভাষীর উপায় যে আমাকে সব কিছু ঠিকঠাক করে জানাচ্ছিল।

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

?- m(7:7).
true.

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

2

সি, 246 216 213 বাইট

আমার নিজস্ব প্রোলোগ সমাধানটি হারাতে (নিরর্থক) প্রচেষ্টায় আমি সি সমাধানটি সম্পূর্ণভাবে আবার লিখেছি w

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

আমার আসল সি দ্রবণ (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

পাইথ, 101 বাইট

(প্রায় অবশ্যই প্রতিযোগিতায় অ-প্রতিদ্বন্দ্বিতা হিসাবে সেপ / ২০১২ এর চেয়ে নতুন ভাষা ব্যবহার করা হয়েছে)

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

@ ডানিরোর পাইথন উত্তরের একটি বাস্তবায়ন তবে পাইথের জন্য আধা-অনুকূলিত।

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` `)

আমার দীর্ঘতম গল্ফগুলির মধ্যে একটি, তাই আমি অবশ্যই কিছু ভুল করেছিলাম ... অবরুদ্ধ:

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.