Suchen Sie die serialisierte Ganzzahl

16

Aufgabe

Schreiben Sie ein Programm, das (als Eingabe) eine positive Ganzzahl annimmt. Es wird dann von 0abwärts gezählt, wobei jede Ganzzahl an a angehängt wird, Stringund nur dann fortgesetzt, wenn die Länge von Stringkleiner als der Wert der Eingabe ist.

Eine serialisierte Ganzzahl ist definiert als die vollständig gebildete Ganzzahl mit dem Maximalwert, der zu gehört String. Bei "vollständig gebildet" sollte die Ganzzahl keine fehlenden Ziffern haben (was auftreten würde, wenn die Längenbeschränkung von Stringerfüllt wird).

Die Ausgabe des Programms sollte die serialisierte Ganzzahl für die jeweilige positive Eingabe sein.


Regeln

  • Es ist Codegolf, also gewinnt die kürzeste Antwort (in Bytes)!
  • Der Eingang ist immer positiv.
  • Die Ausgabe muss eine Ganzzahl zur Basis 10 (dezimal) sein.
  • Das Programm muss 0-indiziert sein.

Beispiel Eingabe | Ausgabe

   5 | 4   (0 1 2 3 4              - Length of 5)
  11 | 9   (0 1 2 3 4 5 6 7 8 9 1  - Length of 11)
  12 | 10  (0 1 2 3 4 5 6 7 8 9 10 - Length of 12)
1024 | 377 (0 1 2 3 4 5 6 7 8 ...  - Length of 1024)

Anmerkungen)

Jacob G.
quelle
6
Vorgeschlagener Testfall:11
Rod
@ Rod Hinzugefügt es, hoffentlich macht es leichter zu verstehen!
Jacob G.
Das Hinzufügen von Anführungszeichen zu der Zeichenfolge in den Beispielen erleichtert möglicherweise das Verständnis, dass es sich um eine Zeichenfolge handelt.
Isaacg
Also die ersten N-1Ziffern der Champernowne-Konstante mit 0vorangestelltem?
Mego

Antworten:

8

JavaScript (ES6), 40 37 Bytes

f=(n,i=s='0')=>(s+=++i)[n]?i-1:f(n,i)
<input type=number min=1 value=1 oninput=o.textContent=f(this.value)><pre id=o>0

Bearbeiten: 3 Bytes mit Hilfe von @Arnauld gespeichert.

Neil
quelle
5

Japt , 13 Bytes

1n@P±X l >U}a

Online testen!

Erläuterung

1n@ P± X l >U}a
1nX{P+=X l >U}a
                   Implicit: U = input integer, P = empty string
  X{         }a    Return the first integer X in [0, 1, 2, ...] that returns a truthy value:
    P+=X             Append X to P.
         l >U        Return P.length > U.
                   This returns the first integer that can't fit into the U-char string.
1n                 Subtract 1 from the result.
                   Implicit: output result of last expression
ETHproductions
quelle
4

Haskell , 55 53 50 Bytes

