বাউন্স-মডুলো দুটি সংখ্যা


12

মডুলো অপারেশনের গ্রাফ ( ) এর মতো দেখাচ্ছে:y=xmodk

মডিউল ফাংশনের গ্রাফ

এটি একটি খুব দরকারী ফাংশন, কারণ এটি আমাদের "মোড়ানো" আচরণ তৈরি করতে দেয়। যাইহোক, যখন আমি দুটি প্রাচীরের মধ্যে "বাউন্সিং" এর চেহারা তৈরি করতে এটি ব্যবহার করতে চাই তখন এটি খুব জটিল। "বাউন্স" ফাংশনের গ্রাফটি ( ) এর মতো দেখাচ্ছে:y=bounce(x,k)

"বাউন্স-মডুলো" ফাংশনের গ্রাফ

সময়ের এর গ্রাফ হল k । এর গ্রাফ সময়কালের Y = বাউন্স ( এক্স , ) হয় 2 কারণ এটি জন্য ঊর্ধ্বমুখী চলে ইউনিট, এবং তারপর অন্য জন্য নীচের দিকে চলে আসে ইউনিট, যেখানে এটা শুরু ফেরার আগে। উভয় ফাংশনের জন্য, y এর সর্বনিম্ন মান0 হয় এবং সর্বাধিক কে হয় (প্রকৃতপক্ষে, অবিচ্ছেদ্য ইনপুটগুলির সাথে মডুলাস ফাংশনের জন্য এটি কে - 1 )। উপরন্তু, উভয় ফাংশনের জন্য, যেখানে মান = x 0 হয় 0y=xmodkky=bounce(x,k)2kkkyk-1এক্স=0

চ্যালেঞ্জ

একটি পূর্ণসংখ্যার এবং ধনাত্মক পূর্ণসংখ্যার কে দেওয়া হয় , y = বাউন্স ( x , কে ) এর পূর্ণসংখ্যা বা ভাসমান-বিন্দুর অনুমানকে ফেরত দিন ।এক্সY=বড়াই(এক্স,)

এটি , তাই সংক্ষিপ্ততম বৈধ জমা (বাইটে গণনা করা) জয়ী।

পরীক্ষার কেস

  x,  k -> bounce(x, k)
  0, 14 ->            0
  3,  7 ->            3
 14, 14 ->           14
 15, 14 ->           13
-13, 14 ->           13 (12.999997 etc would be an acceptable answer)
-14, 14 ->           14
191,  8 ->            1
192,  8 ->            0

একটি জন্য বোনাস পয়েন্ট ফুরিয়ার মধ্যে পদ্ধতির ভিত্তিক ফুরিয়ার


" উভয় ফাংশনের জন্য, x এর সর্বনিম্ন মান 0 এবং সর্বাধিক কে " কেবল সাধারণ ভুল।
পিটার টেলর

নিবন্ধন করুন মানে রেজাল্ট।
ফলটি এসোলং করছে

1
উফ, এটাই আমি ইতিমধ্যে বলেছি বলে মনে হয়েছিল। এটা এখনও ভুল। k % k = 0
পিটার টেলর

@ পিটারটেলর ওহ, আমি আপনার প্রশ্নটি বুঝতে পেরেছি। আমি মূলত এটি ভাসমান-পয়েন্টটি মনে রেখে ডিজাইন করেছিলাম, তারপরে কেবল ইনটগুলিতে স্যুইচ করেছি। সম্পাদনা করবে।
6:55 এ ফলস এওসোলিং

1
@PeterTaylor আর্গুমেন্ট ভাসে হয়ে থাক, তবে সর্বোচ্চ একটি সংখ্যা ইচ্ছামত পাসে হবে k
07 এ ফলমূল

উত্তর:


7

x86-64 মেশিন কোড, 18 বাইট

97
99
31 D0
29 D0
99
F7 FE
29 D6
A8 01
0F 45 D6
92
C3 

