Alles über Basic Binary


29

Bitte entschuldigen Sie den Punny-Titel.

Diese Frage ist von A Curious Property von 82000 inspiriert . Darin weist der Autor darauf hin, dass die Zahl 82000 in Basis 2, 3, 4 und 5 binär ist. Der Beitrag wirft dann die Frage auf, ob es eine Zahl gibt, die in Basis 2, 3, 4, 5 und 6 binär ist "? (Für Neugierige habe ich Werte bis zu 10 ^ 1,000,000 überprüft und bisher lautet die Antwort nein.)

Das brachte mich zum Nachdenken: In welchen Basen ist es bei einer gegebenen Zahl binär?

Unsere merkwürdige Zahl 82000 ist eigentlich binär in sechs Basen:

Base 2 = 10100000001010000
Base 3 = 11011111001
Base 4 = 110001100
Base 5 = 10111000
Base 81999 = 11
Base 82000 = 10

Nicht alle Zahlen haben binäre Basen, die sequentiell sind. Betrachten Sie die Zahl 83521. Sie ist in den Basen 2, 17, 289, 83520 und 83521 binär.

Ihre Herausforderung besteht darin, zu bestimmen und anzuzeigen, auf welcher Basis eine Zahl binär ist.

Regeln

  • Eine Zahl wird in einer gegebenen Basis als "binär" betrachtet, wenn ihre Darstellung in dieser Basis nur aus Nullen und Einsen besteht. 110110ist ein binärer Wert, während 12345nicht ist, A380Fist definitiv nicht.
  • Ihre Nummer wird in der Standardeingabe angegeben. Es wird ein ganzzahliger Wert zwischen 2 und 2 ^ 32-1 einschließlich sein und wird im Basis-10-Format bereitgestellt.
  • Zeigen Sie in aufsteigender Reihenfolge jede Basis an, die größer als eine ist, in der die Zahl binär ist. Jede Basis sollte in einer eigenen Zeile stehen. Wenn Sie den Binärwert in diese Basis einbeziehen (siehe Bonusbewertung unten), trennen Sie die Basis und den Binärwert durch ein Leerzeichen. Es wird nur die Ausgabe auf Standard-Out bewertet, Standardfehler und andere Quellen werden ignoriert.

Wertung

Ihre Punktzahl entspricht der Größe Ihres Programms in Byte. Je niedriger die Punktzahl, desto besser.

Bonus :
Wenn Ihr Programm auch die Binärwerte in den gefundenen Basen ausgibt, multiplizieren Sie Ihre Punktzahl mit 0,75.
Ihr angezeigter Binärwert sollte keine zusätzliche Interpunktion, keine fremden Nullen, keinen Dezimalpunkt, nur Nullen und Einsen enthalten.

Beispiele

Eingang:

82000

Output (erhält Bonus):

2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10

Eingang:

1234321

Output (kein Bonus):

2
1111
1234320
1234321

Kann die Eingabe mit einem Zeilenumbruch enden?
LegionMammal978

@ LegionMammal978 - Uhhh ... sicher? Meine Absicht war, dass Sie in der Lage sein sollten, die Eingabenummer mit einem einfachen fgets, readline oder ähnlichem zu erhalten.
Mr. Llama

1
Im allgemeinen nist immer zumindest in binären Basen 1(nicht gezählt), 2, n-1, und n.
mbomb007

1
Wenn Sie sagen, "Ihre Nummer wird bei der Standardeingabe bereitgestellt", meinen Sie nur STDIN, oder können wir die Nummer alternativ als Funktionsargument akzeptieren, wie es für die Site Standard ist?
Alex A.

Soll die Binärdarstellung (im Bonusteil) ein bestimmtes Format haben? Wäre [1, 0, 1, 1, 0]besonders ok, oder müssen die Nummern gerne zusammengefügt werden 10110?
Jakube,

Antworten:


14

Pyth, 14 13

jbf!-jQTU2tSQ

Vielen Dank an Jakube für den Hinweis auf die neue SFunktion.

Probieren Sie es hier aus.

Die Online-Version ist zu langsam 1234321 . Dies konvertiert einfach die Eingabe zu jeder Basis von 2 in sich selbst und verwirft die Ergebnisse, die andere Werte als 0 und 1 enthalten.

Erläuterung:

                           : Q=eval(input) (implicit)
