Suchen Sie die längste Wiederholungszahl


17

Ihre Aufgabe ist es, eine positive Zahl als Eingabe n zu nehmen und die Länge der längsten Wiederholungsstellendarstellung von n in einer beliebigen Basis auszugeben . Zum Beispiel kann 7 wie folgt dargestellt werden

111_2
21_3
13_4
12_5
11_6
10_7
7_8

Die Wiederholungsziffern sind 111_2und 11_6, 111_2ist länger, also ist unsere Antwort 3.

Dies ist eine Frage, daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.

Testfälle

1   -> 1
2   -> 1
3   -> 2
4   -> 2
5   -> 2
6   -> 2
7   -> 3
8   -> 2
9   -> 2
10  -> 2
11  -> 2
26 -> 3
63  -> 6
1023-> 10

Beispielimplementierung

Hier ist eine Implementierung in Haskell, mit der weitere Testfälle generiert werden können.

f 0 y=[]
f x y=f(div x y)y++[mod x y]
s x=all(==x!!0)x
g x=maximum$map(length.f x)$filter(s.f x)[2..x+1]

Probieren Sie es online!


1
Asuming base > 1?
H.PWiz

2
Sie können Testfälle 63-> 6 und 1023-> 10 hinzufügen, wenn Sie
möchten

1
@ WheatWizard Ich denke, 26 macht es zum Beispiel, es ist 222in der Basis 3.
xnor

1
Können Basen über 10 gehen? Wenn ja, sollten wir für Basen> 10 die Zeichen az einfügen? Was ist mit Basen> 36?
Rick Hitchcock

6
@ RickHitchcock Bases können beliebig hoch gehen. Da Sie in keiner anderen Basis als 10 Zahlen ausgeben müssen, ist es mir egal, wie Sie andere Basen darstellen, aber sie sollten für Basen größer als 36 funktionieren.
Weizen-Assistent

Antworten:


9

Gelee , 9 Bytes

b‘Ḋ$EÐfZL

Ein monadischer Link, der Nummern akzeptiert und zurückgibt

Probieren Sie es online! oder sehen Sie sich eine Testsuite an (Eingaben eins bis einschließlich 32).

Wie?

b‘Ḋ$EÐfZL - Link: number, n
   $      - last two links as a monad:
 ‘        -   increment = n+1
  Ḋ       -   dequeue (with implicit range build) = [2,3,4,...,n+1]
b         - convert to those bases
     Ðf   - filter keep if:
    E     -   all elements are equal
       Z  - transpose
        L - length (note:  length of the transpose of a list of lists is the length of the
          -                longest item in the original list, but shorter than L€Ṁ)

... oder vielleicht hätte ich das tun sollen:

bḊEÐfZLo1

Für die Lo1z.


Also ... ich bin nicht der einzige, der herausgefunden hat, dass ZLes kürzer ist als L€Ṁ...
Erik der Outgolfer

8

JavaScript (ES6), 62 Byte

f=(n,b=2,l=0,d=n)=>d?n%b<1|n%b-d%b?f(n,b+1):f(n,b,l+1,d/b|0):l
<input oninput=o.textContent=f(this.value)><pre id=o>


2
Ich liebe den unnötig golfenen HTML-Test
Jakob

6

Haskell , 86 81 79 Bytes

2 Bytes gespart dank Laikoni

0!y=[]
x!y=mod x y:div x y!y
length.head.filter(all=<<(==).head).(<$>[2..]).(!)

Probieren Sie es online!

Da dies ein wenig nachgelassen hat, ist hier mein Ansatz. Es ist eine Golfversion des Beispielcodes, den ich für die Frage erstellt habe. Ich denke, es kann definitiv kürzer sein. Ich dachte nur, ich würde es da rausbringen.


Pointfree ist etwas kürzer: length.head.filter(all=<<(==).head).(<$>[2..]).(!).
Laikoni

@Laikoni Danke! Aus irgendeinem Grund war ich nicht in der Lage herauszufinden, wie ich es in eine punktfreie Notation bringen kann.
Weizen-Assistent