এই কোডটি x86-64 মেশিন ল্যাঙ্গুয়েজে একটি ফাংশন সংজ্ঞায়িত করে bounce(x, k)) Gnu / ইউনিক্স সিস্টেমগুলিতে ব্যবহৃত সিস্টেম ভি AMD64 কলিং কনভেনশন অনুসরণ করার পরে , xপ্যারামিটারটি EDIরেজিস্টারে পাস করা হয় , এবং প্যারামিটারটি রেজিস্টারে kপাস করা হয় ESI। সমস্ত x86 কলিং কনভেনশনগুলির মতো, ফলাফলটি EAXরেজিস্টারে ফিরে আসে ।

সি থেকে এই কল করতে, আপনি নিম্নলিখিত হিসাবে এটি প্রোটোটাইপ হবে:

int Bounce(int x, int k);

এটি অনলাইন চেষ্টা করুন!

অবহেলিত সমাবেশ মেমোনমিক্স:

; Take absolute value of input 'x' (passed in EDI register).
; (Compensates for the fact that IDIV on x86 returns a remainder with the dividend's sign,
; whereas we want 'modulo' behavior---the result should be positive.)
xchg   eax, edi      ; swap EDI and EAX (put 'x' in EAX)
cdq                  ; sign-extend EAX to EDX:EAX, effectively putting sign bit in EDX
xor    eax, edx      ; EAX ^= EDX
sub    eax, edx      ; EAX -= EDX

; Divide EDX:EAX by 'k' (passed in ESI register).
; The quotient will be in EAX, and the remainder will be in EDX.
; (We know that EAX is positive here, so we'd normally just zero EDX before division,
; but XOR is 2 bytes whereas CDQ is 1 byte, so it wins out.)
cdq
idiv   esi

; Pre-emptively subtract the remainder (EDX) from 'k' (ESI),
; leaving result in ESI. We'll either use this below, or ignore it.
sub    esi, edx

; Test the LSB of the quotient to see if it is an even number (i.e., divisible by 2).
; If not (quotient is odd), then we want to use ESI, so put it in EDX.
; Otherwise (quotient is even), leave EDX alone.
test   al, 1
cmovnz edx, esi

; Finally, swap EDX and EAX to get the return value in EAX.
xchg   eax, edx
ret

মনে রাখবেন যে প্রথম বিভাগটি (যা পরম মান গ্রহণ করে) সমানভাবে লেখা যেতে পারে:

; Alternative implementation of absolute value
xchg    eax, edi
neg     eax
cmovl   eax, edi

যা হুবহু একই সংখ্যা বাইট (6)। পারফরম্যান্সটি একই রকম হওয়া উচিত, সম্ভবত কিছুটা দ্রুত ( নির্দিষ্ট কিছু ইন্টেল চিপস বাদে , যেখানে শর্তযুক্ত চলনগুলি ধীর হয় )।

XCHGঅবশ্যই, তুলনামূলকভাবে ধীরে ধীরে এবং MOVকোড গল্ফিং ব্যতীত আর পছন্দ হবে না (অপারেন্ডগুলির মধ্যে একটি যখন সঞ্চালক হয় তখন পূর্ববর্তীটি 1-বাইট হয়, তবে একটি নিবন্ধক-নিবন্ধক MOVসর্বদা 2 বাইট থাকে)।


6

জেলি , 3 বাইট

æ%A

এটি অনলাইন চেষ্টা করুন!

বিল্ট-ইনগুলি ftw w

ব্যাখ্যা

æ%এখানে একটি অন্তর্নির্মিত দরকারী। আমি কীভাবে এটি বর্ণনা করতে জানি না, তাই আমি কেবল কিছু ইনপুটগুলির জন্য আউটপুট সরবরাহ করব:

হিসাবে xথেকে যায় 0অনন্ত, xæ%4যায় 0,1,2,3,4,(-3,-2,-1,0,1,2,3,4,)যেখানে প্রথম বন্ধনী অংশগ্রহণ উভয় উপায় অনন্ত পুনরাবৃত্তি করা হয়।




3

রুবি, 40 বাইট 32 বাইট

b=->(x,k){(x/k+1)%2>0?x%k:k-x%k}

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

