1000003 से विभाज्य? आसान, बस अंतिम अंक को 300001 से गुणा करें और जोड़ें!


16

Pसे अधिक प्राइम को देखते हुए 10, आपके प्रोग्राम या फंक्शन को अपनी विभाज्यता के नियम का पता लगाना चाहिए x, जिसे पूर्णतम मान के साथ पूर्णांक के रूप में परिभाषित किया गया है, जो कि प्राइम के अंतिम अंक से गुणा करने पर और मूल के बाकी हिस्सों में जोड़े जाने पर कई मूल प्राइम का उत्पादन करता है। प्रधान।

उदाहरण

एक इनपुट को देखते हुए 31, अंतिम अंक है 1और शेष संख्या है 3। इस प्रकार आपके कार्यक्रम को xपूर्ण निरपेक्ष मान के साथ पूर्णांक खोजना होगा जो कि 1*x + 3एक से अधिक है 31। इस मामले में, x=-3काम करता है, इसलिए कार्यक्रम या फ़ंक्शन वापस आ जाएगा -3

एक इनपुट को देखते हुए 1000003, अंतिम अंक है 3और शेष संख्या है 100000। इस प्रकार आपका प्रोग्राम मिल जाएगा x=300001क्योंकि 3*300001+100000 = 1000003जो एक से अधिक है 1000003

गणितीय पृष्ठभूमि

मूल्य का xउपयोग विभाजनकारी परीक्षण के रूप में किया जा सकता है। यदि कोई संख्या Nविभाज्य है P, तो बाकी xअंकों के अंतिम अंक को जोड़कर, यदि पहले से विभाज्य है , तो केवल और केवल एक के कई गुणन होंगे ।NNPNP

के लिए P=11, हम प्राप्त करते हैं x=-1, जो के लिए प्रसिद्ध विभाजन नियम के बराबर है 11: एक संख्या 11उसके अंकों के वैकल्पिक अंतर से विभाज्य है 11

नियम

  • आउटपुट किसी भी रूप में हो सकता है जो आउटपुट के संकेत और मूल्य दोनों को स्पष्ट रूप से एन्कोड करता है।
  • इनपुट प्राइम 10 से 2 ^ 30 के बीच होगा।
  • अगर इनपुट प्राइम नहीं है या रेंज में नहीं है तो आपको संभालने की जरूरत नहीं है।
  • अगर दोनों तुम संभाल की जरूरत नहीं है xऔर -xवैध आउटपुट (ऐसा नहीं होना चाहिए) कर रहे हैं।
  • जानवर बल की अनुमति है, लेकिन अधिक रचनात्मक समाधान की सराहना की जाती है।
  • यह , इसलिए प्रत्येक भाषा में सबसे कम कोड जीतता है! गोल्फिंग भाषाओं में उत्तरों को दूसरी भाषाओं में पोस्ट करने से हतोत्साहित न करें।

परीक्षण के मामलों

Input   Output
11  -1
13  4
17  -5
19  2
23  7
29  3
31  -3
37  -11
41  -4
43  13
47  -14
53  16
59  6
61  -6
67  -20
71  -7
73  22
79  8
83  25
89  9
97  -29
101 -10
103 31
107 -32
109 11
113 34
127 -38
131 -13
1000003 300001
2000003 600001
2999999 300000
9999991 -999999

3
एक उपयोगी सरलीकरण: हम सबसे छोटे xमूल्य की तलाश कर रहे हैं जहां 10*x-1इनपुट द्वारा विभाज्य हो।
xnor

क्या कोई संकेत दे सकता है कि क्यों (3 / (n % 5 * 2 - 5) * n + 1) / 10और (n % 5 * 2 - 5^2) * n / 10 + 1इस तरह से कुछ के लिए एक न्यूनतम निरपेक्ष मूल्य खोजने में सक्षम हैं? मेरा पहला अंतर्ज्ञान यूक्लिड के एल्गोरिथ्म के साथ गणना की गई सबसे बड़ी सामान्य विभाजक का उपयोग करते हुए कम से कम सामान्य एकाधिक की गणना करना होगा।
डेविड फ़ॉर्स्टर

