สร้างค่าขี้เกียจ


25

ที่เกี่ยวข้อง: โปรแกรมไมโครเวฟเตาอบของฉัน โดยได้แรงบันดาลใจสร้างอินพุตไมโครเวฟขี้เกียจ

ค่าขี้เกียจของจำนวนเต็มไม่เป็นลบNเป็นจำนวนน้อยที่สุดของจำนวนเต็มที่ใกล้เคียงกับNในขณะที่ตัวเลขทั้งหมดของพวกเขาเหมือนกัน

ย้อนกลับ (โดยวิธีการใด ๆ ) ค่าขี้เกียจของที่กำหนด (โดยวิธีการใด ๆ ) N

Nเลขที่ใหญ่ที่สุดที่แสดงให้เห็นถึงภาษาของคุณในรูปแบบที่ไม่ใช่ตัวแทนโดยปริยาย 1000000 (โซลูชันที่น่าสนใจจำนวนมากหายไปเนื่องจากความต้องการสูงเกินไป)

กรณีทดสอบ:

   0 →    0
   8 →    8
   9 →    9
  10 →    9
  16 →   11
  17 →   22
  27 →   22
  28 →   33
 100 →   99
 105 →   99
 106 →  111
 610 →  555
 611 →  666
7221 → 6666
7222 → 7777 

เพื่อนร่วมงานในคำถามพิสูจน์ว่าจะไม่มีความสัมพันธ์: ยกเว้น 9/11, 99/111 ฯลฯ ซึ่งข้อใดข้อหนึ่งสั้นกว่าคำตอบที่ถูกต้องสองข้อติดต่อกันมักจะอยู่ห่างกันเป็นเลขคี่ ระยะห่างจากพวกเขา

คำตอบ:


15

JavaScript (ES6), 31 ไบต์

n=>~-(n*9+4).toPrecision(1)/9|0

คำนวณค่าขี้เกียจโดยตรงสำหรับแต่ละnค่า

แก้ไข: ใช้งานได้สูงสุด 277777778 เนื่องจากข้อ จำกัด ของประเภทจำนวนเต็มของ JavaScript รุ่นทางเลือก:

n=>((n*9+4).toPrecision(1)-1)/9>>>0

35 ไบต์ทำงานได้สูงสุด 16666666667

n=>((n=(n*9+4).toPrecision(1))-n[0])/9

38 ไบต์ทำงานถึง 944444444444443. แต่ที่ยังคงมีบางสั้นวิธีที่ 2 53ซึ่งเป็น 9007199254740992


@ user81655 ฉันได้เพิ่มรุ่นทางเลือกอื่นด้วยข้อ จำกัด ด้านตัวเลข
Neil

1
ฉันไม่สามารถรับขั้นตอนวิธีการทำงานด้วยNumber.MAX_SAFE_INTEGERเช่นกันเพราะจะแสดงเป็น8e16 - 1 8e16น่าเศร้าที่ดูเหมือนว่าวิธีเดียวเท่านั้นที่จะเข้ารหัสได้อย่างหนักกับผลลัพธ์สูงสุด +1 อย่างไรก็ตาม
user81655

@ user81655 ฉันลดขอบเขตบนเพื่อให้แก้ปัญหา
Adám

เตรียมพร้อม 10k @Neil ให้รักกอล์ฟ!
NiCk Newman

1
@NiCkNewman Woohoo! ขอบคุณ!
Neil

5

เยลลี่ขนาด 16 ไบต์

ḤRµDIASµÐḟµạ³ỤḢị

ลองออนไลน์!

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

ḤRµDIASµÐḟµạ³ỤḢị  Main link. Input: n

