Rückwärts und quadratisch


19

In dieser Herausforderung berechnen Sie Zahlen aus einer merkwürdigen Folge.

Ihre Eingabe ist eine einzelne dezimale nichtnegative Ganzzahl. Kehren Sie die Bits in dieser Ganzzahl um und quadrieren Sie die Zahl, um die gewünschte Ausgabe zu erhalten.

Beim Umkehren der Bits dürfen Sie keine führenden Nullen in der Eingabe verwenden. Beispielsweise:

26 (base 10) = 11010 (base 2) -> 01011 (base 2) = 11 -> 11*11 = 121

Die ersten 25 Ein- / Ausgänge dieser Sequenz:

0: 0
1: 1
2: 1
3: 9
4: 1
5: 25
6: 9
7: 49
8: 1
9: 81
10: 25
11: 169
12: 9
13: 121
14: 49
15: 225
16: 1
17: 289
18: 81
19: 625
20: 25
21: 441
22: 169
23: 841
24: 9

Ihre Lösung sollte für Ganzzahlen beliebiger Größe funktionieren. Wenn in Ihrer Sprache keine praktische Methode zur Verwendung vorhanden ist, implementieren Sie Ihre Antwort so, als ob dies der Fall wäre. Sie werden dann entschuldigt, wenn Ihre Antwort für große Zahlen bricht. Verwenden Sie jedoch keine Tricks / Grenzen, die nur für eine begrenzte Domäne funktionieren (z. B. eine Nachschlagetabelle).


Ihre Punktzahl ist die Anzahl der Bytes des Quellcodes.

-50% Bonus, wenn Sie die Zahl nie in eine Binärzahl umwandeln. Dies ist nicht auf integrierte Funktionen beschränkt. Wenn Sie die Zahl Bit für Bit durchlaufen (entweder durch Verschieben oder Maskieren oder eine andere Methode), wird dies ebenfalls als Konvertierung gewertet. Ich weiß nicht, ob dies tatsächlich möglich ist, aber es gibt einen Anreiz, ein Muster in der Sequenz zu erkennen.

Kleinste Punktzahl gewinnt.



1
Wenn der Code eine Methode aufruft, die eine Zeichenfolge ergibt, die die Bits darstellt, ist diese für den Bonus berechtigt?
Brad Gilbert b2gills

2
@ BradGilbertb2gills Nr.
Orlp

Ich nehme an, dass die Verwendung von Mathematik zum Extrahieren der Bits auch als binäre Konvertierung zählt.
Lirtosiast

Antworten:


5

Par , 5 Bytes

✶Σ⌐Σ²

Das ist read-binary-reverse-binary-square.



@ CᴏɴᴏʀO'Bʀɪᴇɴ Dieser Bytezähler geht von UTF-8 aus. Ich glaube, Mauris verwendet eine Codierung, die nicht UTF-8 ist, um seine Bytes zu zählen, aber er hat diese Codierung nicht angegeben.
Orlp

Par verwendet eine eigene seltsame Codierung. Seine kanonische Darstellung ist eine bestimmte Teilmenge von <256 Unicode-Zeichen. Ich bin mir nicht sicher, ob es einen Namen hat. Ich sollte warten, bis @Ypnypn hereinkommt.
Lynn

Oh, ich verstehe. @orlp
Conor O'Brien

Möglicherweise hat es ein eigenes SBCS?
HyperNeutrino

19

Mathematica, 42 21 Bytes

Dank an Alephalpha für die Halbierung der Punktzahl.

#~IntegerReverse~2^2&

Der eigentliche Grund, warum ich dies in Mathematica getan habe, war, dass ich mir eine Handlung ansehen wollte ... es sieht sicher lustig aus:

enter image description here


11
Aber ich mag die Partitur! XD
Conor O'Brien

1
Warum hat diese Antwort mehr Stimmen als die Antwort mit den wenigsten Bytes? o_O
Seadrus

27
@Seadrus Du weißt was sie sagen. Ein Bild ist 7 Bytes wert.
Martin Ender

5
So ist Ihre Punktzahl 42 + 7 = 49 Bytes: P
Seadrus

3
Entschuldigung, @ CᴏɴᴏʀO'Bʀɪᴇɴ.
Martin Ender

8

Minkolang 0,14 , 43 Bytes

Vielen Dank an Mego für die Inspiration.

