Finden Sie die Zahl in der Champernowne-Konstante


35

Einführung

In der Basis 10 wird die Champernowne-Konstante durch Verketten von Darstellungen aufeinanderfolgender ganzer Zahlen definiert. In Basis 10: 0.1234567891011121314151617...und so weiter.

Sie können sehen, dass das erste Auftreten von 15mit der 20thDezimalstelle beginnt :

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

Das erste Auftreten von 45beginnt mit der 4thDezimalstelle:

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

Die Aufgabe ist also einfach. Bei einer nicht negativen Ganzzahl wird die Position der Ganzzahl in der Champernowne-Konstante ausgegeben.

Regeln

  • Sie können eine Funktion oder ein Programm bereitstellen
  • Das ist , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!

Testfälle

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

Was ist die höchste Position, für die wir arbeiten müssen? ZB wird die Nummer immer 987654321123456877654234354675 sein.
Morgan Thrapp

@MorganThrapp Ich werde wahrscheinlich Ganzzahlen im Bereich testen 0 <= x <= 99, aber es sollte theoretisch für Ganzzahlen funktionieren, die höher sind als 99.
Adnan

Antworten:



10

LabVIEW, 29 LabVIEW-Grundelemente

Hier werden vorerst Zeichenfolgen verwendet. Es gleicht die Eingabe als Muster ab und gibt den Offset aus - (Eingabelänge -1).


6

Javascript, 57 Bytes

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

Dank Conor O'Brien 1 Byte gespeichert.


Ich denke, Sie können das y=Teil auf die verschieben y=b=" "; Das Inkrementieren eines Leerzeichens entspricht dem Inkrementieren von Null. ( a=prompt(y=b=" ");...)
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Schöne Entdeckung.
SuperJedi224

4

Haskell, 62 Bytes

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

Anwendungsbeispiel: (#(show=<<[1..])).show $ 2930-> 48.

So funktioniert es: a # bFindet die Position von ainnerhalb b: Wenn adas Präfix von breturn ist 1, fügen Sie 1es einem rekursiven Aufruf mit hinzu a # tail b. Die pointfree-Funktion (#(show=<<[1..])).showerwartet ein (unbenanntes) Argument nund ruft auf show n # show=<<[1..].

Die Funktion subIndexwürde auch die Arbeit erledigen #, aber das erforderliche import Data.List.Utilszahlt sich nicht aus.


Ich glaube nicht , benötigen Sie bitte den.show
Weizen -

Und ein freundlicher Wettbewerb. wenn auch zwei Jahre zu spät.
Weizen-Zauberer

4

Rubin, 28

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

Fügt am Anfang eine 0 ein, damit Übereinstimmungen mit 1 indiziert werden, setzt \Bjedoch voraus, dass die Übereinstimmung nicht am Anfang der Zeichenfolge steht.


4

Japt, 11 Bytes

Dies schlug ursprünglich Pyth, aber anscheinend funktionierte es nicht für die Eingabe 0.

1+1oU+B ¬bU

Probieren Sie es online!

Wie es funktioniert

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

Warum enthält Ihr Abschnitt "So funktioniert es" ein qim Code und nicht das logische Negationssymbol ¬?
Fatalize

@Fatalize ¬ist eine Abkürzung für (das ist qmit einem folgenden Leerzeichen). Dies scheint oft ein Punkt der Verwirrung zu sein, daher habe ich die kürzere Version mit der vollständigen Version abgeglichen.
ETHproductions

3

Lua, 54 Bytes

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

Hinweis: Derzeit gibt dieses Programm sowohl das erste Vorkommen des ersten Zeichens der Zeichenfolge als auch den Punkt aus, an dem es endet. Wenn dies nicht erlaubt ist, kostet es ein paar Bytes mehr. Ich möchte einen Bonus beantragen, da mein Programm sowohl die erste als auch die letzte Position der eingegebenen Nummer ausgibt.


1
Meinen Sie die Startindizes und Endindizes für das erste Auftreten der Zahl? Denn theoretisch wäre die Zahl unendlich oft drin.
Freitag,

Ja, beginnen und enden beim ersten Auftreten.
Nikolai97

3

MATL , 22 Bytes

it10+:Yst' '=~)wYsXf1)