1
@DavidFoerster एक संख्या को देखते हुए, आप अंतिम अंक को हटा सकते हैं, इसे एक संख्या से गुणा कर सकते हैं, इसे xजोड़ सकते हैं और फिर भी एक संख्या को विभाज्य प्राप्त कर सकते हैं n। यदि हम तब नई संख्या को 10 से गुणा करते हैं और मूल संख्या को घटाते हैं तो यह अभी भी विभाज्य रहता है n। xnor की टिप्पणी तब कुछ बीजगणित से आती है। अगला चरण सूत्र को पुनर्व्यवस्थित करना है ताकि यह x = के xसंदर्भ में दे । हम चाहते हैं कि छोटी से छोटी पूर्ण इसलिए हम चाहते हैं सबसे छोटी पूर्ण है, और इस के जिस भी एक होना चाहिए , , या (पर निर्भर करता है की पिछले अंक) सटीक विभाजन बनाता है। n(k*n+1)/10xk-3-113n
नील

जवाबों:


14

जावास्क्रिप्ट (ईएस 6), 32 25 23 बाइट्स

f=
n=>(3/(n%5*2-5)*n+1)/10
<input type=number min=1 oninput=o.textContent=this.value%5*(this.value%2)?f(this.value):``><pre id=o>

3/(n%5*2-5)9/n(mod -10)अगर मुझे संतुलित मोड्यूलो डिवीजन तक पहुंच प्राप्त हो तो लिखा जाएगा । संपादित करें: @EgorSkriptunoff के लिए धन्यवाद 2 बाइट्स सहेजे गए


3
आप की जगह 2 बाइट्स बचा सकता है n=>((n%10*2%14-3)*n+1)/10के साथn=>(3/(n%5*2-5)*n+1)/10
Egor Skriptunoff


@KevinCruijssen शायद जावा 8 के लिए भी एक निकट-मिस पॉलीग्लॉट ... ओह रुको, मुझे आपका जवाब अब देखना है!
नील

@ नील तुम सही हो। मैं आमतौर पर जावा उत्तर पोस्ट करता हूं, इसलिए जब मैंने आपका उत्तर देखा तो मैं पहले से ही xnor के एक पोर्ट पर काम कर रहा था । एक उबाऊ बंदरगाह आपको श्रेय देने के रूप में इसे पोस्ट किया।
केविन क्रूज़सेन

8

पायथन 2 , 27 बाइट्स

lambda n:(n%5*2-5^2)*n/10+1

इसे ऑनलाइन आज़माएं!

ऑपरेशन बाएं से दाएं किए जाते हैं (((n%5)*2)-5)^2:।

मैंने अपने अंकगणितीय ब्रूट फ़ॉरेसर का उपयोग करने के लिए अभिव्यक्ति को खोजने के n%5*2-5^2लिए {1:-1,3:3,2:-3,4:1}[k], रेंज में एक अवशेष मॉड 5 के नकारात्मक व्युत्क्रम को लिया [-2..2]


क्या यह अंकगणित ब्रूट फोरसर सार्वजनिक रूप से कहीं उपलब्ध है?
लिन

क्या यह एकमात्र अभिव्यक्ति है जो इसे मिला या यह केवल दी गई लंबाई के पहले एक को प्रिंट करता है? (के रूप 3/(n%5*2-5)में एक ही लंबाई है (n%5*2-5^2)।)
नील

@ लीन नं, मैं समय रहते साफ कर सकता हूं और पोस्ट कर सकता हूं।
xnor