n1{d1`,2$3*&$z2zd2%-2l$Md1%-;z2%*z2:{+}2;N.

Testen Sie den Code hier und überprüfen Sie alle Testfälle hier .

Erläuterung

Dies verwendet diese Wiederholungsrelation:

a(0) = 0
a(1) = 1
a(2n) = a(n)
a(2n+1) = a(n) + 2^(floor(log_2(n))+1)

Wenn nist der Eingang, dann a(n)ist die resultierende Zahl, nachdem seine Binärsequenz gekippt worden ist. 0 und 1 sind offensichtlich. Man a(2n) = a(n)bedenke nämlich, dass x0(wo xeine beliebige Folge von Binärziffern ist) gespiegelt ist 0x, was dasselbe ist wie x. Denn a(2n+1)die Argumentation ist etwas komplizierter. x1gespiegelt ist 1x, was x + 2^kfür manche gleich ist k. Dies kist eine mehr als die Anzahl der Stellen in x, was ist floor(log_2(n))+1. Die vollständige Formel folgt, mit der Ausnahme, dass sie ein wenig geändert wurde. Das ist, was ich eigentlich codiere:

a(0) = 0
a(1) = 1
a(n) = a(n//2) + (n%2) * 2^(floor(log_2(n - n%2)))

Als Mego und ich arbeitete, im Chat aus floor(n/2) = (n - n%2)/2. So ist log_2(floor(n/2))+1 = log_2(n - n%2). Wenn Sie mit multiplizieren, werden (n%2)sowohl die ungeraden als auch die geraden Teile zu einem Ausdruck zusammengefasst.

Schließlich, ohne weitere Umstände, hier der Code, erklärt.

n                                              Take number from input
 1{                                            Start recursion that takes only one element
   d1`,                                        1 if top of stack 0 or 1, 0 otherwise
       2$3*                                    26
           &                                   Jump if top of stack is not zero
            $z                                 Store top of stack in register (z)

               zd2%-                           n - n%2
                    2l$M                       log_2(n - n%2)
                        d1%-                   floor(log_2(n - n%2))
              2             ;                  2^floor(log_2(n - n%2))
                             z2%               n%2
                                *              Multiply
                                 z2:           n//2
                                    {          Recurse
                                     +         Add
                                      }        Return
                                       2;N.    Square it, output as number, and stop.

1
Ich denke, die Wiederholung ist nur eine Neuformulierung des Iterierens über die einzelnen Bits.
Martin Ender

3
Ich fürchte, das zählt nicht. Wann immer Sie 2nund 2n+1in einer wiederkehrenden Beziehung sehen, sollten Sie sofort denken, dass es sich um eine Schleife über Bits handelt.
Orlp

1
@orlp: Nun, das ist ein Mist. Ich bin jetzt ein bisschen davon überzeugt, dass Ihr Bonus unmöglich ist.
El'endia Starman

@ El'endiaStarman Ich denke, ich habe es fast geschafft.
Conor O'Brien

8

Japt , 29 28 11 7 Bytes

(Sie können das Programm als 7-Byte-IEC_8859-1-codierte Datei speichern und dann in den Interpreter hochladen .)

Japt ist ein gekürztes JavaScript von ETHproductions .

¢w n2 ²

Probieren Sie es online!

Erläuterung:

  1. ¢ist die Abkürzung zu Us2, die zu kompiliert U.s(2). Uwird eingegeben (implizit), .s(2)von einer Zahl aufgerufen , aufgerufen .toString(2)(in binär umgewandelt, als Zeichenfolge analysiert).

  2. wKompiliert nach .w(), was den String ( .split('').reverse().join('')) umkehrt .

  3. n2funktioniert wie parseInt(<number>,2), dh konvertiert binär in dezimal.

  4. ²ruft auf Math.pow(<number>,2), dh quadriert die Zahl.


1
Es gibt eine String-Funktion für Number n, die Sie verwenden können Us2 a w a n2 p2. Gute Arbeit!
ETHproductions

1
Funktioniert auch wauf Strings genauso wie auf Arrays, so dass Sie die beiden as nicht brauchen :)
ETHproductions

1
Eine letzte Sache: Us2 = ¢, und p2= ², um es auf 7 Bytes zu ¢w n2 ²
reduzieren

3
Der Online-Interpreter akzeptiert jetzt IEC_8859-1-codierte Dateien. (Obwohl ich nicht sicher bin, wie ich UTF-8 und UTF-16 auch machen soll ...)
ETHproductions

2
@ETHproductions - jetzt kann ich +1 dazu :)
Digital Trauma

5

Python, 32 Bytes

lambda x:int(bin(x)[:1:-1],2)**2

Probieren Sie es online aus.

Der Code ist ziemlich einfach: bin(6)Zum Beispiel gibt 0b110die binäre Darstellung von 6 [:1:-1]den String um und entfernt ihn 0b. intkonvertiert die Zeichenfolge in eine Ganzzahl aus einer Binärzahl und **2quadriert sie.