Nehmen Sie die Eingabe ( i), setzen Sie den Vektor 1 auf Eingabe + 10 ( 10+:), konvertieren Sie den Vektor in eine Zeichenfolge ( Ys) und entfernen Sie die schmerzhaften Leerzeichen ( t' '=~)). Konvertieren Sie dann die Eingabe in eine Zeichenfolge ( Ys), suchen Sie, wo sich die Eingabezeichenfolge in der Zeichenfolge von Zahlen ( Xf) befindet, und nehmen Sie die erste Position ( 1)). Die t's und w' s manipulieren den Stack (duplizieren bzw. tauschen).


3

PowerShell, 39 44 Bytes

[Edit: Meine Annahme ist falsch. Wenn Sie ein Array von 1-0 erstellen, wird an Position 11 keine 0 gefunden. Erstellen Sie stattdessen von 1-x + 10, um auch 0, jetzt 44 Byte, zu verarbeiten.]

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

Sie werden immer x finden, wenn Sie eine Zeichenfolge der Champernowne-Konstante zum letzten Zeitpunkt erstellen, wenn Sie x zum Ende hinzufügen , sodass ein Array von 1-x immer die Antwort enthält. Die Frage lautet: "Tritt sie früher auf?" . Dieser Code

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

e.g.

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

generiert einen Zahlenbereich, wandelt ihn in einen String um und sucht nach dem darin enthaltenen Parameter. Da PowerShell eine objektorientierte Shell ist, ist der Parameter eigentlich ein [int]Typ. Wenn Sie also versuchen, zwei Zeichen mit zu speichern, wird .IndexOf($i)die Zeichenfolge nach einer Ganzzahl durchsucht und es wird nichts gefunden. Deshalb verwende ich die String-Interpolation "$i".


1
Clevere Art und Weise, es zu tun. Es ist frustrierend, dass das .IndexOf()offenbar eine höhere betriebliche Präferenz hat als das unitäre -joinErzwingen von Parens und Zitaten. : - /
AdmBorkBork

3

MATL (Release 1.0.1), 22 Byte

iXK10+:"@Ys]N$hKYsXf1)

Beispiel

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

Erläuterung

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 (Release 20.8.0), 16 Bytes (Sprachnachbereitung)

Dank an @ Giuseppe für diese Version des Programms (leicht modifiziert)

10+:"@V]&hGVXf1)

Probieren Sie es online!

Erläuterung

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

Ich glaube nicht, dass das mit 0 :( klappt
David

@ David Jetzt tut es. Danke fürs bemerken! Es kostet nur 3 Bytes :-)
Luis Mendo

Jetzt, da die Zwischenablage Gdie Eingabe (und implizite Eingabe) enthält, kann diese Antwort vermutlich um einiges gekürzt werden, und alles Ys, was geändert werden muss, Vmuss auf jeden Fall . Ich habe mir 10+:"@Vv]!GVXf1)16 Bytes ausgedacht.
Giuseppe

@ Giuseppe Danke für das Heads-up! Aktualisiert, mit der gebotenen Gutschrift (und mit einer "Sprache Postdates Challange" Note; ich bin kein großer Fan der neuen Regel )
Luis Mendo

Diese Regel stört mich nicht so sehr (die Flaggen machen mich allerdings verrückt); Ich habe hier hauptsächlich Kommentare abgegeben, da mir aufgefallen ist, dass Ysdie VVerwendung der aktuellsten Version des Interpreters geändert werden muss . Ich bin immer wieder beeindruckt, wie sehr sich die Sprache verbessert hat!
Giuseppe

2

Power Shell, 54 50 Bytes

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

Dank an TessellatingHeckler für die Idee, die whileSchleife gegen eine forSchleife auszutauschen.

Wird über eine forSchleife ausgeführt. Wie bei anderen Sprachen kann die erste Anweisung in der Schleife Variablen und Zuweisungen erstellen. Dies beginnt also mit $cder leeren Zeichenfolge, ''sodass die Zeichenfolge mit der dezimalen Indizierung der Challenge auf Null gesetzt wird. Wir sind dann in einer Schleife , die überprüft , ob $cdie Eingabe integer hat ( $args) irgendwo in ihm (dh, da .IndexOf()kehrt , -1wenn die Zeichenfolge nicht gefunden wird, fügen wir ein zu , dass ( 0) und nicht ( $TRUE) die Schleife fortgesetzt). Wenn es nicht gefunden wird, fügen wir unsere vorab inkrementierte $iZählervariable hinzu und überprüfen die Zeichenfolge erneut. Sobald die Zeichenfolge gefunden wurde, .IndexOf()wird ein positiver Wert zurückgegeben, dessen nicht$FALSE, bricht aus der Schleife aus. Zuletzt geben wir den Index mit aus $x.


