সংমিশ্রণ বাইক লক


46

দৃশ্যপট

অফিসে দীর্ঘ দিনের কাজের স্লোগান দেওয়ার পরে এবং স্ট্যাকেক্সচেঞ্জ.কম ব্রাউজ করার পরে , আমি শেষ পর্যন্ত 16:58 এ দরজাটি বের করে দিয়েছি, দিনের সাথে ইতিমধ্যে ক্লান্ত। যেহেতু আমি এখনও কেবলমাত্র একটি ইন্টার্ন, আমার বর্তমান পরিবহণের পদ্ধতিটি সাইকেলটিতে রয়েছে। আমি আমার বিশ্বস্ত পিউজিট রেনল্ডস 501 এর দিকে এগিয়ে যাই, তবে আমি এটিকে চালানোর আগে আমার এটি আনলক করা দরকার। লকটি ফ্রেম এবং সামনের চাকার মাধ্যমে একটি স্ট্যান্ডার্ড চার ডিজিটের কম্বিনেশন লক (0-9)। আমি জাগ্রত থাকার চেষ্টা করার সাথে, সংমিশ্রণে প্রবেশের জন্য আমি আমার হাতটি টানতে থাকি। সংমিশ্রণ বাইক লক

চ্যালেঞ্জ

যেহেতু আমার আঙ্গুলগুলি এতটাই ক্লান্ত, আমি লকটি কয়েকটি স্রোতের সাথে সঠিক সংমিশ্রণে পরিণত করতে চাই। একটি আন্দোলনকে একটি অবস্থান (36 ডিগ্রি) দ্বারা আবর্তন হিসাবে সংজ্ঞায়িত করা হয়, উদাহরণস্বরূপ সেখানে থেকে একটি আন্দোলন 5737থাকে 5738। তবে, আমি একই সাথে টানা তিনটি রিং উপলব্ধি করতে সক্ষম হয়েছি এবং এগুলিকে এক হিসাবে আবর্তিত করতে সক্ষম , যা কেবলমাত্র একটি একক আন্দোলনের হিসাবে গণ্য। উদাহরণস্বরূপ রয়েছে মাত্র একজন আন্দোলন থেকে 5737থেকে 6837বা 5626। ১,২ এবং ৪ সংখ্যাটি একই দিকে চলেছে, তবে স্বতন্ত্রভাবে সংখ্যা number-এর থেকে সরানো একটি চলাচল নয় 5737to6838

অতএব, প্রদত্ত সংমিশ্রণের জন্য আমি বাইক লকটিতে দেখতে পাচ্ছি (যে কোনও 4-সংখ্যার পূর্ণসংখ্যার), এটি আনলক করতে আমি যে সর্বনিম্ন আন্দোলন করতে পারি তা হ'ল এবং হ্যাঁ, যে কোনও সময় আমি উভয় দিকেই ঘুরতে পারি। এর অর্থ এই যে আমি কিছু দিককে এক দিকে এবং অন্য ডিজিটকে অন্য দিকে ঘুরিয়ে দিতে পারি: আমার সমস্ত চলন প্রতিটি আনলকের জন্য অ্যানিটলকওয়াইজ বা ক্লকওয়াইজ হবে না।

কারণ আমি অলস, আমার আনলক কোডটি 0000।

এটি কোড গল্ফ, আমি বেশি কোড লেখার বিরক্ত করতে পারি না, তাই বাইটের সংখ্যায় সংক্ষিপ্ততম প্রোগ্রামটি জয়ী।

ইনপুটটি স্টিডিনের থেকে এসেছে এবং আপনার কোডটি প্রতিটি আন্দোলনের পরে প্রতিটি পদক্ষেপে শেষের দিকে 0000 সহ যে সংযোজনগুলি দেখতে পাচ্ছি তা আউটপুট করা উচিত। কম্বিনেশন আউটপুট প্রতিটি প্রতিটি একটি স্পেস / নিউলাইন / কমা / পিরিয়ড / এম্পারস্যান্ড দ্বারা পৃথক করা উচিত।

উদাহরণ

Input: 1210
0100
0000

Input: 9871
9870
0980
0090
0000

Input: 5555
4445&3335&2225&1115&0005&0006&0007&0008&0009&0000

Input: 1234
0124 0013 0002 0001 0000

আমি এটি http://bicycles.stackexchange.com এ পোস্ট করার চেষ্টা করেছি , তবে তারা এটি পছন্দ করেনি ...

দাবি অস্বীকার: প্রথম গল্ফ, তাই যা কিছু ভেঙে গেছে / কোনও অনুপস্থিত তথ্য আমাকে জানান! এছাড়াও আমি সমস্ত উদাহরণ হাতে দিয়েছি, সুতরাং এর সমাধান হতে পারে যা কম আন্দোলনে জড়িত!

