게으른 값 생성


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

자바 스크립트 (ES6), 31 바이트

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

각각에 대한 지연 값을 직접 계산합니다 n.

편집 : JavaScript 정수 유형의 제한으로 인해 최대 277777778까지만 작동합니다. 대체 버전 :

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

35 바이트, 최대 16666666667까지 작동합니다.

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

38 바이트, 944444444444443.까지 작동하지만 여전히이 어떤 방식으로 짧다 (53) 9007199254740992입니다.


@ user81655 숫자 제한이있는 대체 버전을 추가했습니다.
Neil

1
로 표현되어 Number.MAX_SAFE_INTEGER있기 때문에이 알고리즘을 사용할 수 없습니다 . 안타깝게도 최대 결과를 하드 코딩하는 유일한 방법처럼 보입니다. 그럼에도 불구하고 +1. 8e16 - 18e16
user81655

@ user81655 솔루션을 허용하기 위해 상한을 낮추었습니다.
Adám

10K @Neil로 연결되어 골프를 좋아합니다!
NiCk Newman

1
트윗 담아 가기 감사!
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

테스트 스위트 .


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

3

펄, 32

Neil의 아름다운 JavaScript 솔루션을 기반으로합니다.

$_=0|1/9*~-sprintf"%.e",$_*9+4.1

실패하기 시작 5e15


2

수학, 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

자바 스크립트 (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


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

@ Adám 공정, 머리 명령을 추가했습니다.
Magic Octopus Urn

1

매스 매 티카, 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나서, 테이블을 병합 요소 목록 발견 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.