Ideal für eine klassische forSchleife ... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$xund speichern Sie 1 Zeichen. Da die meisten IndexOf-Aufrufe -1 zurückgeben, fügen Sie eins hinzu und boolean! Wirf es für einen kürzeren Test. Aber dazu braucht man Eltern. Leere $ c und +1 in bestehenden Parens, Bonus ist kürzer. for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51 Bytes. (aber ich habe mein 39-Byte-eins als eigene Antwort gepostet, weil es ein völlig anderer Ansatz ist: P).
TessellatingHeckler

1
@TessellatingHeckler Schöne Möglichkeit, die Schleife neu zu schreiben - danke! Ich habe die $cVerkettung in die Schleife verschoben, um ein Semikolon zu spielen. Jetzt um 50.
AdmBorkBork

2

JavaScript (ES6), 40 Byte

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

Verwendet die rekursive Funktion f, um Schleifen zu vermeiden. Die Suchmethode funktioniert genauso, indexOfaußer dass RegExp als Parameter verwendet wird, was für diese Herausforderung irrelevant ist.

Das Hinzufügen von a " "für den n=0Fall (Null ist in JS falsch) erzwingt das +Ausführen einer Zeichenfolgenverkettung anstelle des Hinzufügens und korrigiert die auf Null basierende Indizierung.



1

CJam, 11 Bytes

r_i),s\#Be|

Teste es hier.

Ich finde die Position von Nin der Zeichenfolge 01234...N, um die 1-basierte Indizierung zu berücksichtigen. Zum Schluss fixiere ich 0mit 11 durch logisches ODER.


1

Im Ernst, 13 Bytes

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

Übernimmt die Eingabe als Ganzzahl. Enthält nicht druckbare Dateien, also hexdump:

0c3bf739752b526024604de4a1

Probieren Sie es online aus

Erläuterung:

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


1

k4, 21 Bytes

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

Gleiches Algo wie alle anderen - verketten [1..10+x] als Zeichenfolge , nach x als Zeichenfolge suchen, in eine einseitige Indizierung konvertieren und den ersten Treffer zurückgeben.

Überprüfen der Testfälle:

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

1

Mathematica, 101 Bytes

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

1

Haskell , 82 73 55 Bytes

Aus dem Duplikat migriert

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

Probieren Sie es online!

Erläuterung

Zuerst definieren wir !. x!bschneidet bauf den ersten Auftritt von ab x. Dies geschieht, indem überprüft wird, ob bmit x( or$zipWith(==)x b) begonnen xwird, und ansonsten eine Zeichenfolge nach unten verschoben wird. Dann definieren wir unsere Hauptfunktion. Unsere Hauptfunktion ist eine punktfreie Funktion, die die Konstante ( show=<<[1..]) auf das erste Auftreten von abschneidet x. Dies dauert xals Zeichenfolge.



1

JavaScript (ES6), 50 39 38 Byte

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

Versuch es

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>





0

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

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

Probieren Sie es online!

Erläuterung

(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

0

Perl 6 / Rakudo 29 Bytes

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

Definiert eine Funktion mit einem Eingang ($ ^ a). Rufen Sie also an:

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

Anhängen $einer anonymen Variablen, die erhöht wird, $++bis die Eingabe $^agefunden wurde, und dann die Anzahl der Zeichen davor zählt. Das Erfordernis von mindestens 1 Zeichen, bevor es .+im regulären Ausdruck verwendet wird, schließt den Fall 0-> 0 sinnvollerweise aus


0

J, 30 Bytes

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

Könnte wahrscheinlich ein bisschen tiefer liegen, insbesondere bei der Verkettung der ersten n + 10 Ganzzahlen.

Erläuterung:

{.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

Beachten Sie, dass dies 0-indiziert ist. Beispiele:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.