Ḥ                 Compute 2n.
 R                Yield [1, ..., 2n] or [0].
  µ               Begin a new, monadic chain. Argument: R (range)
   D              Convert to base 10.
    I             Compute all differences of consecutive decimal digits.
     A            Take the absolute values of the differences.
      S           Sum the absolute values.
       µÐḟ        Filter-false by the chain to the left.
          µ       Begin a new, monadic chain. Argument: L (lazy integers)
           ạ³     Take the absolute difference of each lazy integer and n (input).
             Ụ    Grade up; sort the indices of L by the absolute differences.
                  This is stable, so ties are broken by earlier occurrence and,
                  therefore, lower value.
              Ḣ   Head; retrieve the first index, corresponding to the lowest
                  absolute difference.
               ị  Retrieve the item of L at that index.

4

Oracle SQL 11.2, 200 ไบต์

WITH v(i)AS(SELECT 0 FROM DUAL UNION ALL SELECT DECODE(SIGN(i),0,-1,-1,-i,-i-1)FROM v WHERE LENGTH(REGEXP_REPLACE(:1+i,'([0-9])\1+','\1'))>1)SELECT:1+MIN(i)KEEP(DENSE_RANK LAST ORDER BY rownum)FROM v;

ยกเลิกแข็งแรงเล่นกอล์ฟ

WITH v(i) AS
(
  SELECT 0 FROM DUAL      -- Starts with 0
  UNION ALL
  SELECT DECODE(SIGN(i),0,-1,-1,-i,-i-1) -- Increments i, alternating between negatives and positives
  FROM   v 
  WHERE  LENGTH(REGEXP_REPLACE(:1+i,'([0-9])\1+','\1'))>1  -- Stop when the numbers is composed of only one digit
)
SELECT :1+MIN(i)KEEP(DENSE_RANK LAST ORDER BY rownum) FROM v;

3

Pyth - 26 ไบต์

คำตอบนี้ไม่เคยกลับค่าที่น้อยที่สุดในการผูก แต่ที่ไม่ได้อยู่ในรายละเอียดเพื่อรอคำชี้แจงการแก้ไข 3 ไบต์