5

Jolf , 7 Bytes

Lass es einfach laufen. Die Eingabe auf der Seite funktioniert nicht.

^C_Bj22

Erläuterung

^C_Bj22
    j   numeric input
   B    convert to binary (str)
  _     reverse
 C   2  parse as binary integer to base 10
^     2 square
        implicit output

Ich habe den QBefehl hinzugefügt , der diese 6 Bytes ergibt:QC_Bj2


4
Durchgestrichene 7 sieht immer noch aus wie eine 7.
ein Spaghetto

2
@quartata Nicht so schlimm wie ein durchgestrichener 4.
orlp


4

Im Ernst , 8 7 Bytes

2;,¡R¿ª

Herausforderungen wie diese sind perfekt für Ernst :)

Probieren Sie es online aus

Erläuterung:

2;,¡    get a string representing the (decimal) input in binary, with a 2 on the bottom of the stack
R      reverse the string
¿    convert binary string to decimal int (using that extra 2 from earlier)
ª      square it

Netter Job passend zu Jolf!
Conor O'Brien

+1, wenn Ihr Dolmetscher die CP437-Codierung (oder zumindest die hexadezimale Darstellung davon) akzeptiert
Digitales Trauma

4

J 10 9 Bytes

2^~|.&.#:

Dies ist ein stillschweigendes, monadisches Verb. Probieren Sie es online!

Vielen Dank an @randomra für das Golfen ab 1 Byte!

Wie es funktioniert

2^~|.&.#:  Right argument: y

       #:  Convert y to binary.
   |.      Reverse the digits.
     &.    Dual; apply the inverse of #:, i.e., convert back to integer.
 ^~        Apply power (^) with reversed argument order (~)...
2          to 2 and the previous result.

Der Link funktioniert nicht. Auf einer Google-Seite mit der Meldung "Die angeforderte URL /host/0B3cbLoy-_9Dbb0NaSk9MRGE5UEU/index.html wurde auf diesem Server nicht gefunden. Das ist alles, was wir wissen." Wird ein 404-Fehler angezeigt.
Bijan


2

JavaScript, 64 63 56 53 Bytes

n=>parseInt([...n.toString(2)].reverse().join``,2)**2

Mir ist klar, dass ich extra lang bin, aber hey, ich kann es schaffen: P

Demo


Stattdessen parseInt(können Sie+("0b"+
Downgoat

@ Downgoat hm, es scheint nicht die richtigen Ergebnisse zu geben.
Nicoleel

[...n.toString(2)]und.join``
Conor O'Brien

1
Noch kürzer w / ES7 (49 Byte): n=>+("0b"+[...n.toString(2)].reverse().join``)**2. Funktioniert noch nicht in allen Browsern
Downgoat

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Danke, das spart ein paar Bytes.
nicael

2

Perl 6, 21 bytes

{:2(.base(2).flip)²}

Example usage:

say {:2(.base(2).flip)²}(26); # 121

say (0..24).map: {:2(.base(2).flip)²};
# (0 1 1 9 1 25 9 49 1 81 25 169 9 121 49 225 1 289 81 625 25 441 169 841 9)

my &code = {:2(.base(2).flip)²};
say code 3; # 9

say chars code 10¹⁰⁰; # 140


2

Shell, 25

dc -e2o?p|rev|dc -e2i?d*p

Input/output via STDIN/STDOUT:

$ echo 26|dc -e2o?p|rev|dc -e2i?d*p
121
$ 

1

Pyth - 9 bytes

Straightforward conversions. I actually assigned 2 to a var which is pretty weird.

^i_jQK2KK

Test Suite.


1

Pyth, 9 bytes

^i_.BQ2 2

This is a very simple pyth based answer similar to the Python one


1

𝔼𝕊𝕄𝕚𝕟, 12 chars / 21 bytes

⦅`ᶀ`+ᴙ(ïß2)²

Try it here (Firefox only).

Noncompetitive answer, 9 chars / 18 bytes

⦅Յ+ᴙ(ïⓑ)²

Try it here (Firefox only).


1
Via this byte counter, gives 15 bytes (uses another encoding).
nicael

I grade using UTF-8 (until I can get Mines encoding to work).
Mama Fun Roll

The... name of the language... is boxes?
corsiKa

It's ESMin in doublestruck. The Unicode chars aren't fully supported.
Mama Fun Roll


1

TI-Basic (TI-84 Plus CE), 42 bytes

Prompt X
0→S
While X
2S→S
If X/2≠int(X/2
S+1→S
End
S2
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.