เงินปันผลหนึ่งศูนย์


28

คำอธิบายการท้าทาย

สำหรับทุกจำนวนเต็มบวกnมีอยู่เป็นจำนวนมากที่มีรูปแบบของ111...10...000ที่หารด้วยnเช่นตัวเลขทศนิยมที่เริ่มต้นด้วยทั้งหมด1's และสิ้นสุดที่มีทั้งหมด0ของ นี่เป็นเรื่องง่ายมากที่จะพิสูจน์: ถ้าเราใช้n+1จำนวนตัวเลขที่แตกต่างกันในรูปของ111...111(ทั้งหมด1) จากนั้นอย่างน้อยสองคนจะให้ส่วนที่เหลือเหมือนกันหลังจากการหารด้วยn(ตามหลักการของนกพิราบ) ความแตกต่างของตัวเลขสองตัวนี้จะหารด้วยnและจะมีรูปแบบที่ต้องการ www.games501.com ฟรีเป้าหมายของคุณคือการเขียนโปรแกรมที่พบหมายเลขนี้

คำอธิบายอินพุต

จำนวนเต็มบวก

คำอธิบายผลลัพธ์

ตัวเลขpในรูปแบบของ111...10...000เช่นนั้นp ≡ 0 (mod n)เช่นว่าหากคุณพบมากกว่าหนึ่ง - แสดงใด ๆ ของพวกเขา (ไม่จำเป็นต้องเล็กที่สุด)

หมายเหตุ

โปรแกรมของคุณจะต้องให้คำตอบในเวลาที่เหมาะสม ซึ่งหมายความว่าไม่อนุญาตให้ใช้กำลังเดรัจฉาน:

p = 0
while (p != 11..10.00 and p % n != 0)
    p++

ไม่เป็นอย่างนี้:

do
    p = random_int()
while (p != 11..10.00 and p % n != 0)

11..10..00อนุญาตให้ใช้การวนซ้ำในรูปแบบของ

โปรแกรมของคุณไม่จำเป็นต้องจัดการกับอินพุตขนาดใหญ่โดยพลการ - ขอบเขตบนคือสิ่งที่ขอบเขตบนของภาษาของคุณคือ

ตัวอย่างผลลัพธ์

2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110

เรามีขอบเขตบนที่สมเหตุสมผลกับเอาท์พุทที่เป็นไปได้หรือไม่? (บางสิ่งบางอย่างที่น้อยกว่า 2.4 พันล้าน (ประมาณมูลค่าสูงสุดของจำนวนเต็มที่ลงนาม) น่าจะดีเพราะอาจจำเป็นต้องใช้อาร์เรย์หรือรายการสำหรับการใช้งานบางอย่าง)
Tamoghna Chowdhury

@ MartinBüttnerผมคิดว่าการส่งออกเป็นครั้งแรกที่น่าพอใจควรจะเพียงพอ ( จำกัด ระยะเวลาที่เหมาะสม)
Tamoghna Chowdhury

0 ไม่จำเป็นต้องใช้ในกรณีทดสอบ 49
CalculatorFeline

@CatsAreFluffy ฉันคิดว่าตัวเลขทั้งหมดต้องมีอย่างน้อย1และอย่างน้อยหนึ่งอย่าง0อื่น0เป็นวิธีการแก้ปัญหาสำหรับการป้อนข้อมูลใด ๆ (จะเป็นการดีที่จะชี้แจงเรื่องนี้)
Martin Ender

เพียงต้องการหนึ่ง1ควรทำงาน
CalculatorFeline

คำตอบ:


22

Mathematica, 29 ไบต์

