n * k = dd0d00d โดยที่ d = …?


14

รับจำนวนเต็มบวกn ≤ 500 :

  • ค้นหาที่เล็กที่สุดจำนวนเต็มบวกkดังกล่าวว่าตัวเลขทั้งหมดในการแสดงทศนิยมของn * kมีทั้ง0หรือdกับ1 ≤≤ d 9

  • พิมพ์หรือส่งคืนdในเวลาน้อยกว่า 30 วินาที (อ่านเพิ่มเติมเกี่ยวกับสิ่งนั้นในส่วนคำอธิบายและกฎ )

ตัวอย่างง่าย ๆ

นี่คือ 30 ค่าแรกของd

+----+-------+---------+---+    +----+-------+---------+---+
|  n |     k |   n * k | d |    |  n |     k |   n * k | d |
+----+-------+---------+---+    +----+-------+---------+---+
|  1 |     1 |       1 | 1 |    | 16 |     5 |      80 | 8 |
|  2 |     1 |       2 | 2 |    | 17 |   653 |   11101 | 1 |
|  3 |     1 |       3 | 3 |    | 18 |     5 |      90 | 9 |
|  4 |     1 |       4 | 4 |    | 19 |   579 |   11001 | 1 |
|  5 |     1 |       5 | 5 |    | 20 |     1 |      20 | 2 |
|  6 |     1 |       6 | 6 |    | 21 |    37 |     777 | 7 |
|  7 |     1 |       7 | 7 |    | 22 |     1 |      22 | 2 |
|  8 |     1 |       8 | 8 |    | 23 |  4787 |  110101 | 1 |
|  9 |     1 |       9 | 9 |    | 24 |    25 |     600 | 6 |
| 10 |     1 |      10 | 1 |    | 25 |     2 |      50 | 5 |
| 11 |     1 |      11 | 1 |    | 26 |    77 |    2002 | 2 |
| 12 |     5 |      60 | 6 |    | 27 |    37 |     999 | 9 |
| 13 |    77 |    1001 | 1 |    | 28 |    25 |     700 | 7 |
| 14 |     5 |      70 | 7 |    | 29 | 37969 | 1101101 | 1 |
| 15 |     2 |      30 | 3 |    | 30 |     1 |      30 | 3 |
+----+-------+---------+---+    +----+-------+---------+---+

ตัวอย่างที่ไม่ง่าย

ความพิเศษอย่างหนึ่งของความท้าทายนี้คือคุณค่าบางอย่างนั้นหาได้ยากกว่าอย่างอื่น - อย่างน้อยก็ด้วยวิธีการใช้กำลังอย่างไร้เดียงสา ด้านล่างนี้คือตัวอย่างบางส่วนของnที่นำไปสู่ที่มีมูลค่าสูงของk

+-----+------------+---------------+---+    +-----+------------+---------------+---+
|   n |          k |         n * k | d |    |   n |          k |         n * k | d |
+-----+------------+---------------+---+    +-----+------------+---------------+---+
|  81 |   12345679 |     999999999 | 9 |    | 324 |   13717421 |    4444444404 | 4 |
| 157 |   64338223 |   10101101011 | 1 |    | 353 |   28615017 |   10101101001 | 1 |
| 162 |   13717421 |    2222222202 | 2 |    | 391 |  281613811 |  110111000101 | 1 |
| 229 |   43668559 |   10000100011 | 1 |    | 405 |   13717421 |    5555555505 | 5 |
| 243 |   13717421 |    3333333303 | 3 |    | 439 |   22781549 |   10001100011 | 1 |
| 283 |   35371417 |   10010111011 | 1 |    | 458 |   43668559 |   20000200022 | 2 |
| 299 |   33478599 |   10010101101 | 1 |    | 471 |   64338223 |   30303303033 | 3 |
| 307 |   32576873 |   10001100011 | 1 |    | 486 |   13717421 |    6666666606 | 6 |
| 314 |   64338223 |   20202202022 | 2 |    | 491 |  203871711 |  100101010101 | 1 |
| 317 | 3154574483 | 1000000111111 | 1 |    | 499 |   22244489 |   11100000011 | 1 |
+-----+------------+---------------+---+    +-----+------------+---------------+---+

