Générer des valeurs paresseuses

25

Connexes: Programmer mon four à micro-ondes . Inspiré par Générer une entrée micro-ondes paresseux .

La valeur paresseuse de l'entier non négatif N est le plus petit des entiers les plus proches de N tandis que tous leurs chiffres sont identiques.

Renvoie (par tous les moyens) la valeur paresseuse d'un N donné (par tous les moyens) .

Nle plus grand entier que votre langue représente sous forme non exposante par défaut. 1000000 (Beaucoup de solutions intéressantes sont perdues à cause de cette exigence trop élevée.)

Cas de test:

   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 

Le collègue en question a prouvé qu'il n'y aura pas de liens: à l'exception des 9/11, 99/111, etc. pour lesquels l'une est plus courte que l'autre, deux réponses valides consécutives sont toujours à une distance étrange, donc aucun entier ne peut être exactement à égale distance d'eux.

Adam
la source

Réponses:

15

JavaScript (ES6), 31 octets

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

Calcule directement la valeur paresseuse pour chacun n.

Modifier: ne fonctionne que jusqu'à 277777778 en raison des limitations du type entier JavaScript. Versions alternatives:

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

35 octets, fonctionne jusqu'à 16666666667.

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

38 octets, fonctionne jusqu'à 944444444444443. Mais c'est encore loin de 2 53 qui est 9007199254740992.

Neil
la source
@ user81655 J'ai ajouté quelques versions alternatives avec leurs limitations numériques.
Neil
1
Je n'ai pas réussi à faire fonctionner cet algorithme Number.MAX_SAFE_INTEGERnon plus car il 8e16 - 1est exprimé sous la forme 8e16. Malheureusement, il semble que la seule façon serait de coder en dur le résultat maximal. +1 néanmoins.
user81655
@ user81655 J'ai abaissé la limite supérieure pour permettre la solution.
Adám
Vous avez à 10k @Neil, adore les golfs!
NiCk Newman
1
@NiCkNewman Woohoo! Merci!
Neil
5

Gelée, 16 octets

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

Essayez-le en ligne!

Comment ça marche

Ḥ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.
Dennis
la source
4

Oracle SQL 11.2, 200 octets

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;

Non golfé

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;
Jeto
la source
3

Pyth - 26 octets

Cette réponse ne renvoie pas toujours la plus petite valeur dans une égalité, mais ce n'est pas dans les spécifications, donc en attente de clarification fixée pour 3 octets.

hSh.g.a-kQsmsM*RdjkUTtBl`Q

Suite de tests .

Maltysen
la source
3

Pyth, 16 octets

haDQsM*M*`MTSl`Q

Essayez-le en ligne: démonstration ou suite de tests

Explication:

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
Jakube
la source
3

MATL , 25 octets

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

Utilise la force brute, cela peut donc prendre un certain temps pour les grands nombres.

Essayez-le en ligne!

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
Luis Mendo
la source
3

Perl, 32

Basé sur la belle solution JavaScript de Neil.

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

Commence à échouer à 5e15

Ton Hospel
la source
2

Mathematica, 122 octets

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]&]

Fonction nommée x.

CalculatorFeline
la source
2

JavaScript (ES6), 59 octets

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

Solution récursive (56 octets)

Ceci est un peu plus court mais ne fonctionne pas n > 1111111110car la taille maximale de la pile d'appels est dépassée, elle n'est donc pas techniquement valide.

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

Explication

Itère à travers chaque nombre paresseux jusqu'à ce qu'il atteigne le premier qui est supérieur à n, puis le compare nà celui-ci et au nombre précédent pour déterminer le résultat.

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>

user81655
la source
J'ai baissé la limite supérieure pour permettre votre solution.
Adám
2

Japt , 18 octets

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

Essayez-le en ligne!

Basé sur la technique de Neil

Solution non concurrente :

*9+4 h /9|0
Oliver
la source
1
Et maintenant vous pouvez faire *9+4 h /9|0:-)
ETHproductions
@ETHproductions Merci! Je m'amuse beaucoup avec Japt :)
Oliver
1

05AB1E , 20 octets

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

Essayez-le en ligne!

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.
Urne de poulpe magique
la source
99 est sûrement plus paresseux que 111, car il ne nécessite que deux pressions sur les boutons.
Adám
@ Adám assez juste, a ajouté le commandement en chef.
Urne de poulpe magique du
1

Mathematica, 56 octets

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

Fonction pure avec premier argument #, fonctionne pour les entrées jusqu'à 10^6.

Pour un entier non négatif net un chiffre d, 10^n-1 = 99...9( fois 9répétés n), donc d(10^n-1)/9 = dd...d( fois drépétés n). Crée une Tabledes valeurs 0 <= n <= 6et 0 <= d <= 9, aplatit la table, trouve la liste des éléments Nearestà #et prend la Min.

Je crois que cette version fonctionnera pour des entiers arbitrairement grands:

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