1
@ नील यह केवल समकक्ष और पाया n%5*2-6^3। मैं केवल लंबाई के बिना परेंस के बिना अभिव्यक्ति को देखता था, जबकि 3/(n%5*2-5)दो वर्णों से अधिक लंबा है, लेकिन पूर्वता के कारण बाहरी परेंस पर बचाता है। इस लंबाई के खोज भावों में कुछ समय लगना चाहिए। यह उपयोग-मामला केवल उन अभिव्यक्तियों को खोजने के लिए एक विकल्प सुझाता है जो किसी दिए गए संदर्भ में उनके सबसे बाहरी ऑपरेशन के माध्यम से उच्च पर्याप्त पूर्वता वाले होने का उपयोग कर सकते हैं।
xnor

6

जेली ,10 8 बाइट्स

,N⁵æiAÞḢ

इसे ऑनलाइन आज़माएं!

स्पष्टीकरण

,N       Get [Input, -Input].
⁵æi      Modular inverse of 10 mod each of [Input, -Input].
AÞ       Sort by absolute value.
Ḣ        First.

+1 मैंने कभी भी जेली को रजिस्टर के साथ प्रस्तुत नहीं किया है जो वास्तव में बाइट्स बचाता है
श्री एक्सकोडर

@ Mr.Xcoder यह था क्योंकि मैं इसे अच्छी तरह से गोल्फ नहीं था।
jimmy23013


5

पायथन 2 , 69 54 53 बाइट्स

संपादित करें: -15 बाइट्स @ Mr.Xcoder का धन्यवाद

संपादित करें: पुनरावृत्ति का उपयोग करके -1 बाइट

f=lambda a,x=-1:(a%10*x+a/10)%a and f(a,-x-(x>0))or x

इसे ऑनलाइन आज़माएं!


54 बाइट्स । मैं यह नहीं देखता कि आपके पास वे चर क्यों हैं जब आप केवल एक बार उनका उपयोग करते हैं
श्री एक्सकोडर

हां, जब मैंने इसे लिखा था, तो थोड़ा जल्दी में था
Halvard Wil


5

जाप , 16 9 बाइट्स

@Xnor द्वारा अवलोकन के लिए बहुत अधिक बाइट्स सहेजे गए तरीके

_*AÉ vU}c

इसे ऑनलाइन टेस्ट करें! बड़े इनपुट पर कुछ सेकंड लग सकते हैं।

व्याख्या

_  *AÉ  vU}c    Implicit: U = input integer
Z{Z*A-1 vU}c    Ungolfed
Z{        }c    Loop through each integer Z in [0, -1, 1, -2, ...] and yield the first where
  Z*A             Z times 10
     -1           minus 1
        vU        is divisible by the input.
                Implicit: output result of last expression

2

जावा 8, 23 21 बाइट्स

n->3/(n%5*2-5)*++n/10

का बंदरगाह @Neil के JavaScrip (ES6) का उत्तर है , लेकिनपूर्णांक के निहित फर्श के कारण @Nevay के लिए-2 बाइट्स धन्यवाद।

इसे यहाँ आज़माएँ।


1
21 बाइट्स:n->3/(n%5*2-5)*++n/10
नेवे

1
@Nevay यहां तक कि जब मैं शीर्ष जवाब के एक बंदरगाह बनाने के लिए, आप अभी भी गोल्फ के लिए है मुझे .. xD (पढ़ें: धन्यवाद और अच्छा काम)
केविन Cruijssen



1

पायथन 2 , 44 43 बाइट्स

(पार किया 44 अभी भी 44 है।) एक बाइट को बचाने के लिए Fireflame241 के लिए धन्यवाद!

P=input();i=P/3
while i*10%P-1:i-=1
print i

इसे ऑनलाइन आज़माएं!

के बीच एक संख्या होती है 0और P-1जिसका उलटा होता है 10। लेकिन अगर वह व्युत्क्रम uइससे अधिक होता है P/2, तो (u-P)एक व्युत्क्रम भी होता है, और इसकी तुलना में एक छोटा निरपेक्ष मान होता है u। तो यह पता चला है कि हम वास्तव में और के xबीच अद्वितीय संख्या की तलाश कर रहे हैं-P/2P/2 जिसका उलटा है 10