সম্পাদনা: উত্তরের জন্য সমান সংখ্যক চলন (প্রায় সবগুলি) সহ একাধিক সমাধানের পথ রয়েছে এমন উত্তরের জন্য, পছন্দসই সমাধান নেই।


18
পিপিসিজিতে আপনাকে স্বাগতম; খুব সুন্দর প্রথম চ্যালেঞ্জ!
ডুরকনব

4
এটা আমার কাছে কঠিন লাগছে! পিপিসিজিতে আপনাকে স্বাগতম!
মেগো

1
দুর্দান্ত চ্যালেঞ্জ। আমি কি জিজ্ঞাসা করতে পারি কেসগুলির জন্য আউটপুটটি কী হওয়া উচিত: 7478 এবং 3737?
গোলমাল 2

1
@ noisyass2 ধন্যবাদ; flawr এর উত্তর নিম্নলিখিতটি দেয়: 7478 8588 9698 0708 0808 0908 0008 0009 0000 এবং 3737 2627 1517 0407 0307 0207 0107 0007 0008 0009 0000 কেবল 3737 টির দিকে তাকালে, এই অর্থটি বোঝায়: কেবলমাত্র 3 টি সংখ্যার দিকে তাকানো: আমি যদি সমস্ত স্থানান্তরিত করি তবে প্রথম তিনটি একই সময়ে, এটি 1 এবং 3 সংখ্যার জন্য 3 গতিবিধি গ্রহণ করে এবং তারপরে অঙ্ক 2 এর জন্য আরও 4 টি আন্দোলন লাগে, এইভাবে মোট সাতটি। আমি যদি প্রতিটি পৃথকভাবে স্থানান্তরিত করি তবে প্রতিটি 3 টি পদক্ষেপ গ্রহণ করে, সুতরাং 9 টি চলাচল করে।
লুই

1
আমি ভাবছি "সংমিশ্রণ লক" (বা "বাইক লক") শিরোনামটি আরও দর্শকদের আকর্ষণ করতে পারে।
ডেভিডসি

উত্তর:


10

মতলব, 412 327 বাইট

গল্ফড (গল্ফিংয়ের জন্য @ আন্দ্রেসডিককে ধন্যবাদ s!):

s=dec2bin('iecbmgdoh'.'-97)-48;s=[s;-s];T=1e4;D=Inf(1,T);P=D;I=NaN(T,4);for i=1:T;I(i,:)=sprintf('%04d',i-1)-'0';end;G=input('');D(G+1)=0;for k=0:12;for n=find(D==k);for i=1:18;m=1+mod(I(n,:)+s(i,:),10)*10.^(3:-1:0)';if D(m)==Inf;D(m)=k+1;P(m)=n-1;end;end;end;end;n=0;X='0000';while n-G;n=P(n+1);X=[I(n+1,:)+48;X];end;disp(X)

এই কোডগুলি 0000কেবলমাত্র সম্ভাব্য পদক্ষেপগুলি ব্যবহার করে প্রদত্ত নম্বর থেকে সংক্ষিপ্ততম 'পথ' সন্ধানের জন্য কিছু গতিশীল প্রোগ্রামিং ব্যবহার করে। চ্যালেঞ্জটি মূলত একটি সংক্ষিপ্ত পথের প্রিওবিলিম (বিকল্প হিসাবে আপনি সম্ভবত একটি চলাচলকারী দল হিসাবে পদক্ষেপগুলি বিবেচনা করতে পারেন)) তবে একটি কার্যকর বাস্তবায়ন নিয়ে অসুবিধাটি উপস্থিত হয়েছিল । মূল কাঠামো দুটি 10000-উপাদান অ্যারে হয়, একটি সেই সূচকটিতে পৌঁছানোর ধাপের সংখ্যা সংরক্ষণ করার জন্য, অন্যটি আমাদের গ্রাফের পূর্ববর্তী 'নোডের' পয়েন্টার সঞ্চয় করতে। এটি একই সাথে অন্যান্য সমস্ত সম্ভাব্য সংখ্যায় 'পাথ' গণনা করে।

উদাহরণ:

9871
0981
0091
0001
0000

1210
0100
0000

Examples by @noisyass:

7478
8578
9678
0788
0899
0900
0000

3737
2627
1517
0407
0307
0207
0107
0007
0008
0009
0000

Own Example (longest sequence, shared with 6284)

4826
3826
2826
1826
0826
0926
0026
0015
0004
0003
0002
0001
0000    

সম্পূর্ণ কোড (কিছু মন্তব্য অন্তর্ভুক্ত):