Ich kann pointfree.io empfehlen, das auf dem point free converter von lambdabot basiert.
Laikoni

@Laikoni Ich benutze pointfree.io ziemlich viel. Ich muss es hier nicht ausprobiert haben. Normalerweise bekomme ich aber ziemlich gute Ergebnisse.
Weizen-Zauberer

5

Schale , 13 11 Bytes

-2 Bytes dank Zgarb

L←fȯ¬tuMBtN

Probieren Sie es online!


mmkann sein M, und ṠoΛ=←kann sein ȯ¬tu. Es gibt noch keine integrierte Funktion, um zu überprüfen, ob alle Elemente einer Liste gleich sind ...
Zgarb

M ist noch nicht einmal auf der Wiki :(
H.PWiz

ΓoΛ=funktioniert auch als vier Bytes
H.PWiz

1
Ups, Msollte in den Dokumenten sein, da wir es für eine Weile gehabt haben. Ich sollte das reparieren. Aber es ist im Grunde das Doppelte von .
Zgarb





1

Mathematica, 58 Bytes

FirstCase[#~IntegerDigits~Range[#+1],l:{a_ ..}:>Tr[1^l]]&

Löst einen Fehler aus (da base-1 keine gültige Basis ist), der aber ignoriert werden kann.

Natürlich ist es in Ordnung, die Länge des ersten repdigit ( FirstCase) zu nehmen, da Zahlen in niedrigeren Basen nicht kürzer sein können als in höheren Basen.


1

CJam (17 Bytes)

{_,2>3+fb{)-!}=,}

Online-Testsuite . Dies ist ein anonymer Block (Funktion), der eine Ganzzahl auf dem Stapel annimmt und eine Ganzzahl auf dem Stapel belässt.

Arbeitet mit brachialer Gewalt und dient 3als Ausweichbasis für Sonderfälle (Eingabe 1oder 2).


1

Perl 6 , 49 Bytes

{+first {[==] $_},map {[.polymod($^b xx*)]},2..*}

Probieren Sie es online!

Erläuterung

{                                               }  # A lambda.
                  map {                   },2..*   # For each base from 2 to infinity...
                        .polymod($^b xx*)          #   represent the input in that base,
                       [                 ]         #   and store it as an array.
  first {[==] $_},                                 # Get the first array whose elements
                                                   # are all the same number.
 +                                                 # Return the length of that array.

Die Polymod- Methode ist eine Verallgemeinerung von Python divmod: Sie führt eine wiederholte Ganzzahldivision unter Verwendung einer gegebenen Liste von Divisoren durch und gibt die Zwischenreste zurück.
Es kann verwendet werden, um eine Menge in mehrere Einheiten zu zerlegen:

my ($sec, $min, $hrs, $days, $weeks) = $seconds.polymod(60, 60, 24, 7);

Stoppt, polymodwenn der Quotient Null erreicht , wenn eine träge Sequenz als Liste der Teiler übergeben wird . Indem Sie ihm eine unendliche Wiederholung der gleichen Zahl geben, zerlegen Sie die Eingabe in Ziffern dieser Basis:

my @digits-in-base-37 = $number.polymod(37 xx *);

Ich benutze dies hier, weil es im Gegensatz zur stringbasierten .baseMethode, die nur bis zur Basis 36 unterstützt, beliebig hohe Basen erlaubt .


Sie können die []Umgebung entfernen, polymodindem Sie $_auf@_
Jo King

1

TI-BASIC, 37 Bytes

Input N
For(B,2,2N
int(log(NB)/log(B
If fPart(N(B-1)/(B^Ans-1
End

Fordert zur Eingabe von N auf und gibt die Ausgabe in Ans zurück.

Erläuterung

Zur Übersicht berechnet es für jede mögliche Basis B nacheinander zuerst die Anzahl der Stellen von N, wenn diese in der Basis B dargestellt sind, und prüft dann, ob N durch den Wert teilbar ist, der durch die gleiche Anzahl von 1 Stellen in der Basis B dargestellt wird.

Input N            Ask the user for the value of N.
For(B,2,2N         Loop from base 2 to 2N. We are guaranteed a solution
                   at base N+1, and this suffices since N is at least 1.
int(log(NB)/log(B  Calculate the number of digits of N in base B,
                   placing the result in Ans.
                   This is equivalent to floor(log_B(N))+1.
          (B-1)/(B^Ans-1   The value represented by Ans consecutive
                           1-digits in base B, inverted.
If fpart(N         Check whether N is divisible by the value with Ans
                   consecutive 1-digits, by multiplying it by the inverse
                   and checking its fractional part.
                   Skips over the End if it was divisible.
End                Continue the For loop, only if it was not divisible.
                   The number of digits of N in base B is still in Ans.


0

Java 8, 111 Bytes

n->{int r=0,i=1,l;for(String t;++i<n+2;r=(l=t.length())>r&t.matches("(.)\\1*")?l:r)t=n.toString(n,i);return r;}

Die Byteanzahl von 111 ist ebenfalls eine Wiederholungsziffer. ;)

Erläuterung:

Probieren Sie es hier aus.

n->{                            // Method with Integer as parameter return-type
  int r=0,                      //  Result-integer
      i=1,                      //  Index-integer
      l;                        //  Length-integer
  for(String t;                 //  Temp-String
      ++i<n+2;                  //  Loop from 2 to `n+2` (exclusive)
      r=                        //    After every iteration, change `r` to:
        (l=t.length())>r        //     If the length of `t` is larger than the current `r`
        &t.matches("(.)\\1*")?  //     and the current `t` is a rep-digit:
         l                      //      Change `r` to `l` (the length of the rep-digit)
        :                       //     Else:
         r)                     //      Leave `r` as is
    t=n.toString(n,i);          //   Set String representation of `n` in base-`i` to `t`
                                //  End of loop (implicit / single-line body)
  return r;                     //  Return the result-integer
}                               // End of method

Lambdas wurden in Java 8 eingeführt.
Jakob

1
@Jakob Woops .. Ich bin mir nicht sicher, warum ich 7 eingegeben habe. Entweder, weil ich kürzlich auf meine Java 7-Antwort zurückgesehen habe, oder nur auf einen Tippfehler. Danke für die Korrektur, sollte natürlich 8 gewesen sein ...> .>
Kevin Cruijssen

0

Java 8, 79 Bytes

Ein Lambda von Integerbis Integer.

n->{int m,b=2,l;for(;;b++){for(m=n,l=0;m>0&m%b==n%b;l++)m/=b;if(m<1)return l;}}

Ungolfed Lambda

n -> {
    int m, b = 2, l;
    for (; ; b++) {
        for (m = n, l = 0; m > 0 & m % b == n % b; l++)
            m /= b;
        if (m < 1)
            return l;
    }
}

Überprüft die Radices in aufsteigender Reihenfolge von 2 bis zur Ermittlung eines stelligen Radix. Beruht auf der Tatsache, dass der kleinste solcher Radix einer Darstellung mit den meisten Ziffern entspricht.

mist eine Kopie der Eingabe, bist die Basis und list die Anzahl der überprüften Ziffern (und letztendlich die Länge der Basisdarstellung b).


0

Burlesque, 24 Bytes

(siehe richtige Lösung unten)

J2jr@jbcz[{dgL[}m^>]

In Aktion sehen .

J2jr@ -- boiler plate to build a list from 2..N
jbcz[ -- zip in N
{dgL[}m^ -- calculate base n of everything and compute length
>]    -- find the maximum.

Zumindest, wenn meine Intuition stimmt, dass eine Repräsentation mit Wiederholungsziffern immer die längste ist? Sonst ähm ...

J2jr@jbcz[{dg}m^:sm)L[>]

:sm -- filter for "all elements are the same"

1
Die Basis-2-Darstellung ist immer am längsten. Versuchen Sie es beispielsweise mit Eingabe 26, und Sie werden feststellen, dass Ihre erste Lösung falsch ist
Leo,
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.