(n#x)a|l<-a++show x=last$x-1:[n#l$x+1|length l<=n]

Probieren Sie es online!

Verwendung ist (1024#"") 0

H.PWiz
quelle
4

Jelly ,  11 10  9 Bytes

RD;\L€<⁸S

Eine monadische Verknüpfung, die eine positive Ganzzahl und eine nicht negative Ganzzahl zurückgibt.

Probieren Sie es online!

Wie?

Bearbeitung...

RD;\L€<⁸S - link: number n
R         - range -> [1,2,...10,11,...,n-1]
 D        - convert to decimal (vectorises) -> [[1],[2],...,[1,0],[1,1],...D(n-1)]
   \      - cumulative reduce by:
  ;       -   concatenation -> prefixes i.e.: [[1],[1,2],...,[1,2,...,1,0],[1,2,...,1,0,1,1],[1,2,...,1,0,1,1,...Flattened(D(n))]]
    L€    - length of €ach -> [1,2,3,...,11,13,...,length([1,2,...,1,0,1,1,...Flattened(D(n))])]
       ⁸  - chain's left argument, n
      <   - less than? (vectorises)
        S - sum (yields the number of prefixes that are less than or equal in length to n)
          -   Note: `0` is excluded from the range and all the prefixes, but including
          -         it would mean comparing to n+1 AND decrementing at the end (for a
          -         total cost of a byte)
Jonathan Allan
quelle
4

Pyth, 8 7 Bytes

tf<Q=+d

Probieren Sie es online aus. Testsuite.

PurkkaKoodari
quelle
Ich liebe es! Das Schneiden als Vergleich zu verwenden ist brillant.
isaacg
@isaacg Es ist eines der schönen Golf-Features von Pyth (on). Ich hatte die Idee, als ich Neils Antwort sah (indizieren statt schneiden, aber die gleiche Idee). < num seqwar auch sehr hilfreich.
PurkkaKoodari
3

Perl 6 , 36 Bytes

{(0...^{([~] 0..$^a).comb>$_})[*-1]}

Probieren Sie es online!

  • 0 ...^ {...}ist die Folge von Zahlen von null bis eins weniger als die Zahl, für die der Codeblock in geschweiften Klammern true zurückgibt. ( ...Ohne das Caret würde die erste Zahl zurückgegeben, für die der Block true zurückgab.)
  • [~] 0 .. $^aist die Verkettung von Zahlen von 0bis zur aktuellen Nummer $^a(der Parameter zum Codeblock).
  • .combist eine Liste aller Zeichen (Ziffern) in der verketteten Zeichenfolge. Als Zahl interpretiert, wird die Länge der Zeichenfolge ermittelt. .charswäre natürlicher hier zu verwenden, da es direkt auf die Länge der Zeichenfolge ausgewertet wird, aber der Name ist ein Zeichen länger.
  • $_ ist das Argument für die Funktion der obersten Ebene.
  • [*-1] Wählt das letzte Element der generierten Liste aus.
Sean
quelle
2

QBIC , 34 Bytes

{A=!p$~_lB+A|>:|_xp-1|\B=B+A]p=p+1

Erläuterung

{           DO infinitely
A=!p$       Set A$ to p cast to num
            Note that p starts out as 0.
~      >:   IF the input number is exceeded by
 _l   |     the length of
   B+A      A$ and B$ combined
_xp-1|      THEN QUIT, printing the last int successfully added to B$
            The _X operator quits, (possibly) printing something if followed by a-zA-Z
            _x is slightly different, it prints the expression between the operator _x and |
\B=B+A      ELSE add A$ to B$
]           END IF
p=p+1       Raise p, and rerun
steenbergh
quelle
2

J, 26 Bytes

(>i:1:)([:+/\[:>.10^.1+i.)

((>i:1:)([:+/\[:>.10^.1+i.))"0 ] 5 11 12 1024 2000 20000 100000 1000000
4 9 10 377 702 5276 22221 185184
Eelvex
quelle
1

R , 43 Bytes

n=scan();sum(cumsum(floor(log10(1:n))+1)<n)

Probieren Sie es online!

Undichte Nonne
quelle
0

WendyScript , 42 Bytes

<<f=>(x){<<n=""#i:0->x{n+=i?n.size>=x/>i}}

f(1024) // returns 377

Probieren Sie es online!

Ungolfed:

let f => (x) {
  let n = ""
  for i : 0->x { 
    n+=i
    if n.size >= x 
    ret i
  }
  ret
}
Felix Guo
quelle
0

Java 8, 64 Bytes

n->{int i=0;for(String t="0";;t+=++i)if(t.length()>n)return~-i;}

Oder kleine Alternativen mit gleicher Byteanzahl:

n->{int i=0;for(String t="";;t+=i++)if(t.length()>n)return i-2;}
n->{int i=-1;for(String t="";;t+=++i)if(t.length()>n)return~-i;}

Erläuterung:

Probieren Sie es hier aus.

n->{                  // Method with integer as both parameter and return-type
  int i=0;            //  Integer `i`, starting at 0
  for(String t="0";   //  String, starting at "0"
      ;               //  Loop indefinitely
       t+=++i)        //    After every iteration: append the String with `i+1`
                      //    by first increasing `i` by 1 with `++i`
    if(t.length()>n)  //   If the length of the String is larger than the input:
      return~-i;      //    Return `i-1`
                      //  End of loop (implicit / single-line body)
}                     // End of method
Kevin Cruijssen
quelle
0

Ruby, 44 Bytes

Inspiriert von Kevin Cruijssens JAVA-Antwort. -4 Bytes dank G B.

->n{i,t=0,'';t+="#{i+=1}"while t.size<n;i-1}
Anzeigename
quelle
(i + = 1; t + = i.to_s) ist dasselbe wie t + = "# {i + = 1}", nur 4 Bytes länger
GB
Und wenn Sie das tun, brauchen Sie die Variable t nicht mehr, Sie können die Größe von n subtrahieren und dann mit 0 vergleichen.
GB