%steps
s=[eye(4);1,1,0,0;0,1,1,0;0,0,1,1;1,1,1,0;0,1,1,1];
s=[s;-s];


D=NaN(1,10000);%D(n+1) = number of steps to get to n
P=NaN(1,10000);%P(n+1) was last one before n

I=NaN(10000,4);%integer representation as array
for i=0:9999; 
    I(i+1,:)=sprintf('%04d',i)-'0';
end

G=9871; % define the current number (for the golfed version replaced with input('');
D(G+1)=0;
B=10.^(3:-1:0); %base for each digit

for k=0:100; %upper bound on number of steps;
    L=find(D==k)-1;
    for n=L; %iterate all new steps
        for i=1:18; %search all new steps
            m=sum(mod(I(n+1,:)+s(i,:),10) .* [1000,100,10,1]);
            if isnan(D(m+1))
                D(m+1) = k+1;
                P(m+1)=n;
            end
        end
    end
end
n=0;%we start here
X=[];
while n~=G
    X=[I(n+1,:)+'0';X];
    n=P(n+1);
end
disp([I(G+1,:)+'0';X,''])

নিস! বেশিরভাগ মতলব ব্যবহারকারী নিজেই আমি ভাবছিলাম যে এটি কতটা ভাল হবে।
লুই

1
ইনপুট জন্য 6444আপনার কোড দেয় 6444 7554 8664 9774 0884 0994 0004 0003 0002 0001 0000, আমি উত্তর পেয়েছি যেখানে 6444 6333 6222 6111 6000 7000 8000 9000 0000. আমার উত্তরটি 8 টি পদক্ষেপ, আপনার 10. আমি দেখতে পাচ্ছি না ইস্যু, এবং এটি উভয় গল্ফযুক্ত এবং ungolfed সংস্করণে উপস্থিত হবে বলে মনে হচ্ছে। এটি আপনার সর্বশেষ সম্পাদনায় স্থির হয়েছে।
লুই

1
আমি সবেমাত্র কোডটিতে একটি ছোট ত্রুটি সংশোধন করেছি। ইন sশেষ সারি হওয়া উচিত [0,1,1,1]। তারপরে আপনি একটি 8 ধাপের সমাধানও পান! অসুবিধার জন্য আমি দুঃখিত =)
flawr

1
@ লুই একটি মতলব / অষ্টাভের চ্যাটরুম রয়েছে, অন্যান্য স্টাফগুলির মধ্যে এটি মাতলাব থেকে প্রাপ্ত গল্ফিং ল্যাঙ্গুঞ্জ এমএটিএল জন্য একরকম বেস Base
flawr

1
4826 এর জন্য, আমি একটি 11 সরানোর সমাধান পেয়েছি: 4826 3716 2606 1506 0406 0306 0206 0106 0007 0008 0009 0000
noisyass2

4

ব্যাচ - 288 বাইট

এমনকি আপনি যদি তারা পরপর (রিং) হতে আছে, আমি যুক্তিবিজ্ঞান (উদাহরণস্বরূপ নিম্নলিখিত) দ্বারা অনুমান যে আমি মধ্যম এক এড়িয়ে যেতে পারেন পক্ষ থেকে আগ্রহ 1234থেকে 0224

সেট / পিক্সেল =
একটি =% x: ~ 0,1% সেট করুন এবং বি =% x সেট করুন: ~ 1,1% এবং সি =% এক্স সেট করুন: ~ 2,1% এবং ডি =% এক্স সেট করুন: ~ 3,1%
: L
@echo% x% এবং যদি% a% == 0 (যদি% d% NEQ 0 সেট / বিজ্ঞাপন = d-1) অন্য সেট / এএ = এ -1
@if% বি% এনইকিউ 0 সেট / আব = বি -1
@if% c% NEQ 0 সেট / এসি = সি -1
@if% x% NEQ 0000 সেট x =% a %% বি %% সি %% ডি% এবং গেট এল

এটি আমার ব্যাচের সমাধান: 236 বাইট।


সম্পাদনা: সংশোধন সমাধান

সেট / পিক্সেল =
একটি =% x: ~ 0,1% সেট করুন এবং বি =% x সেট করুন: ~ 1,1% এবং সি =% এক্স সেট করুন: ~ 2,1% এবং ডি =% এক্স সেট করুন: ~ 3,1%
: L
@echo% x% & কে = 1 সেট করুন এবং%%% == 0 (যদি% d% এনইকিউ 0 সেট / বিজ্ঞাপন = ডি -1 এবং সেট কে = 0) অন্য সেট / এএ = এ -1 এবং সেট কে = 1
@if% বি% এনইকিউ 0 যদি% কে% == 1 সেট / আব = বি -1 এবং কে = 0 সেট করে থাকেন
@if% c% NEQ 0 যদি% কে% == 0 সেট / এসি = সি -1 হয়
@if% x% NEQ 0000 সেট x =% a %% বি %% সি %% ডি% এবং গেট এল

