Trouver le nombre dans la constante de Champernowne

35

introduction

En base 10, la constante de Champernowne est définie par la concaténation de représentations de nombres entiers successifs. En base 10: 0.1234567891011121314151617...et ainsi de suite.

Vous pouvez voir que la première apparition de 15commence à la 20thdécimale:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
                     ^
0.1234567891011121314151617181920212223242526272829303132333435363738...
                     ^^
                     15 = position 20

La première apparition de 45commence à la 4thdécimale:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
     ^               
0.1234567891011121314151617181920212223242526272829303132333435363738...
     ^^
     45 = position 4

Donc, la tâche est facile. Pour un nombre entier non négatif, indiquez la position du nombre entier dans la constante de Champernowne.

Règles

  • Vous pouvez fournir une fonction ou un programme
  • C'est du , donc la soumission avec le moins d'octets gagne!

Cas de test

Input: 20
Output: 30

Input: 333
Output: 56

Input: 0
Output: 11 (note that the 0 before the decimal point is ignored)

Input: 2930
Output: 48
Adnan
la source
Quelle est la position la plus élevée, nous devons travailler? Par exemple, le nombre sera-t-il jamais 987654321123456877654234354675.
Morgan Thrapp
@ MorganThrapp Je vais probablement tester les entiers dans la plage 0 <= x <= 99, mais cela devrait théoriquement fonctionner pour des entiers supérieurs à 99.
Adnan
2
Obligatoire OEIS
Leaky Nun

Réponses:

8

Pyth, 10