jb                         : join on newlines the list...
  f!                       : filter away nonempty values (impliticly named T)
    -jQTU2                 : sewtise difference of number converted to base and range(2)
     jQT                   : convert Q to base T
        U2                 : range(2)
          tSQ              : over the range [2 Q+1)

Darüber hinaus ist dies ein ( nicht gut golfed jetzt gut golfed, wieder dank Jakube) Bonus - Version (20 * .75 = 15):

VQI!-JjQK+2NU2pdKjkJ

Probieren Sie es hier aus


Pyth wurde gerade aktualisiert. So können Sie auf aktuelle Lösungen verlinken.
Jakube,

Und hier ist eine 20 * 0,75 = 15 Lösung: VQI!-JjQK+2NU2pdKjkJManchmal ist funktionale Programmierung nicht der beste Ansatz.
Jakube,

10

Julia, 72-70 Bytes

Es ist eigentlich länger mit dem Bonus, also kein Bonus hier.

n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end

Dies liest eine Zeile aus STDIN, konvertiert sie in eine Ganzzahl und gibt das Ergebnis aus. Obwohl es sich um eine Brute-Force-Methode handelt, dauerte die Eingabe 1234321 für mich weniger als 1 Sekunde.

Ungolfed + Erklärung:

# Read n from STDIN and convert to integer
n = int(readline())

# For every potential base from 2 to n
for j = 2:n
    # If all digits of n in base j are 0 or 1
    if all(i -> i0:1, digits(n, j))
        # Print the base on its own line
        println(j)
    end
end

Beispiele:

julia> n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end
1234321
2
1111
1234320
1234321

julia> n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end
82000
2
3
4
5
81999
82000

HINWEIS : Wenn die Eingabe nicht von STDIN, sondern von einem Funktionsargument übernommen werden kann (bis zur Bestätigung durch das OP), beträgt die Lösung 55 Byte.



7

Mathematica, 59 Bytes