คำอธิบายและกฎ

  • n * kจะมีอย่างน้อยหนึ่งหลัก dแต่อาจไม่มีศูนย์เลย
  • นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ อย่างไรก็ตามโปรแกรมหรือฟังก์ชันของคุณจะต้องสามารถส่งคืนผลลัพธ์สำหรับ1 for n ≤ 500ในเวลาน้อยกว่า 30 วินาทีสำหรับฮาร์ดแวร์ระดับกลาง
  • โปรดจำไว้ว่าค่าบางค่านั้นหายากกว่าค่าอื่น ๆ โปรแกรมที่จะพยายามบังคับค่าของkไม่น่าจะเป็นไปตามข้อ จำกัด ด้านเวลา (กรณีทดสอบที่ดีคือn = 317 ) มีวิธีการได้เร็วขึ้นอย่างมีนัยสำคัญในการค้นหาเป็นd

ตารางอ้างอิง

ค่าทั้งหมดของdสำหรับ1 ≤ n ≤ 500มีการระบุไว้ด้านล่าง

n       | d
--------+--------------------------------------------------
001-025 | 1 2 3 4 5 6 7 8 9 1 1 6 1 7 3 8 1 9 1 2 7 2 1 6 5
026-050 | 2 9 7 1 3 1 8 3 2 7 9 1 2 3 4 1 6 1 4 9 2 1 6 7 5
051-075 | 3 4 1 9 5 7 1 2 1 6 1 2 9 8 5 6 1 4 3 7 1 9 1 2 3
076-100 | 4 7 6 1 8 9 2 1 4 5 2 3 8 1 9 1 4 3 2 5 6 1 7 9 1
101-125 | 1 6 1 8 7 2 1 9 1 1 1 7 1 2 5 4 9 2 7 6 1 2 3 4 5
126-150 | 6 1 8 3 1 1 6 7 2 9 8 1 6 1 7 1 2 1 9 5 2 7 4 1 3
151-175 | 1 8 9 7 5 4 1 2 1 8 7 2 1 4 3 2 1 8 1 1 3 4 1 6 7
176-200 | 8 3 2 1 9 1 2 1 8 5 6 1 4 9 1 1 6 1 2 3 7 1 9 1 2
201-225 | 3 2 7 4 5 2 9 8 1 7 1 4 1 2 5 9 7 2 3 2 1 2 1 7 9
226-250 | 2 1 4 1 1 3 8 1 6 5 4 3 7 1 6 1 2 3 4 7 6 1 8 3 5
251-275 | 1 6 1 2 3 8 1 6 7 2 9 2 1 6 5 7 3 4 1 9 1 8 3 2 5
276-300 | 6 1 2 9 7 1 2 1 4 5 2 7 9 1 1 3 4 1 7 5 8 9 2 1 3
301-325 | 7 2 3 8 5 6 1 4 3 1 1 8 1 2 9 4 1 2 1 8 1 7 1 4 5
326-350 | 2 1 8 7 3 1 4 3 2 5 8 1 2 3 2 1 6 1 8 3 2 1 4 1 7
351-375 | 9 8 1 6 5 4 7 2 1 9 1 2 3 4 5 2 1 8 9 1 7 6 1 2 3
376-400 | 8 1 9 1 2 3 2 1 6 7 2 9 4 1 3 1 7 1 2 5 9 1 2 7 4
401-425 | 1 6 1 4 5 2 1 8 1 1 3 4 7 9 5 8 1 2 1 6 1 2 3 8 5
426-450 | 2 7 4 3 1 1 9 1 7 3 4 1 6 1 4 3 2 1 4 5 2 3 7 1 9
451-475 | 1 4 3 2 5 8 1 2 9 2 1 6 1 8 3 2 1 6 7 1 3 8 1 6 5
476-500 | 7 3 2 1 6 1 2 3 4 5 6 1 8 3 7 1 6 1 2 9 8 7 6 1 5

1
แรงบันดาลใจอย่างหลวม ๆ (แต่ค่อนข้างแตกต่างจาก) ความท้าทายล่าสุดนี้
Arnauld

n = 6669666 -> d = 9
J42161217

เส้นทแยงมุมที่น่าสนใจในตารางนั้น
James

@ James แน่นอน ลวดลายจะปรากฏชัดเจนขึ้นเล็กน้อยโดยการจัดรูปแบบ MOD 24 ด้วย MOD 25 เราจะได้เส้นทแยงมุมแทน :-)
Arnauld

คำตอบ:


3

เยลลี่ , 16 15 14 ไบต์

²B€Ḍ9×þF%Þ¹ḢQS

รันไทม์กำลังสอง (ไม่เกิน 25 วินาทีใน TIO)

ลองออนไลน์!

รุ่นอื่น 15 ไบต์

2ȷB€Ḍ9×þF%Þ¹ḢQS

ค่ารันไทม์คงที่ (ประมาณ 1 วินาทีสำหรับ TIO)

ลองออนไลน์!

มันทำงานอย่างไร

²B€Ḍ9×þF%Þ¹ḢQS  Main link. Argument: n