হাই, এটি এই সাইটে আমার প্রথম উত্তর! এই কোডটি পর্যবেক্ষণের ভিত্তিতে তৈরি হয়েছে যে বাউন্স ফাংশনটি ঠিক মডুলোর মতো আচরণ করে যখন ( এন -1) কে <= x < মোড 2 = 0, তারপরে এন সমান। যদি এন বিজোড় হয়, তবে বাউন্স ফাংশনটি x মোড কে এর সমান হওয়া উচিত । যদি এন কে এবং এন বিজোড় হয়, এবং এন সমান হলে বিপরীত মডুলো অপারেশনের মতো আচরণ করে । x / k এর(x/k+1) চেয়ে ছোটতম পূর্ণসংখ্যা (যা x / k +1 এর পূর্ণসংখ্যাকে গোল করে)। অতএব, খুঁজে বের করে এন উপরে উল্লেখ করেছে। এন বিজোড় বা এমনকি কিনা তা পরীক্ষা করে দেখুন । যদি এন মোড 2> 0 হয়, তবে n বিজোড়। যদি এন(x/k+1)%2>0 এন সমান হয় তবে বাউন্স ফাংশনটি বি -বিপরীত হওয়া উচিত, কে - এক্স মড কে এর সমান । পুরো অভিব্যক্তি (x/k+1)%2>0?x%k:k-x%kখুঁজে বের করে এন , তারপর executes এক্স গেলিক ভাষার যদি এটা বিজোড় হয়, এবং executes - এক্স গেলিক ভাষার অন্যথায়।

সায়োসের একটি পরামর্শের ভিত্তিতে উত্তরটি উন্নত করা হয়েছিল ।


আপনি এটি একটি ল্যাম্বডায় রূপান্তর করতে পারেন। def b(x,k) ... endব্যবহারের পরিবর্তে->x,k{...}
সাইওস

এবং যেহেতু আপনি পূর্ণসংখ্যার সাথে কাজ করছেন .to_iতাই প্রয়োজনীয় নয়।
সাইয়েস



1

জে, 25 বাইট

ইঙ্গিত:

মই সংখ্যাতে এটি নিয়মিত মডুলো mod উদাহরণস্বরূপ, 5 এর ক্ষেত্রে:0 1 2 3 4 5 4 3 2 1

এখানে জে এর একটি (এখনও ভাল-গল্ফড নয়) সমাধান রয়েছে যা আগামীকালকে উন্নত করার চেষ্টা করবে:

[ ((|~ #) { ]) (i.@>:,}:@i.@-) @ ]

সংকুচিত: [((|~#){])(i.@>:,}:@i.@-)@]

compressed2: [((|~#){])(<:|.|@}.@i:)@]

এটি অনলাইন চেষ্টা করুন!


আমার মনে হচ্ছে i:এখানে ব্যবহার করা যেতে পারে, তবে আমি এখনও কোনও সমাধানের চেষ্টা করিনি
কনার ও'ব্রায়ান

@ কনরও ব্রায়েন আমার সংক্ষিপ্ত 2 সংস্করণটি পরীক্ষা করে দেখুন, এটি ব্যবহার করে কয়েকটি বাইট সংরক্ষণ করে i:। মূলটিকে আপডেট করার এবং ব্যাখ্যা সরবরাহ করার জন্য কেবল সময় নেই। আমি আশা করি কোনও বিশেষজ্ঞ কমপক্ষে আরও 4 বা 5 বাইট
জোনা

((|~#){])]-|@}:@i:18 বাইটের জন্য
মাইল 22

@ মাইলস সুন্দর, টিভিম
জোনা

1

কিউবিআইসি , 25 30 27 বাইট

g=abs(:%:)~a'\`b%2|?b-g\?g

কিছুটা পুনর্গঠন করেছিলেন ...

ব্যাখ্যা

g=abs(   )  let g be the absolute value of 
       %    the (regular) modulo between
      : :   input a read from cmd line, and input b read from cmd line
~a \ b%2    IF the int division of A and B mod 2 (ie parity test) yields ODD
  ' `         (int divisions need to be passed to QBasic as code literals, or ELSE...)
|?b-g       THEN print bouncy mod
\?g         ELSE print regular mod

কিউবিআইসি অন্যান্য বেসিক বাস্তবায়নগুলির চেয়ে এমওডির অপারেশনগুলির জন্য আলাদা কিছু করে? অন্যান্য বুনিয়াদি এমওডিকে ডিভিডেন্ডের সমান চিহ্ন দিয়ে ফেরত দেয়; যখন x-13 হবে এবং k14 বছর হবে তখন এটি ব্যর্থ হবে
কোডি গ্রে

@ কোডি গ্রে ন্যাপ, এটি -13 দিয়েছে। এখনই স্থির।
স্টেইনবার্গ

আপনার কি absদু'বার দরকার নেই ?
নীল

@ নীল আপনার কি এর জন্য একটি টেস্টকেস আছে?
স্টেইনবার্গ

@ নীল এনভিএম, আমি পুরো বিষয়টি পুনর্গঠন করে এটি ঠিক করেছি।
স্টেইনবার্গ

1

C89, 40 বাইট

t;f(x,k){t=abs(x%k);return x/k%2?k-t:t;}

আমার x86 মেশিন কোড উত্তরের এসি পোর্ট , এটি একটি ফাংশন সংজ্ঞায়িত করে f, যা পরামিতিগুলির জন্য বাউন্স-মডুলো গণনা করে xএবংk

এটি সি 89 এর অন্তর্নিহিত-অন্তর্ভুক্ত নিয়ম ব্যবহার করে, যাতে উভয় প্যারামিটার, গ্লোবাল ভেরিয়েবল tএবং ফাংশনের রিটার্ন মানগুলি সমস্ত প্রকারের মতোই প্রকারের হয় int। গ্লোবাল ভেরিয়েবলt কেবলমাত্র একটি অস্থায়ী মান ধরে রাখতে ব্যবহৃত হয়, যা শর্তসাপেক্ষ অপারেটরের উভয় পাশে গণনা পুনরাবৃত্তি করার সাথে তুলনা করে বাইট সংরক্ষণ করে শেষ হয়।

absফাংশন (পূর্ণ মান) সরবরাহ করা হয় <stdlib.h>হেডার, কিন্তু আমরা তা এখানে, আবার অন্তর্ভুক্ত করা C89 এর অন্তর্নিহিত-int- এ নিয়ম (যেখানে ফাংশন পরোক্ষভাবে ঘোষণা এবং বিনিময়ে অধিকৃত হয় ধন্যবাদ না int)।

এটি অনলাইন চেষ্টা করুন!

অবরুদ্ধ সংস্করণ:

#include <stdlib.h>

int Bounce(int x, int k)
{
    int mod = abs(x % k);
    return (x/k % 2) ? k-mod : mod;
}

আমার হ্যান্ড-টিউনযুক্ত মেশিন কোডের আলোকে এটি দেখে , সংকলকরা আসলে এর জন্য বেশ ভাল আউটপুট উত্পন্ন করে । মানে, তাদের উচিত; এটি অপ্টিমাইজ করা একটি খুব সহজ ফাংশন! আমি জিসিসি এর x86-64 'অপটিমাইজার একটি ক্ষুদ্র বাগ আবরণ উন্মোচন , যদিও, যেখানে এটি অদ্ভুতভাবে উত্পাদন করে বৃহত্তর কোড যখন আপনি এটি আকার জন্য অনুকূল এবং বলুন ছোট কোড যখন তোমার জন্য নিখুত তা জানাও গতি


m;f(x,k){m=abs(x%k);x=x/k%2?k-m:m;}সংক্ষিপ্ত
ব্যবহারকারী 41805

ব্যতীত এটি x86 টার্গেটে জিসিসি কোড জেনারেটরের স্ফূণতার কারণে নির্দিষ্ট অসুস্থ-সংজ্ঞায়িত পরিস্থিতি ব্যতীত @ কউগুলি আসলে কোনও মান ফেরত দেয় না। এটি এমন একটি টেম্পলেট যা আমি এখানে লোকেরা ব্যবহার করতে দেখি, তবে এটি আমার পক্ষে কার্যকর হয় না, এলোমেলো আবর্জনা স্ট্যাকের বাইরে ফেলে দেওয়ার চেয়ে বেশি যা সঠিক উত্তর হতে পারে।
কোডি গ্রে

1

হাস্কেল, 37 বাইট

এটি অনলাইন চেষ্টা করুন!

(!)=mod;x#k|odd$x`div`k=k-x!k|1<2=x!k

কীভাবে ব্যবহার করবেন: নন-নেগেটিভ বাম আর্গুমেন্ট এবং নেতিবাচক বাম যুক্তি
হিসাবে কল করুন , কারণ হাস্কেল এমন ব্যাখ্যা করবে যে আপনি যেমন কিছু ব্যবহার করছেন । টিআইও-লিঙ্কটি কেবল দুটি কমান্ড-লাইন আর্গুমেন্ট নেয়।15#14(-13)#14-13#14-(13#14)ghci

ব্যাখ্যা:
প্রথমে বাইনারি ইনফিক্স অপারেটরটিকে !একই হিসাবে পুনরায় সংজ্ঞা দেয় mod। হাস্কেলের modসর্বদা একটি অ-নেতিবাচক মান সঞ্চারিত হয়, সুতরাং আমাদের absঅন্যান্য সমাধানগুলির মতো আমাদের প্রয়োজন নেই। এটি x/k(পূর্ণসংখ্যা বিভাগ) বিজোড় কিনা তা পরীক্ষা করে এবং যদি তা হয় তবে k-x mod kএটি (যেমন ব্যাক-বাউন্স) ফিরে আসে বা অন্যথায় এটি ফিরে আসে x mod k


সম্ভবত এটি কেবল স্বাদের বিষয়, তবে আমি ব্যক্তিগতভাবে সংজ্ঞা দিতে পছন্দ করি না !কারণ এটি কোনও বাইট x#k|odd$x`div`k=k-x`mod`k|1<2=x`mod`k
মার্ক এস

1

পিএইচপি, 40 50 বাইট

জালিয়াতি ডলার অভিশাপ আমদানি ওভারহেড :)

পূর্ণসংখ্যা সংস্করণ:

[,$x,$k]=$argv;$y=abs($x)%$k;echo$x/$k&1?$k-$y:$y;

অথবা

[,$x,$k]=$argv;echo[$y=abs($x)%$k,$k-$y][$x/$k&1];

ফ্লোট সংস্করণ, 56 বাইট:

abs($x)%$kসঙ্গে প্রতিস্থাপন fmod(abs($x),$k)


সম্পাদনা: negativeণাত্মক জন্য স্থির ফলাফল x


4
"জঘন্য ডলার"। হ্যাঁ, অর্থ দুর্গন্ধে ...
স্টেইনবার্গ

2
কীভাবে €argvবা £argv? এগুলি দেখতে দুর্দান্ত লাগবে: এক্স
ইসমাইল মিগুয়েল

1

জাভাস্ক্রিপ্ট (ES6), 36 32 বাইট

k=>f=x=>x<0?f(-x):x>k?k-f(k-x):x

Recursively bounces xবিরুদ্ধে 0এবং k, তাই খুব চ্যালেঞ্জের আত্মা।



0

সি (জিসিসি), 43 53 বাইট

সম্পাদনা: স্থির নেতিবাচক সমস্যা

int f(int x,int y){return x/y%2?abs(y-x%y):abs(x%y);}

অনলাইনে চেষ্টা করে দেখুন!


2
এটি (-13, 14) (-13 এর পরিবর্তে 13) এর ভুল উত্তর সরবরাহ করে। মডুলাস এবং বাকী ক্রিয়াকলাপগুলি নেতিবাচক সংখ্যায় আলাদা আচরণ করে।
CAD97

0

আর, 28 বাইট

pryr::f(abs((x-k)%%(2*k)-k))

যা ফাংশন মূল্যায়ন:

function (k, x) 
abs((x - k)%%(2 * k) - k)

যা বেশিরভাগ সমাধান ব্যবহার করার পদ্ধতি হিসাবে উপস্থিত হয়। এটি করার আগে আমি তাদের দিকে তাকাতে পারিনি।

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