⌊10^(9EulerPhi@#)/9⌋10^#&

รหัสโดยมาร์ตินBüttner

กับการป้อนข้อมูลnนี้ outputs จำนวนที่มี9*ϕ(n)คนตามด้วยnเลขศูนย์ที่ϕเป็นtotient ฟังก์ชันออยเลอร์ ด้วยฟังก์ชั่นphiนี้สามารถแสดงใน Python เป็น

lambda n:'1'*9*phi(n)+'0'*n

มันพอเพียงที่จะใช้แฟคทอเรียลn!แทนϕ(n)แต่การพิมพ์ที่หลายคนไม่มีเวลาทำงานที่สมเหตุสมผล

การอ้างสิทธิ์: 9*ϕ(n)คนตามด้วยเลขศูนย์มีหลายnn

พิสูจน์:อันดับแรกให้พิสูจน์เรื่องนี้สำหรับกรณีที่nไม่ได้เป็นหลายของ2, หรือ3 5เราจะแสดงหมายเลขของประกอบด้วยϕ(n)เป็นจำนวนเท่าของ `n

จำนวนที่ทำจากคนเท่าเทียมกันk (10^k-1)/9เนื่องจากnไม่ได้เป็นหลาย3นี้มีหลายnตราบเท่าที่10^k-1เป็นปัจจัยของหรือถ้าเท่ากันn 10^k = 1 (mod n)โปรดทราบว่าสูตรนี้จะทำให้เห็นได้ชัดว่าถ้างานสำหรับจำนวนของคนที่แล้วเพื่อไม่หลายkk

ดังนั้นเรากำลังมองหาkที่จะเป็นหลายของการสั่งซื้อของkในกลุ่มคูณโมดูโล n โดยทฤษฎีบทของลากรองจ์คำสั่งใด ๆ นั้นเป็นตัวหารขนาดของกลุ่ม เนื่องจากองค์ประกอบของกลุ่มที่มีจำนวนจาก1การnที่มีความสำคัญที่จะnขนาดของมันคือtotient ϕ(n)ฟังก์ชันออยเลอร์ ดังนั้นเราได้แสดงให้เห็น10^ϕ(n) = 1 (mod n)แล้วดังนั้นจำนวนที่ทำจากจำนวนนั้นจึงเป็นจำนวนϕ(n)เท่าของ `n

ตอนนี้ขอจัดการกับปัจจัยที่อาจเกิดขึ้นจากใน3 nเรารู้ว่า10^ϕ(n)-1มีหลายnอย่าง แต่(10^ϕ(n)-1)/9อาจไม่ใช่ แต่(10^(9*ϕ(n))-1)/9เป็นผลคูณของ9เพราะมันประกอบไปด้วย9*ϕ(n)ดังนั้นผลรวมของตัวเลขจึงคูณ9ด้วย และเราสังเกตว่าการคูณเลขชี้กำลังkด้วยค่าคงที่จะรักษาความหารได้

ทีนี้ถ้าnมีปัจจัยของ2และ5เราต้องเพิ่มเลขศูนย์เพื่อสิ้นสุดผลลัพธ์ มันเกินกว่าพอเพียงที่จะใช้nศูนย์ (อันที่จริงแล้วlog_2(n)จะเป็น) ดังนั้นถ้าการป้อนข้อมูลของเราnจะถูกแบ่งออกเป็นn = 2^a * 5^b * mก็พอเพียงที่จะมี9*ϕ(m)คนที่จะเป็นหลายnคูณด้วยจะเป็นหลาย10^n2^a * 5^bและเนื่องจากnมีหลายmก็พอเพียงที่จะใช้9*ϕ(n)คน ดังนั้นจึงเป็นไปได้ที่จะมี9*ϕ(n)คนตามด้วยnศูนย์


12
เพียงเพื่อให้แน่ใจว่าไม่มีใครคิดว่าสิ่งนี้ถูกโพสต์โดยไม่ได้รับอนุญาตจากฉัน: xnor มาพร้อมกับวิธีการและการพิสูจน์ด้วยตัวเองทั้งหมดและฉันเพิ่งให้เขาใช้งาน Mathematica เพราะมันมีEulerPhiฟังก์ชั่นในตัว ไม่มีอะไรที่เหลือเชื่อสำหรับการนำไปปฏิบัติจริงดังนั้นฉันจึงพิจารณางานของเขาอย่างเต็มที่
Martin Ender

9

Python 2, 44 ไบต์

f=lambda n,j=1:j/9*j*(j/9*j%n<1)or f(n,j*10)

เมื่อ jใดที่มีพลังงานเท่ากับ 10 เช่น 1,000 การแบ่งพื้นj/9ให้จำนวนที่ทำจาก 1 เช่น 111 ดังนั้นj/9*jจะให้ 1 ตามด้วยจำนวนเท่ากับ 0 เช่น 111000

ฟังก์ชั่นทดสอบตัวเลขซ้ำ ๆ ของแบบฟอร์มนี้พยายามใช้พลังที่สูงกว่าและสูงกว่า 10 จนกว่าเราจะพบหมายเลขที่เป็นจำนวนที่ต้องการ


1
โอ้จุดดีเราแค่ต้องตรวจสอบ 1 ^ n0 ^ n ...
Martin Ender

@ MartinBüttnerหากทำได้ง่ายกว่านี้ก็เพียงพอแล้วที่จะกำหนดจำนวน 0 ให้เป็นค่าอินพุต ไม่รู้ว่ามันนับว่ามีประสิทธิภาพในการพิมพ์เลขศูนย์นั้นหรือไม่
xnor

ทำไมการตรวจสอบ 1 ^ n0 ^ n จึงทำงาน
ลินน์

5
@Lynn การเพิ่มจำนวนศูนย์ไม่สามารถทำร้ายได้และมีจำนวนที่เป็นไปได้จำนวนมากอย่างไม่สิ้นสุดจำนวนหนึ่งจะมีทั้งจำนวนพอใช้
xnor

5

Pyth, 11 ไบต์

.W%HQsjZ`TT

ชุดทดสอบ

โดยพื้นฐานแล้วมันจะใส่ 1 ไว้ข้างหน้าและ 0 ย้อนกลับไปเรื่อย ๆ จนกว่าตัวเลขจะหารด้วยอินพุท

คำอธิบาย:

.W%HQsjZ`TT
                Implicit: Q = eval(input()), T = 10
.W              while loop:
  %HQ           while the current value mod Q is not zero
      jZ`T      Join the string "10" with the current value as the separator.
     s          Convert that to an integer.
          T     Starting value 10.


3

CJam, 28 25 19 ไบต์

บันทึก 6 ไบต์ด้วยการสังเกตของ xnor ที่เราต้องดูตัวเลขของแบบฟอร์ม 1n0nที่เราจะต้องมองไปที่ตัวเลขของแบบฟอร์ม

ri:X,:)Asfe*{iX%!}=

ทดสอบที่นี่

คำอธิบาย

ri:X    e# Read input, convert to integer, store in X.
,:)     e# Get range [1 ... X].
As      e# Push "10". 
fe*     e# For each N in the range, repeat the characters in "10" that many times,
        e# so we get ["10" "1100" "111000" ...].
{iX%!}= e# Select the first element from the list which is divided by X.

2

Mathematica, 140 55 ไบต์

NestWhile["1"<>#<>"0"&,"1",FromDigits@#~Mod~x>0&/.x->#]

ไบต์จำนวนมากถูกลบออกเนื่องจากเคล็ดลับ 1 ^ n0 ^ n ของ xnor

ค่าน้อยที่สุด140 156 ไบต์ นี่เป็นวิธีแก้ปัญหาที่เล็กที่สุด

NestWhile["1"<>#&,ToString[10^(Length@NestWhileList[If[EvenQ@#,If[10~Mod~#>0,#/2,#/10],#/5]&,#,Divisors@#~ContainsAny~{2, 5}&],FromDigits@#~Mod~m>0&/.m->#]&

มันคำนวณว่าต้องมีศูนย์จำนวนเท่าใดจากนั้นตรวจสอบ1จำนวนที่เป็นไปได้ทั้งหมดจนกว่าจะได้ผล มันสามารถส่งออกเป็นจำนวนมากที่ไม่มี 0 แต่ที่สามารถแก้ไขได้โดยการเพิ่มทางขวาก่อนสุดท้าย<>"0"&


2

Haskell, 37 ไบต์

f n=[d|d<-"10",i<-[1..n*9],gcd n i<2]

นี้ใช้ความเป็นจริงว่าการทำงานจะมี9*phi(n)คนที่phiเป็น totient ฟังก์ชันออยเลอร์ นี่ก็ดำเนินการใช้gcdและการกรองการผลิตหนึ่งหลักสำหรับค่าแต่ละiที่ค่อนข้างสำคัญไปว่าอยู่ในช่วงและ1 9*nนอกจากนี้ยังเพียงพอที่จะใช้เลขศูนย์จำนวนมาก


2

JavaScript (ES6), 65 ไบต์

แก้ไข 2 ไบต์ที่บันทึกไว้ขอบคุณ @Neil

มันทำงานได้ภายในขีด จำกัด ของประเภทตัวเลขจาวาสคริปต์ที่มี 17 หลักสำคัญ (ค่อนข้าง จำกัด )

a=>{for(n='';!(m=n+=1)[17];)for(;!(m+=0)[17];)if(!(m%a))return+m}  

น้อย golfed

function (a) {
    for (n = ''; !(m = n += '1')[17]; )
        for (; !(m += '0')[17]; )
            if (!(m % a))
                 return +m;
}

1
ทำไมไม่for(m=n;?
Neil

@ Neil เพราะฉันต้องการอย่างน้อยหนึ่งศูนย์ บางทีฉันสามารถหาวิธีที่สั้นกว่านี้ ... (ขอบคุณสำหรับการแก้ไข)
edc65

โอ้นั่นไม่ชัดเจนในคำถาม แต่ฉันเห็นแล้วว่าตัวอย่างผลลัพธ์ทั้งหมดมีอย่างน้อยหนึ่งศูนย์ for(m=n;!m[16];)if(!((m+=0)%a))ในกรณีที่คุณยังสามารถบันทึกไบต์โดยใช้
Neil

1
@Neil หรือ 2 ไบต์ ขอบคุณ
edc65



0

bc, 58 ไบต์

define f(n){for(x=1;m=10^x/9*10^x;++x)if(m%n==0)return m;}

ตัวอย่างผลลัพธ์

200: 111000
201: 111111111111111111111111111111111000000000000000000000000000000000
202: 11110000
203: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000
204: 111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000
205: 1111100000
206: 11111111111111111111111111111111110000000000000000000000000000000000
207: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
208: 111111000000
209: 111111111111111111000000000000000000
210: 111111000000
211: 111111111111111111111111111111000000000000000000000000000000
212: 11111111111110000000000000
213: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
214: 1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000
215: 111111111111111111111000000000000000000000
216: 111111111111111111111111111000000000000000000000000000
217: 111111111111111111111111111111000000000000000000000000000000
218: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
219: 111111111111111111111111000000000000000000000000

0

dc, 27 ไบต์

Odsm[O*lmdO*sm+O*dln%0<f]sf

นี้กำหนดฟังก์ชั่นที่คาดว่าข้อโต้แย้งในตัวแปรf nหากต้องการใช้เป็นโปรแกรมใน?sn lfx pการอ่านจาก stdin ให้เรียกใช้ฟังก์ชันและพิมพ์ผลลัพธ์ไปที่ stdout ตัวแปรmและด้านบนของสแต็กต้องรีเซ็ตเป็น 10 (โดยการทำซ้ำOdsm) ก่อนfจึงจะสามารถนำมาใช้ใหม่ได้

ผล:

200: 111000
201: 111111111111111111111111111111111000000000000000000000000000000000
202: 11110000
203: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000
204: 111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000
205: 1111100000
206: 11111111111111111111111111111111110000000000000000000000000000000000
207: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
208: 111111000000
209: 111111111111111111000000000000000000
210: 111111000000
211: 111111111111111111111111111111000000000000000000000000000000
212: 11111111111110000000000000
213: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
214: 1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000
215: 111111111111111111111000000000000000000000
216: 111111111111111111111111111000000000000000000000000000
217: 111111111111111111111111111111000000000000000000000000000000
218: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
219: 111111111111111111111111000000000000000000000000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.