নতুন সমাধান (অন্তর্নিহিত মন্তব্য অনুযায়ী স্থির) 288 বাইট ভারী।


আমি আপনার উত্তরটি গভীর গভীরতার সাথে দেখিনি, তবে আমি প্রথম অনুচ্ছেদে আপনার যুক্তি অনুসরণ করতে সংগ্রাম করছি। আপনি কোন উদাহরণটি বিশেষভাবে উল্লেখ করছেন? আর থেকে যাচ্ছে আপনার উদাহরণ 1234থেকে 0224হয় না এক আন্দোলন। ধারণাটি হ'ল কেবল দুটি আঙ্গুল ব্যবহার করে আমি একক গ্রিপ দিয়ে টানা তিনটি রিং উপলব্ধি করতে পারি।
লুই

আমি বোঝাতে চাইছি, আপনি যদি টানা 3 টি রিং সরিয়ে নিতে পারেন, তবে এটি দ্বিতীয়বার এড়িয়ে আপনি প্রথম এবং তৃতীয়টি স্থানান্তর করতে পারেন তা ভাবা যুক্তিযুক্ত। বা আমার কোড পরিবর্তন করা উচিত?
noize

আপনার অনুমানটি ভুল; আপনার কোড পরিবর্তন করা উচিত উপরের মন্তব্যে বর্ণিত যুক্তিটি কি আপনি দেখতে পাচ্ছেন?
লুই

কোড স্থির। আমি বিভিন্ন ধরণের সংমিশ্রণগুলির সাথে চেক করেছি এবং এটি আমার কাছে দেখে মনে হচ্ছে এটি সর্বদা সংক্ষিপ্ত পথে নেয় takes
noize

এটি কেবল নীচের দিকে গণনা বলে মনে হচ্ছে, তাই এটি উচ্চ সংখ্যার সংমিশ্রণের জন্য প্রয়োজনের তুলনায় বেশি সময় নেয় (উদাহরণস্বরূপ 9999 এর জন্য 18 পদক্ষেপ)
faubi

2

হাস্কেল - 310 বাইট

import Data.Char
import Data.List
r=replicate
h=head
a x=map(:x)[map(`mod`10)$zipWith(+)(h x)((r n 0)++(r(4-j)q)++(r(j-n)0))|j<-[1..3],n<-[0..j],q<-[1,-1]]
x!y=h x==h y
x#[]=(nubBy(!)$x>>=a)#(filter(![(r 4 0)])x)
x#y=unlines.tail.reverse.map(intToDigit<$>)$h y
main=do x<-getLine;putStrLn$[[digitToInt<$>x]]#[]

এটিগুলির মধ্যে একটির সঠিক সংমিশ্রণ না হওয়া পর্যন্ত ইতিমধ্যে পৌঁছে যাওয়া প্রতিটি সংমিশ্রণে প্রতিটি সম্ভাব্য টার্ন প্রয়োগ করে বারবার সংযোজনগুলির একটি নতুন তালিকা তৈরি করে কাজ করে। মেমরির ব্যবহারটি তাত্পর্যপূর্ণভাবে বাড়ানো থেকে বাড়াতে প্রতিটি পুনরাবৃত্তির তালিকা থেকে সদৃশগুলি সরিয়ে ফেলা হয়।

বর্বর শক্তি সমাধান হিসাবে, এটি খুব অদক্ষ এবং এটি চালাতে বেশ কয়েক মিনিট সময় নিতে পারে।

হাস্কেলের সাথে আমার খুব বেশি অভিজ্ঞতা নেই, তাই কিছু কাজ সম্ভবত আরও ভাল করা যেতে পারে।


আপনার পদ্ধতির জন্য দৃ basis় ভিত্তির মতো মনে হচ্ছে। আমি হাস্কেলের সাথে অভিজ্ঞতা তৈরি করি নি, বা এটি সংকলন / চালনার কোনও উপায়ও (যা আমি জানি)। একটি দ্রুত গুগল আমাকে যে কোনও জায়গায় চেষ্টা করে দেখতে দেয় না। আপনি কি এমন লিঙ্ক দিতে পারবেন যা আমাকে এটি চেষ্টা করে? ধন্যবাদ।
লুই

@ লুই এটি গ্লাসগো হাস্কেল কম্পাইলারের সাথে সংকলন করা যেতে পারে , তবে এটি ডাউনলোড এবং এটি চালানোর কোনও উপায় সম্পর্কে আমি জানি না তা ব্যবহার করে।
ফৌবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.