hxjkS+QT`Q

Concatène les premiers input + 10nombres puis trouve l'index basé sur 0 plus un .. Les dix supplémentaires ne sont nécessaires que pour 0.

Suite de tests

FryAmTheEggman
la source
Je pense que l'entrée implicite a été implémentée avant 2015-12-17 15:01:23Zou quelque chose?
Erik the Outgolfer
@EriktheOutgolfer Il a été ajouté en 2016: github.com/isaacg1/pyth/commit/…
FryAmTheEggman
10

LabVIEW, 29 primitives LabVIEW

Cela utilise des chaînes pour le moment. Il correspond à l'entrée sous forme de motif et génère le décalage - (longueur de l'entrée -1).

Eumel
la source
6

Javascript, 57 octets

a=prompt();for(y=b=" ";y<a+11;)b+=++y;alert(b.indexOf(a))

Sauvé 1 octet grâce à Conor O'Brien.

SuperJedi224
la source
Je pense que vous pouvez déplacer la y=partie vers le y=b=" "; incrémenter un espace, c'est comme incrémenter zéro. ( a=prompt(y=b=" ");...)
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Belle trouvaille.
SuperJedi224
4

Haskell, 62 octets

a#b|and$zipWith(==)a b=1|1<2=1+a#tail b 
(#(show=<<[1..])).show

Exemple d'utilisation: (#(show=<<[1..])).show $ 2930-> 48.

Comment ça marche: a # btrouve la position de adans b: si aest le préfixe de bretour 1, sinon ajouter 1à un appel récursif avec a # tail b. La fonction pointfree (#(show=<<[1..])).showattend un argument (non nommé) net des appels show n # show=<<[1..].

La fonction subIndexferait également le travail de #, mais le nécessaire import Data.List.Utilsne paye pas.

nimi
la source
Je ne pense pas que vous ayez besoin de.show
Wheat Wizard
Et une compétition amicale. bien que deux ans de retard.
Wheat Wizard,
4

Ruby, 28 ans

->n{[*0..n+10]*''=~/\B#{n}/}

Inclut un 0 au début afin que les correspondances soient indexées sur 1, mais utilise \Bpour exiger que la correspondance ne soit pas au début de la chaîne.

histocrate
la source
4

Japt, 11 octets

C'était à l'origine de battre Pyth, mais apparemment cela n'a pas fonctionné pour l'entrée 0.

1+1oU+B ¬bU

Essayez-le en ligne!

Comment ça marche

1+1oU+B ¬ bU
1+1oU+B q bU  // Implicit: U = input integer
  1oU+B       // Generate the range [0, U+11).
        q bU  // Join and take the index of U.
1+            // Add one to get the correct result.
              // Implicit: output last expression
ETHproductions
la source
Pourquoi votre section "Comment ça marche" contient-elle un qsymbole dans le code et non le symbole de négation logique ¬?
Fataliser
@Fatalize ¬est un raccourci pour (c'est qavec un espace suivant). Cela semble être souvent un point de confusion et j'ai donc aligné la version la plus courte avec la version complète.
ETHproductions
3

Lua, 54 octets

s=""for i=1,1e4 do s=s..i end print(s:find(io.read()))

Remarque: Actuellement, ce programme imprime à la fois la première occurrence du premier caractère de la chaîne et le point où elle se termine. Si cela n'est pas autorisé, cela coûtera quelques octets supplémentaires. Je voudrais demander un bonus car mon programme imprime à la fois la première et la dernière position du numéro saisi.

Nikolai97
la source
1
Voulez-vous dire les indices de début et de fin pour la première occurrence du nombre? Parce que théoriquement, le nombre serait là une quantité infinie de fois.
Rɪᴋᴇʀ
Oui, commence et finit pour la première occurrence.
Nikolai97
3

MATL , 22 octets

it10+:Yst' '=~)wYsXf1)

Prenez input ( i), transformez le vecteur 1 en entrée + 10 ( 10+:), convertit le vecteur en chaîne ( Ys) et supprimez les espaces, ce qui est douloureux, ( t' '=~)). Ensuite, convertissez l’entrée en chaîne ( Ys), recherchez où se trouve la chaîne d’entrée dans la chaîne de nombres ( Xf) et prenez le premier emplacement ( 1)). Les t'et w' manipulent la pile (dupliquer et échanger, respectivement).

David
la source
3

PowerShell, 39 44 octets

[Edit: mon hypothèse ne tient pas, la construction d'un tableau de 1-0 ne trouve pas 0 à la place 11. Au lieu de cela, construisez à partir de 1-x + 10 pour gérer 0 aussi, maintenant 44 octets]

param($i)(1..($i+10)-join'').IndexOf("$i")+1

Vous trouverez toujours x lors de la création d'une chaîne de la constante de Champernowne au dernier point lorsque vous ajoutez x à la fin. Ainsi, un tableau de 1-x aura toujours la réponse. La question devient "cela se produit-il plus tôt que cela?" . Ce code

param($i)(1..$i-join'').IndexOf("$i")+1

e.g.

PS C:\Temp> .\Champer.ps1 20
30

génère une plage de nombres, la convertit en chaîne et recherche le paramètre à l'intérieur de celle-ci. Etant donné que PowerShell est un shell orienté objet, le paramètre est en fait un [int]type. Par conséquent, si vous souhaitez enregistrer deux caractères avec .IndexOf($i), rechercher dans la chaîne un entier et ne rien trouver. C'est pourquoi j'utilise l'interpolation de chaîne "$i".

TessellatingHeckler
la source
1
Façon intelligente de le faire. Frustrant qui a .IndexOf()apparemment une préférence opérationnelle plus élevée qu'un unaire -joinforçant les parens et les citations. : - /
AdmBorkBork
3

MATL (version 1.0.1), 22 octets

iXK10+:"@Ys]N$hKYsXf1)

Exemple

>> matl iXK10+:"@Ys]N$hKYsXf1)
> 333
56

Explication

i       % Input
XK      % Copy to clipboard K            
10+     % Add 10. This is needed in case input is 0
:       % Vector of equally spaced values, starting from 1
"       % For each
  @Ys   %   For loop variable as a string
]       % End                            
N$h     % Horizontal concatenation of all stack contents
KYs     % Paste from clipboard K (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

MATL (version 20.8.0), 16 octets (défi du langage postdate)

Merci à @ Giuseppe pour cette version du programme (légèrement modifiée)

10+:"@V]&hGVXf1)

Essayez-le en ligne!

Explication

10+     % Implicit Input. Add 10. This is needed in case input is 0 
:       % Vector of equally spaced values, starting from 1
"       % For each
  @V    %   For loop variable as a string 
]       % End
&h      % Horizontal concatenation of all stack contents
GV      % Paste from automatic clipboard G (input number) and convert to string
Xf      % Find one string within another 
1)      % First value
Luis Mendo
la source
Je ne pense pas que cela gère 0 :(
David
@ David Maintenant c'est le cas. Merci d'avoir remarqué! Cela ne coûte que 3 octets :-)
Luis Mendo
Maintenant que le presse-papiers Gcontient l’entrée (et l’entrée implicite), j’imagine que cette réponse peut être raccourcie considérablement et Ysqu’il est nécessaire de changer de Vtoute façon; Je suis venu avec 10+:"@Vv]!GVXf1)16 octets.
Giuseppe
@ Giuseppe Merci pour le heads-up! Mis à jour, avec crédit (et avec une note "Langue postdates challange"; je ne suis pas un grand fan de la nouvelle règle )
Luis Mendo
Cette règle ne me dérange pas tellement (les drapeaux on me rend fou, cependant); Je faisais principalement des commentaires ici, car je remarquais qu'il était Ysnécessaire de passer à Vla version la plus récente de l'interprète. Je suis toujours impressionné par l'amélioration de la langue!
Giuseppe
2

PowerShell, 54 à 50 octets

for($c='';!($x=$c.IndexOf("$args")+1)){$c+=++$i}$x

Merci à TessellatingHeckler pour l’idée d’échanger la whileboucle contre une forboucle.

S'exécute via une forboucle. Comme avec les autres langages, la première instruction de la boucle peut construire des variables et des assignations. Elle commence donc par $cégale à la chaîne vide, de ''sorte que nous ayons une indexation zéro de la chaîne alignée avec l'indexation décimale du défi. Nous sommes alors dans une boucle qui vérifie si $ca l'entier d'entrée ( $args) quelque part dans (ie, étant donné que le .IndexOf()rendement -1si la chaîne ne se trouve pas, nous ajoutons un à qui ( 0) et pas ( $TRUE) de continuer la boucle). Si ce n'est pas trouvé, nous ajoutons notre $ivariable de compteur pré-incrémentée , puis revérifions la chaîne. Une fois la chaîne trouvée,.IndexOf() retournera une valeur positive, dont le non sera$FALSE, sortir de la boucle. Enfin, nous produisons l'index avec $x.

AdmBorkBork
la source
Idéal pour une forboucle classique ... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$xet enregistrez 1 caractère. Comme la plupart des appels IndexOf renverront -1, ajoutez-en un et booléen! lancez-le, pour un test plus court. Mais vous avez besoin de parens pour le faire. Vide $ c et +1 dans les parens existants, bonus c'est plus court. for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51 octets. (mais j'ai posté mon 39 octets comme réponse car c'est une approche complètement différente: P).
TessellatingHeckler
1
@TessellatingHeckler Belle façon de réécrire la boucle - merci! J'ai déplacé la $cconcaténation dans la boucle pour jouer au golfe un point-virgule. Maintenant à 50 ans.
AdmBorkBork
2

JavaScript (ES6), 40 octets

x=>(f=n=>n?f(n-1)+n:" ")(x+11).search(x)

Utilise la fonction récursive fpour éviter les boucles. La méthode de recherche fonctionne de la même manière, indexOfsauf qu’elle prend RegExp en tant que paramètre, ce qui n’est pas pertinent pour ce défi.

L'ajout d'un " "pour le n=0cas (zéro est faux dans JS) oblige le +à effectuer une concaténation de chaîne au lieu d'un ajout et à corriger l'indexation à zéro.

intrépide
la source
1

Python 3, 54.

print(''.join(map(str,range(1,9**7))).find(input())+1)
Morgan Thrapp
la source
1

CJam, 11 octets

r_i),s\#Be|

Testez-le ici.

Je trouve la position de Ndans la chaîne 01234...Npour prendre en compte l'indexation basée sur 1. Enfin, je répare 0en appliquant un OU logique avec 11.

Martin Ender
la source
1

Sérieusement, 13 octets

;≈9u+R`$`MΣí

Prend l'entrée sous forme d'entier. Contient des éléments non imprimables, donc hexdump:

0c3bf739752b526024604de4a1

Essayez-le en ligne

Explication:

;≈9u+R`$`MΣí
<form feed>   push str(input)
;≈9u+R        dupe, push [1,...,input+10]
      `$`MΣ   string concatenation of list
           í  get index of input
Mego
la source
1

k4, 21 octets

{*1+(,/$1+!10+x)ss$x}

Même chose que tout le monde: concaténer [1..10+x] tant que chaînes, rechercher x en tant que chaîne, convertir en index sur une base, renvoyer le premier résultat.

Vérification des cas de test:

  &/20 4 30 56 11 48={*1+(,/$1+!10+x)ss$x}'15 45 20 333 0 2930
1b
Aaron Davies
la source
1

Mathematica, 101 octets

(If[#==0,11,m=Min@SequencePosition[s=Flatten[(K=IntegerDigits)/@Range[0,#]],K@#];Length@s[[;;m-1]]])&
J42161217
la source
1

Haskell , 82 73 55 octets

Migré du duplicata

x!b|or$zipWith(==)x b=0
x!(_:b)=1+x!b
(!(show=<<[1..]))

Essayez-le en ligne!

Explication

Nous définissons d'abord !. x!btronque bà la première apparition de x. Pour ce faire, il vérifie si bcommence avec x( or$zipWith(==)x b) en retournant xsi c'est le cas et en déplaçant un autre dans la chaîne. Ensuite, nous définissons notre fonction principale. Notre fonction principale est une fonction sans point qui prend la constante ( show=<<[1..]) et la tronque à la première apparition de x. Cela prend xcomme une chaîne.

Assistant de blé
la source
1

JavaScript (ES6), 50 39 38 bytes

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)

Try it

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)
o.innerText=f(i.value=15);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o></pre>

Shaggy
la source
1

Perl 6, 26 bytes

{[~](0..$_).index($_)||11}

Try it online!

Finds the index of the element in the concatenated range from 0 to that element, or 11 if the number is a zero

Jo King
la source
0

Perl 5, 42 + 1 (-p) = 43 bytes

(join'',0..$_+10)=~/^(0.*?)$_/;$_=length$1

Try it online!

Explanation

(join'',0..$_+10)   #concatenate all of the numbers from 0 to 10 over the input
=~/^(0.*?)$_/;      #skip the first 0, then find the input
$_=length$1         #the length of the string preceding the input is the answer
Xcali
la source
0

Perl 6/Rakudo 29 bytes

{$_~=$++until /(.+)$^a/;$0.chars}

Defines a function with one input ($^a). Call thus:

say {$_~=$++until /(.+)$^a/;$0.chars}(333)
> 56

Appending $, an anonymous variable, incrementing $++ until the input $^a is found, and then counting the number of chars before it. Requiring at least 1 char before it .+ in the regex usefully excludes the 0->0 case

Phil H
la source
0

J, 30 Bytes

{.I.(":E.[:}.' '-.~":@i.@+&11)

Could probably be golfed down a bit more, specifically in concatenating the first n+10 integers.

Explanation:

{.I.(":E.[:}.' '-.~":@i.@+&11)
                      i.@+&11   | Integers 0 to n+10
                   ":@          | Format list to string
             ' '-.~             | Strip spaces
           }.                   | Behead (remove leading 0)
         [:                     | Cap (previous verbs executed in order, not as a fork)
     ":E.                       | Find matches to the string n (returns a boolean vector)
  I.                            | Indexes of 1s
{.                              | Take only the first

Note that this is 0-indexed. Examples:

    {.I.(":E.[:}.' '-.~":@i.@+&11) 1
0
    {.I.(":E.[:}.' '-.~":@i.@+&11) 0
10
    {.I.(":E.[:}.' '-.~":@i.@+&11) 333
55
Bolce Bussiere
la source
0

Husk, 6 bytes

€ΣmdNd

Try it online!

€         The 1-based index in
 Σ        the list of concatenated
   d      decimal digits
  m N     of every natural number
     d    of the decimal digits of
          the input.
Unrelated String
la source