hSh.g.a-kQsmsM*RdjkUTtBl`Q

Test Suite


3

Pyth, 16 ไบต์

haDQsM*M*`MTSl`Q

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

haDQsM*M*`MTSl`Q   implicit: Q = input number
              `Q   convert Q to a string
             l     take the length
            S      create the list [1, 2, ..., len(str(Q))]
         `MT       create the list ["0", "1", "2", "3", ..., "9"]
        *          create every combination of these two lists:
                   [[1, "0"], [1, "1"], [1, "2"], ..., [len(str(Q)), "9"]]
      *M           repeat the second char of each pair according to the number:
                   ["0", "1", "2", ..., "9...9"]
    sM             convert each string to a number [0, 1, 2, ..., 9...9]
  D                order these numbers by:
 a Q                  their absolute difference with Q
h                  print the first one

3

MATL , 25 ไบต์

2*:"@Vt!=?@]]N$vtG-|4#X<)

ใช้กำลังดุร้ายดังนั้นอาจใช้เวลาสักพักสำหรับคนจำนวนมาก

ลองออนไลน์!

2*:       % range [1,2,...,2*N], where is input
"         % for each number in that range
  @V      %   push that number, convert to string
  t!=     %   test all pair-wise combinations of digits for equality
  ?       %   if they are all equal
    @     %     push number: it's a valid candidate
  ]       %   end if
]         % end for each
N$v       % column array of all stack contents, that is, all candidate numbers
t         % duplicate
G-|       % absolute difference of each candidate with respect to input
4#X<      % arg min
)         % index into candidate array to obtain the minimizer. Implicitly display


2

Mathematica, 122 ไบต์

f@x_:=Last@Sort[Flatten@Table[y*z,{y,1,9},{z,{FromDigits@Table[1,10~Log~x+1-Log[10,1055555]~Mod~1]}}],Abs[x-#]>Abs[x-#2]&]

ฟังก์ชันชื่อ x


2

JavaScript (ES6), 59 ไบต์

n=>eval(`for(i=a=0;i<=n;a=i%10?a:++i)p=i,i+=a;n-p>i-n?i:p`)

โซลูชันแบบเรียกซ้ำ (56 ไบต์)

สั้นกว่านี้เล็กน้อย แต่ใช้ไม่ได้n > 1111111110เพราะเกินขนาดสแต็กการโทรสูงสุดจึงไม่ถูกต้องทางเทคนิค

f=(n,p,a,i=0)=>n<i?n-p>i-n?i:p:f(n,i,(i-=~a)%10?a:i++,i)

คำอธิบาย

วนซ้ำทุกหมายเลขที่ขี้เกียจจนกว่าจะถึงหมายเลขแรกซึ่งมากกว่าnจากนั้นเปรียบเทียบnกับหมายเลขนี้และหมายเลขก่อนหน้าเพื่อกำหนดผลลัพธ์

var solution =

n=>
  eval(`           // eval enables for loop without {} or return
    for(
      i=a=0;       // initialise i and a to 0
      i<=n;        // loop until i > n, '<=' saves having to declare p above
      a=i%10?a:++i // a = amount to increment i each iteration, if i % 10 == 0 (eg.
    )              //     99 + 11 = 110), increment i and set a to i (both become 111)
      p=i,         // set p before incrementing i
      i+=a;        // add the increment amount to i
    n-p>i-n?i:p    // return the closer value of i or p
  `)
N = <input type="number" oninput="R.textContent=solution(+this.value)"><pre id="R"></pre>


ฉันลดขอบเขตบนเพื่อให้โซลูชันของคุณ
Adám

2

Japt , 18 ไบต์

9*U+4 rApUs l¹/9|0

ลองออนไลน์!

ขึ้นอยู่กับเทคนิคของนีล

โซลูชันที่ไม่ได้แข่งขัน:

*9+4 h /9|0

1
และตอนนี้คุณสามารถทำได้*9+4 h /9|0:-)
ETHproductions

@ ETHproductions ขอบคุณ! ฉันสนุกมากกับ Japt :)
โอลิเวอร์

1

05AB1E , 20 ไบต์

9Ývy7L×})˜ïD¹-ÄWQÏ{¬

ลองออนไลน์!

9Ý                   # Push 0..9
  vy7L×})˜           # For each digit, 0-9, push 1-7 copies of that number.
          ïD         # Convert to integers, dupe the list.
            ¹        # Push original input (n).
             -Ä      # Push absolute differences.
               WQ    # Get min, push 1 for min indices.
                 Ï{¬ # Push indices from original array that are the min, sort, take first.

99 นั้นขี้เกียจกว่า 111 อย่างแน่นอนเพราะมันต้องการเพียงแค่กดสองปุ่มเท่านั้น
อดัม

@ Adámยุติธรรมเพียงพอเพิ่มคำสั่ง head
Magic Octopus Urn

1

Mathematica, 56 ไบต์

Min@Nearest[##&@@@Table[d(10^n-1)/9,{n,0,6},{d,0,9}],#]&

ฟังก์ชั่นบริสุทธิ์ที่มีอาร์กิวเมนต์แรกทำงานสำหรับปัจจัยการผลิตได้ถึง#10^6

สำหรับติดลบnและหลักd, 10^n-1 = 99...9( 9ซ้ำแล้วซ้ำอีกnครั้ง) ดังนั้นd(10^n-1)/9 = dd...d( dซ้ำแล้วซ้ำอีกnครั้ง) สร้างTableของค่าสำหรับ0 <= n <= 6และ0 <= d <= 9แล้ว flattens ตารางพบว่ารายชื่อขององค์ประกอบNearestการและเตะ#Min

ฉันเชื่อว่ารุ่นนี้จะทำงานสำหรับจำนวนเต็มขนาดใหญ่โดยพล:

Min@Nearest[##&@@@Table[d(10^n-1)/9,{n,0,IntegerLength@#},{d,0,9}],#]&
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.