Print/@Select[1+Range[n=Input[]],Max@IntegerDigits[n,#]<2&]

Pfui... IntegerDigits D:

Es gibt nicht wirklich viel zu erklären über den Code ... 12 Bytes werden durch die Anforderung zur Verwendung von STDIN und STDOUT verschwendet.

Ich glaube nicht, dass ich den Bonus beanspruchen kann. Das Beste, was ich habe, sind 84 Bytes (was eine Punktzahl über 60 ergibt):

Print@@@Select[{b=#+1," ",##&@@n~IntegerDigits~b}&/@Range[n=Input[]],Max@##3<2&@@#&]

7

Python 2, 88 86 80

Ziemlich einfach, kein Bonus. Python ist nett und nachsichtig mit globalen Variablen.

N=input();g=lambda n:n<1or(n%b<2)*g(n/b)
for b in range(2,N+1):
 if g(N):print b

Das beste, was ich für den Bonus bekommen habe, ist 118 * .75 = 87.75 :

N=input();g=lambda n:0**n*" "or" "*(n%b<2)and(g(n/b)+`n%b`)*(g(n/b)>'')
for b in range(2,N+1):
 if g(N):print`b`+g(N)

Schöne Lösung, schlagen Sie mich mit viel kürzerem Code.
Kade,

Es wäre kürzer, einfach g(N)statt zu tun n=N.
Feersum

@feersum Oh ja (es war früher so, g(N,b)dass das Komma die beiden gleich machte), aber was meinst du damit, dass ich keine Variable für N brauche?
KSab,

@KSab Ich habe diesen zweiten Teil gelöscht. macht es nichts aus.
Feersum

Ich kann mich irren, aber konnten Sie den Bonus nicht erhalten, indem Sie einfach g(n/b)auf " (g(n/b)+'n%b')Wo steht ein Backtick" umsteigen?
Feersum

4

Python 2, 90 * 0,75 = 67,5

n=input();b=1
while b<n:
 b+=1;s="";c=k=n
 while k:s=`k%b`+s;c*=k%b<2;k/=b
 if c:print b,s

Ziemlich einfacher iterativer Ansatz.

Ohne den Bonus sind dies 73 Bytes:

n=input();b=1
while b<n:
 b+=1;c=k=n
 while k:c*=k%b<2;k/=b
 if c:print b

4

SQL (PostgreSQL), 247,5 255 230,25 (307 * .75)

Da SQL für diese Art von Herausforderungen bekannt ist, dachte ich mir, ich sollte eine besser zusammenstellen :) Der Bonus hat sich für diese wirklich gelohnt.
Es sollte den Spezifikationen entsprechen, aber ich habe keine einfache Möglichkeit, COPY I FROM STDIN zu testen . Feste Reihenfolge
bearbeiten . Die Art und Weise, wie Spalte R behandelt wird, wurde geändert, um ein Array zu verwenden.

CREATE TABLE IF NOT EXISTS I(I INT);TRUNCATE TABLE I;COPY I FROM STDIN;WITH RECURSIVE R AS(SELECT n,I/n I,ARRAY[I%n] R FROM generate_series(2,(SELECT I FROM I))g(n),(SELECT I FROM I)I(I)UNION ALL SELECT n,I/n,I%n||R FROM R WHERE I>0)SELECT n||' '||array_to_string(R,'')FROM R WHERE 2>ALL(R)and i=0ORDER BY n

Als Test habe ich gerade Einsätze in die ITabelle verwendet. Testlauf erweitert und kommentiert.

-- Create the table to accept the input from the copy command
CREATE TABLE IF NOT EXISTS I(I INT);
-- Make sure that it is empty
TRUNCATE TABLE I;
-- Popoulate it with a value from STDIN
--COPY I FROM STDIN;
INSERT INTO I VALUES(82000); -- Testing
--Using a recursive CTE query
WITH RECURSIVE R AS (
    -- Recursive anchor
    SELECT n,                -- base for the row
       I/n I,                -- integer division
       ARRAY[I%n] R   -- put mod value in an array
    FROM generate_series(2,(SELECT I FROM I))g(n), -- series for the bases
         (SELECT I FROM I)I(I) -- Cross joined with I,  saves a few characters
    UNION ALL 
    -- for each row from r recursively repeat the division and mod until i is 0
    SELECT n,
        I/n,
        I%n||R -- Append mod to beginning of the array
    FROM R WHERE I>0
    )
-- return from r where i=0 and r has 1's and 0's only
SELECT n||' '||array_to_string(R,'')
FROM R 
WHERE 2 > ALL(R)and i=0
ORDER BY n -- Ensure correct order

2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10


So nah! Die Ausgabebasen müssen in aufsteigender Reihenfolge sein. +1 für die Verwendung einer unkonventionellen Sprache.
Mr. Llama

@ Mr.Llama hat es mit einem behoben order by. Nun, um zu sehen, ob ich diese Charaktere zurückbekomme
MickyT

3

Haskell 109 * 0,75 = 81,75 Bytes

0#x=[]
n#x=n`mod`x:div n x#x 
f n=[show x++' ':(n#x>>=show)|x<-[2..n+1],all(<2)$n#x]
p=interact$unlines.f.read

Anwendungsbeispiel (Anmerkung: Binärwerte sind LSB zuerst):

p 82000

2 00001010000000101
3 10011111011
4 001100011
5 00011101
81999 11
82000 01

Ohne Ein- / Ausgabeeinschränkungen, dh Eingabe über Funktionsargument, Ausgabe im nativen Format über REPL):

Haskell, 67 × 0,75 = 50,25 Bytes

0#x=[]
n#x=n`mod`x:div n x#x
f n=[(x,n#x)|x<-[2..n+1],all(<2)$n#x]

Gibt eine Liste von (Basis-, Wert-) Paaren zurück. Die Werte lauten zuerst lsb, z. B. (Zeilenumbrüche / Leerzeichen zur besseren Anzeige hinzugefügt):

 f 82000
 [ (2,[0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1]),
   (3,[1,0,0,1,1,1,1,1,0,1,1]),
   (4,[0,0,1,1,0,0,0,1,1]),
   (5,[0,0,0,1,1,1,0,1]),
   (81999,[1,1]),
   (82000,[0,1]) ] 

2

R 111

Wahrscheinlich viel Raum, um dies im Moment zu verbessern

i=scan();b=2:i;R=i%%b;I=rep(i,i-1);while(any(I<-I%/%b))R=cbind(I%%b,R);for(x in b)if(all(R[x-1,]<2))cat(x,'\n')

Läuft mit Warnungen

> i=scan();b=2:i;R=i%%b;I=rep(i,i-1);while(any(I<-I%/%b))R=cbind(I%%b,R);for(x in b)if(all(R[x-1,]<2))cat(x,'\n')
1: 82000
2: 
Read 1 item
There were 17 warnings (use warnings() to see them)
2 
3 
4 
5 
81999 
82000
>

@AlexA. Warnungen, die durch das Erzwingen I%/%beiner logischen Verknüpfung in der any()Klausel verursacht werden. `
MickyT

2

Java, 181 155,25 (207 * .75) 151,5 (202 * .75) Bytes

class I{public static void main(String[]a){a:for(long b=new java.util.Scanner(System.in).nextLong(),c,d=1;d++<b;){String e="";for(c=b;c>0;e=c%d+e,c/=d)if(c%d>1)continue a;System.out.println(d+" "+e);}}}

Mit Erklärung erweitert:

class I {
    public static void main(String[]a){
        a:for(long b=new java.util.Scanner(System.in).nextLong(),c,d=1; //b = input(), d = base
              d++<b;) {                                           //For all bases in range(2,b+1)
            String e="";
            for(c = b;c > 0; e = c % d + e,c /= d)                //Test all digits of base-d of b
                           //e = c % d + e                        //Append digits to string
                if (c % d > 1)                                    //Reject base if the digit is greater than 1
                    continue a;
            System.out.println(d+" "+e);                          //Print base and digits.
        }
    }
}

Original (ohne Bonus):

class I{public static void main(String[]a){long b=new java.util.Scanner(System.in).nextLong(),c,d=1;a:for(;d++<b;){c=b;while(c>0){if(c%d>1)continue a;c/=d;}System.out.println(d);}}}

3,75 Bytes dank Ypnypn :)


2

R 94 83 79

n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")

Verwendung:

> n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")
1: 82000
2: 
Read 1 item
2
3
4
5
81999
82000
> n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")
1: 1234321
2: 
Read 1 item
2
1111
1234320
1234321

Der Kern der Funktion ist !sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n}), dass für jede Basis x von 2 bis n der Quotient n / x beibehalten wird, solange der Rest entweder 0 oder 1 ist. Anschließend wird das Ergebnis ausgegeben (was 0 ist, wenn alle Reste entweder 1 oder 1 waren 0) und negiert es (0 negiert auf TRUE, alles andere negiert auf FALSE). Aufgrund des Funktionsumfangs muss für n keine Dummy-Variable erstellt werden. Der resultierende Vektor von Booleschen Werten wird dann zum Indizieren verwendet 2:nund gibt daher nur die Basen aus, für die er gearbeitet hat.


1

TI-Basic, 45 Bytes

Input N
For(B,2,N
If prod(seq(BfPart(iPart(N/B^X)/B),X,0,log(N)/log(B))<2
Disp B
End

Erläuterung

  • Eingang N
  • Für jedes B von 2 bis N
    • Wenn N nur 0 und 1 in der Basis B ist
      • Anzeige B
  • Schleife beenden

Der komplizierte Teil

Die zweite Zeile funktioniert wie folgt:

  • Für jedes X von 0 bis log B N
  • B × fPart (iPart (N / B X ) / B) ist die N-te Ziffer in Basis B, die rückwärts zählt
  • Betrachten Sie dies als eine Liste
  • Wenn die Ziffer für jedes Element kleiner als 2 ist, ergibt sich 1 (wahr), andernfalls 0 (falsch).
  • Nehmen Sie das Produkt: 1, wenn alle Elemente 1 sind

Hinweis

Das Programm wird deutlich schneller ausgeführt, wenn )am Ende der zweiten Zeile eine schließende Klammer steht. Sehen Sie hier , um mehr über diese.


1

TI-BASIC, 31 29

For(B,2,Ans
If 2>round(Bmax(fPart(Ans/B^randIntNoRep(1,32
Disp B
End

Dies ist wahrscheinlich optimal für TI-BASIC.

Erläuterung:

randIntNoRep(1,32)Gibt eine zufällige Permutation der Zahlen von 1 bis 32 zurück. 32 Elemente reichen aus, da die kleinstmögliche Basis 2 und die größte Zahl 2 ^ 32-1 ist. B^randIntNoRep(1,31)erhöht diese Liste auf die B-te Potenz, was dazu führt, dass die Liste alle von enthältB^1,B^2,...,B^32 (in einer bestimmten Reihenfolge) enthält.

Dann wird die Eingabe (in der Answer-Variablen, die in das Formular eingegeben wird [number]:[program name]) durch diese Zahl geteilt. Wenn Ihre Eingabe 42 ist und die Basis 2 ist, ist das Ergebnis die Liste 21,10.5,5.25,...,42/32,42/64,[lots of numbers less than 1/2], wiederum in einer bestimmten Reihenfolge.

Wenn Sie den Bruchteil nehmen und die Zahl mit Ihrer Basis multiplizieren, erhalten Sie die Ziffer an dieser Position in der Basis-b-Darstellung. Wenn alle Ziffern kleiner als 2 sind, ist die größte Ziffer kleiner als 2.

Wie Ypnypn sagte, eine schließende Klammer auf dem For Anweisung aufgrund eines Parser-Fehlers beschleunigt.

31-> 31: Ein Byte gespeichert, aber Rundungsfehler behoben, durch die das Byte erneut hinzugefügt wurde.

31-> 29: Zwei Bytes mit RandIntNoRep()anstelle von gespeichert cumSum(binomcdf()).


Hat TI-BASIC eine Sequenzfunktion?
Mr. Llama

Ja, der Befehl lautet seq(expression, variable, start, end[, step]). Wenn kein Schritt angegeben wird, wird standardmäßig der Wert 1 verwendet. Der Wert cumSum(binomcdf(31,0beträgt jedoch 8 Byte, während der seq(X,X,1,32Wert 9 Byte beträgt.
Lirtosiast

Ah, das erklärt es. Ich bin nicht mit Scoring-Arbeiten in TI-Basic vertraut.
Mr. Llama

1

Gelee , 9 Bytes

³bṀỊµÐfḊY

Probieren Sie es online!

Erledigt neben Caird Coinheringaahing im Chat .

Wie es funktioniert

³bṀỊµṀỊfḊY Volles Programm.

     Ðf Filtern Sie den implizit generierten Bereich [1, Eingabe].
    µ Startet eine neue monadische Kette.
³b Wandelt die Eingabe als Liste in die Basis der aktuellen Nummer um.
  Ṁ Maximum.
   Ị unbedeutend. Prüft, ob abs (Z) ≤ 1 ist.
       Ḋ Dequeue; Entfernt das erste Element der Liste (um Basis 1 zu löschen).
        Y Mit Zeilenumbrüchen verbinden.

0

Javascript, ES6, 118 * .75 = 88,5 110 * .75 = 82,5

f=x=>{res={};for(b=2;b<=x;++b)if(!+(res[b]=(c=x=>x%b<2?x?c(x/b|0)+""+x%b:"":"*")(x)))delete res[b];return res}

Vorherige Version:

f=x=>{res={};for(q=2;q<=x;++q)if(!+(res[q]=(c=(x,b)=>x%b<2?x?c(x/b|0,b)+""+x%b:"":"*")(x,q)))delete res[q];return res}

Prüfen:

f(82000)
Object { 2: "10100000001010000", 3: "11011111001", 4: "110001100", 5: "10111000", 81999: "11", 82000: "10" }

Hier haben Sie keine Eingabe und keine Ausgabe.
Edc65

0

JavaScript ( ES6 ) 65

68 Byte für eine Funktion mit Parameter- und Konsolenausgabe.

f=n=>{s=n=>n%b>1||b<n&&s(n/b|0);for(b=1;b++<n;)s(n)||console.log(b)}

65 Bytes mit E / A über Popup

n=prompt(s=n=>n%b>1||b<n&&s(n/b|0));for(b=1;b++<n;)s(n)||alert(b)

Inanspruchnahme des Bonus: 88 * 0,75 => 66

n=prompt(s=n=>n%b>1?9:(b<=n?s(n/b|0):'')+n%b);for(b=1;b++<n;)s(n)<'9'&&alert(b+' '+s(n))

0

Mathematica, 76 · 0,75 = 57

n=Input[];G=#~IntegerDigits~b&;If[Max@G@n<2,Print[b," ",Row@G@n]]~Do~{b,2,n}

Anfangs vergaß ich die Eingabeanforderungen ... Glücklicherweise fügten diese nicht zu viel Extra hinzu.



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.