उपरोक्त कोड ठीक वैसा ही होता है, जो (मंजिल) पर शुरू होता है P/2, और एक उलटा होने तक नीचे की ओर बढ़ता है। ऐसा तब तक होना चाहिए -P/2जब तक कि इससे अधिक संख्या Pकिसी अभाज्य संख्या से अधिक हो 10। अधिक सटीक रूप से, यह समाप्त हो जाएगा अगर और केवल अगर Pcoprime है 10

संपादित करें: यह वास्तव में पता चला है कि xहोने के लिए बीच की गारंटी है -P/3और P/3, इसलिए पर वर्तमान संस्करण शुरू होता है P/3वहाँ से नीचे और कदम। इसके स्पष्टीकरण के लिए बेहतर बाउंड लेबल वाला अनुभाग देखें ।

गणितीय व्याख्या

यह तुरंत मेरे लिए स्पष्ट नहीं था कि विभाजन परीक्षण क्यों काम किया। यहाँ एक स्पष्टीकरण है, अगर कोई और सोच रहा था।

आज्ञा Pदेना एक प्रधानमंत्री, से अधिक है 10, जिसका अंतिम अंक है b। इस प्रकार

P = 10a + b

कहाँ a > 0, और 0 <= b < 10। वास्तव में bहै या तो 1, 3, 7, या 9, क्योंकि तुलना में एक प्रमुख अधिक से अधिक10 इन अंक में से एक में होगा अंत।

अब मान लीजिए bx + a = 0 (mod P)। फिर

a = -bx (mod P)

10a + b = 10(-bx) + b (mod P)

0 = 10(-bx) + b (mod P)

0 = b(1 - 10x) (mod P)

चूंकि Pप्रधान है, पूर्णांक mod Pएक अभिन्न डोमेन हैं । तो या तोb = 0 (mod P) , या 1 - 10x = 0 (mod P)

हम जानते हैं 0 <= b < 10 < P, इसलिए यदि b = 0 (mod P)उसके बाद b = 0। लेकिन हम कहा bहै, या तो 1, 3, 7, या 9, तो यह असंभव है। इसलिए 1 - 10x = 0 (mod P), ऐसा है 10x = 1 (mod P)। दूसरे शब्दों xमें 10, modulo का विलोम हैP

अब मान लीजिए Nकि एक अप्रतिष्ठित पूर्णांक है जिसका अंतिम अंक है d, इसलिए N = 10c + d. हमारे पास समकक्ष कथनों की एक श्रृंखला है:

10c + d = 0 (mod P)

<==> 10xc + dx = 0 (mod P)

<==> c + dx = 0 (mod P)

QED।

उपयोगिता?

मैं यह भी सोच रहा था कि क्या विभाज्यता परीक्षण (दिए गए N = 10c + d, Nद्वारा प्रतिस्थापित dx + c) वास्तव में व्यवहार में उत्पादक होगा। या कम से कम, क्या यह मज़बूती Nसे N(पूर्ण मूल्य में) से छोटी संख्या से प्रतिस्थापित करता है ?

मान लीजिए N = 10c + d, जहां c >= 0और 0 <= d < 10। इसलिए 10c = N - d <= N। त्रिभुज असमानता द्वारा,

|c + dx| <= |c| + |dx| = c + d|x| <= N/10 + d|x|

< N/10 + 10|x| <= N/10 + 10P/2 = N/10 + 5P

इस प्रकार अगर 5P <= 9N/10है, तो |c + dx| < N