²               Take the square of n.
                This bound is high enough for all integers up to 500. 
                In fact, The highest value we need is 1387 for input 471, so
                2000 (2ȷ) is also enough (and a lot faster).

 B€             Binary; convert 1, ..., 4159 to base 2.
   Ḍ            Undecimal; convert each digit array from base 10 to integer.
                This generates the array A of all positive integers up to n²
                whose decimal representations consist entirely of 1's and 0's.
    9×þ         9 multiply table; for each x in A, yield [x, 2x, ..., 8x, 9x].
       F        Flatten; concatenate the resulting arrays, yielding the vector
                V. Note that V contains all numbers that match the regex ^d[0d]*$
                in base 10, in ascending order.
          ¹     Identity; yield n.
        %Þ      Sort the entries for V by their remainders modulo n. This places
                multiples of n at the beginning. The sorting algorithm in stable,
                so the first element of sorted V is the smallest multiple of n.
           Ḣ    Head; extract the first element.
            Q   Unique; deduplicate its digits in base 10. This yields [d, 0].
             S  Take the sum, yielding d.

5

JavaScript (ES6), 83 ไบต์

n=>{for(p=1;;p=k)for(d=0;d++<9;)for(k=p;k<p+p;k++)if(k.toString(2)*d%n<1)return d;}

ตอนนี้กลับ6มาn=252! ฉันลองใช้วิธีเรียกซ้ำ แต่ก็มี 83 ไบต์และขัดข้องสำหรับฉันสำหรับตัวเลขที่ยากขึ้น:

f=(n,p=1,d=1,k=p)=>k<p+p?k.toString(2)*d%n<1?d:f(n,p,d,k+1):d>8?f(n,p+p):f(n,p,d+1)

4

Mathematica, 103 100 97 ไบต์

#&@@IntegerDigits[Sort[Join@@Table[Cases[FromDigits/@{0,i}~Tuples~13/#,_Integer],{i,9}]][[10]]#]&


พบ 317 ใน 0.39 วินาที

ลองออนไลน์ คัดลอก / วางรหัสออนไลน์เพิ่ม [317] ที่ท้ายแล้วกด Shift + Enter เพื่อเรียกใช้

-3 bytes จาก @JungHwan Min
-3 ไบต์จาก @Keyu Gan


คุณสามารถกำจัด*ใน*#และTuples[{0,i},13]เป็น{0,i}~Tuples~13
จองฮวานมิน

ใช่แน่นอนทำแล้ว!
J42161217

โอ้และอีกหนึ่ง: [[1]]ในตอนท้ายก็เหมือนกับ#&@@การเริ่มต้น
JungHwan Min

... และเราทำให้ครบ 100! ขอบคุณสำหรับ -3 bytes
J42161217

คุณสามารถใช้Join@@แทนFlatten@
Keyu Gan

2

Python 2/3, 129 128 127 ไบต์

from itertools import*
lambda n:next(d for p in count()for d in range(1,10)for k in range(2**p,2*2**p)if d*int(bin(k)[2:])%n<1)

-1 ไบต์: count(0)count()
-1 ไบต์: ==0<1เนื่องจากไม่สามารถลบได้


2

เยลลี่ 21 ไบต์

9Rṭ€0ṗ€⁴ẎḌḍ@Ðf⁸ṢDFḟ0Ḣ

ลิงก์ monadic ส่งคืนหมายเลขหรือโปรแกรมเต็มรูปแบบที่พิมพ์

Brute-forcer จำกัด ช่วงเวลาซึ่งใช้เวลาน้อยกว่า 20 วินาทีสำหรับ1 ≤ n ≤ 500 (น้อยกว่า 3 วินาทีสำหรับค่าใช้จ่ายรหัส 1 ไบต์ - แทนที่ด้วย13)

ลองออนไลน์!

อย่างไร?

9Rṭ€0ṗ€⁴ẎḌḍ@Ðf⁸ṢDFḟ0Ḣ - Link: number, n
9R                    - range of 9 = [1,2,3,4,5,6,7,8,9]
  ṭ€0                 - tack €ach to 0 -> [[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9]]
       ⁴              - literal 16
     ṗ€               - Cartesian product for €ach
        Ẏ             - tighten (flatten by 1 level)
         Ḍ            - covert from decimal list to number (vectorises)
              ⁸       - chain's left argument (n)
            Ðf        - filter keep items for which this yields a truthy value:
          ḍ@          -   divisible? with swapped @rguments
               Ṣ      - sort
                D     - convert to decimal list (vectorises)
                 F    - flatten into a single list
                  ḟ0  - filter out zeros
                    Ḣ - head (get the first value)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.