विशेष रूप से, यदि N >= 6P, तब |c + dx| < N। इस प्रकार, यह देखते हुए Pहम गणना के द्वारा शुरू 2P, 3P, ..., 6P, के साथ साथ x। तब दिया N, हमने बार-बार विभाज्यता परीक्षण चलाने जब तक हम एक संख्या से कम तक पहुँचने या के बराबर 6Pहै, और जाँच परिणाम संख्या के किसी भी है कि क्या 0, P, 2P, ..., 6P

(बेशक, जब भी हम किसी ऋणात्मक संख्या तक पहुँचते हैं, तो हम इसे इसके पूर्ण मूल्य से बदल देते हैं, जो तब से ठीक है, जब तक qकि Pकेवल और केवल यदि यह विभाज्य है(-q) है है।)

बेहतर बाउंड्री

मैंने देखा कि |x|/Pकभी भी पास नहीं लगता था 1/2। वास्तव में ऐसा लग रहा था कि यह हमेशा से कम था 1/3... या करीबी परीक्षा में, यह हमेशा 1/10या तो बहुत करीब था या 3/10। अब तक की सबसे बड़ी लग रही थी 4/13(जो तब होती है P=13और जब होती हैx=4 )। ऐसा क्यों होगा?

आज्ञा uदेना एक पूर्णांक और मान लें कि 10u = kP + 1कुछ पूर्णांक के लिए k, तो uउलटा 10, modulo है P। तब हम यह भी जानते हैं कि kयह अपेक्षाकृत प्रमुख है 10, क्योंकि k(-P)यह 1मोडुलो के बराबर है10

अब, हम जानते हैं कि 10modulo के व्युत्क्रम Pसभी के गुणकों से भिन्न होते हैं P, इसलिए हम पूर्णांक ले सकते हैं uऔर या तो Pइच्छा के गुणकों को जोड़ या घटा सकते हैं, और परिणाम हमेशा अभी भी 10modulo का विलोम होगा P। हम घटाना करने के लिए चुन मान लीजिए Pसे u: हम मिल

10(u - P) = 10u - 10P = kP + 1 - 10P

10(u - P) = (k - 10)P + 1

दूसरे शब्दों में, घटाना (क्रमशः, बढ़ाना) uद्वारा Pघटती (बढ़ती) kसे मेल खाती है 10। हम जोड़ना चाहते हैं / को निकाल दिया गुणकों Pसे uजब तक बाएं ओर निरपेक्ष मूल्य में कम से कम है; लेकिन बाएं ओर बिल्कुल कम से कम है जब दाएँ हाथ की ओर कम से कम है, और इसलिए हम जोड़ना चाहते हैं / घटाना 10सेk जब तक दाएँ हाथ की ओर निरपेक्ष मूल्य में कम से कम है।

लेकिन हम जानते हैं कि यह होगा जब kके बीच है -5और 5है, और इसलिए (के बाद से kअपेक्षाकृत करने के लिए प्रधानमंत्री है 10) इस साधन kहै या तो -3, -1, 1, या 3। (यह ओपी के तहत @ नील की टिप्पणी की सामग्री है। धन्यवाद, नील! )

इस प्रकार जब |u|कम से कम है (यानी, u=x), हम होगा x/P = u/P = k/10 + 1/(10P), जहां kया तो -3, -1, 1, या 3। इसलिए |x|/P <= 3/10 + 1/(10P)। तुल्य, |x| <= (3P + 1)/10

इसके अलावा, यह असमानता सख्त है P=11, क्योंकि P=11हमारे पास x=-1और है k=-1। सबसे छोटा Pजिसके लिए समानता है, वह P=13(जहां x=4और k=3) है।

इसलिए जो सबसे बड़ा है वह |x|/Pहै 3/10 + 1/(10*13), क्योंकि P=13पहला प्रधान है जिसके लिए हमारे पास है k=3, और उनमें से जो सबसे छोटा है k=3, वह 1/(10P)शब्द सबसे Pछोटा है (यानी, सबसे छोटा P=13)। इसलिए, सभी के लिए P, हमारे पास भी है |x|/P <= 3/10 + 1/130 = 4/13 < 1/3। यह बताता है कि क्यों उपरोक्त कोड में हम शुरू करने के i = P/3बजाय आरंभ कर सकते हैं P/2

इसके अलावा, उपरोक्त उपयोगिता अनुभाग में सीमाओं को अब बेहतर बनाया जा सकता है।

लेम्मा : N = 10c + dजहां c > 0और 0 <= d <= 9। तब c + d|x| < N/10 + 9(3P + 1)/10। (सख्त असमानता पर ध्यान दें।)

लेम्मा का प्रमाण: मामलों द्वारा। केस I: d = 0तो N = 10c। तब c + d|x| = c = N/10 < N/10 + 9(3P + 1)/10

केस II 0 < d <= 9:। फिर 10c = N - d < N, तो c < N/10। इसलिए c + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10। QED।

इस प्रकार, यदि N > 3P(और N = 10c + dपहले की तरह), तो

3P + 1 <= N

9(3P + 1)/10 <= 9N/10

N/10 + 9(3P + 1)/10 <= N

c + d|x| < N/10 + 9(3P + 1)/10 <= N

तो, अगर N > 3Pतब c + d|x| < N

इसलिए, हम केवल खोजने के लिए P, 2Pऔर 3Pसाथ-साथ x। यह देखते हुए N > 0, जबकि N > 3P, हम बदलने के Nद्वारा |c + dx|, जो कम हो जाती है N। अंततः हम प्राप्त करेंगे N <= 3P; उस बिंदु पर हम बंद करो और जाँच करें कि क्या Nसंख्या के किसी भी के बराबर है 0, P, 2P, या 3P

हम 3Pसामान्य से बेहतर नहीं कर सकते । उदाहरण के लिए मान लीजिए P = 13और N = 39ऐसा है x = 4। फिर जगह Nसे dx + c = 9(4) + 3पत्ते Nअपरिवर्तित।


बहुत अच्छी व्याख्या! -1कोष्ठक के बाहर ले जाकर आप एक बाइट को बचा सकते हैं : 43 बाइट्स
फायरफ्लेम 241

@ fireflame241 बहुत बहुत धन्यवाद! मैं यह दावा कर सकता था कि मैंने इसे 44 पर छोड़ दिया, ताकि मैं इसे पार कर सकूं (हालांकि यह झूठ होगा)।
मैथमैडैन

1

व्हॉट्सएप , 92 बाइट्स

ध्यान दें कि इस भाषा के सिंटैक्स में केवल व्हाट्सएप होता है , इसलिए प्रत्येक व्हाट्सएप चरित्र को यहां S, T, या L (क्रमशः स्पेस, टैब और लाइनफीड के अनुरूप) के साथ उपसर्ग किया गया है। इन्हें कार्यक्षमता खोए बिना हटाया जा सकता है, लेकिन इसे सही ढंग से प्रदर्शित करने के लिए इन्हें यहां शामिल किया गया है।

S S S L
T   L
T   T   S S S L
T   T   T   S L
S S S S T   T   L
T   S S L
S L
T   S S S T S T L
T   S T T   S L
S T S S S S S S T   S T L
T   S S T   T   S T S S S S T   L
T   S S S S S S T   S T S L
T   S T S T L
S T L
L
L
.

इसे ऑनलाइन आज़माएं!




0

एक्सेल, 27 बाइट्स

=0.3/(MOD(A1,5)*2-5)*A1+0.1

के रूप में सेल में प्रवेश किया जा सकता है

=.3/(MOD(A1,5)*2-5)*A1+.1

25 बाइट्स के लिए, लेकिन एक्सेल ऑटो-अपडेट।


वास्तव में मुझे लगता है कि आपको उन बाइट्स की संख्या का दावा करने की अनुमति है जो आपको दर्ज करने की आवश्यकता है (लेकिन मैं मेटा की जांच करने के लिए बहुत आलसी हूं)।
नील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.