Odwrotny i kwadratowy

19

W tym wyzwaniu wyliczysz liczby z osobliwej sekwencji.

Dane wejściowe są liczbą całkowitą nieujemną dziesiętną. Odwróć bity w tej liczbie całkowitej, a następnie kwadrat, aby uzyskać wymaganą moc wyjściową.

Podczas odwracania bitów nie wolno używać żadnych początkowych zer na wejściu. Na przykład:

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

Pierwsze 25 wejść / wyjść tej sekwencji:

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

Twoje rozwiązanie powinno działać na liczbach całkowitych o dowolnym rozmiarze. Jeśli w Twoim języku nie ma wygodnej wbudowanej metody korzystania z nich, zaimplementuj swoją odpowiedź tak, jakby miała. Jesteś wtedy usprawiedliwiony, jeśli twoja odpowiedź załamie się w przypadku dużych liczb. Nie należy jednak używać sztuczek / ograniczeń, które działają tylko w przypadku ograniczonej domeny (takiej jak tabela odnośników).


Twój wynik to liczba bajtów kodu źródłowego.

-50% bonusu, jeśli nigdy nie zmienisz numeru na / z binarnego. Nie ogranicza się to do poleceń wbudowanych, jeśli liczba zostanie zapętlona krok po kroku (poprzez przesunięcie, maskowanie lub inną metodę), będzie również liczona jako konwersja. Nie wiem, czy jest to faktycznie możliwe, ale zachęca to do wykrycia wzoru w sekwencji.

Najmniejszy wynik wygrywa.

orlp
źródło
6
Tak blisko
Conor O'Brien
1
Jeśli kod wywołuje metodę, która daje ciąg znaków reprezentujący bity, czy kwalifikuje się do otrzymania premii?
Brad Gilbert b2gills
2
@ BradGilbertb2gills No.
lub
Zakładam, że użycie matematyki do wyodrębnienia bitów również liczy się jako konwersja binarna?
lirtosiast
2
Odpowiedni i istotny
Mego

Odpowiedzi:

5

Par , 5 bajtów

✶Σ⌐Σ²

To jest read-binary-reverse-binary-square.

Lynn
źródło
Liczę 12
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ten licznik bajtów zakłada UTF-8. Wierzę, że Mauris używa kodowania innego niż UTF-8 do liczenia swoich bajtów, ale nie określił tego kodowania.
lub
Par używa własnego dziwnego kodowania. Jego kanoniczna reprezentacja jest pewnym podzbiorem <256 znaków Unicode. Nie jestem pewien, czy ma nazwę; Powinienem poczekać, aż zadzwoni @Ypnypn.
Lynn
Rozumiem. @orlp
Conor O'Brien
Być może ma swój własny SBCS?
HyperNeutrino
19

Mathematica, 42 21 bajtów

Dzięki alephalpha za zmniejszenie o połowę wyniku.

#~IntegerReverse~2^2&

Rzeczywistym powodem, dla którego to zrobiłem w Mathematica, było to, że chciałem spojrzeć na fabułę ... z pewnością wygląda śmiesznie:

wprowadź opis zdjęcia tutaj

Martin Ender
źródło
11
Ale podoba mi się wynik! XD
Conor O'Brien
1
dlaczego ta odpowiedź ma więcej głosów niż odpowiedź z najmniejszą liczbą bajtów? o_O
Seadrus
27
@Seadrus Wiesz, co mówią. Obraz jest wart 7 bajtów.
Martin Ender
5
więc twój wynik to 42 + 7 = 49 bajtów: P
Seadrus
3
Przepraszamy, @ C @O'Bʀɪᴇɴ.
Martin Ender
8

Minkolang 0,14 , 43 bajty

Dzięki Mego za inspirację.

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

Przetestuj kod tutaj i sprawdź wszystkie przypadki testowe tutaj .

Wyjaśnienie

Używa tej relacji powtarzalności:

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

Jeśli njest wejściem, to a(n)jest liczbą wynikową po odwróceniu jego sekwencji binarnej. 0 i 1 są oczywiste. Weź a(2n) = a(n)pod uwagę, że x0(gdzie xjest jakakolwiek sekwencja cyfr binarnych) jest odwrócone 0x, co jest takie samo jak x. Dla a(2n+1)rozumowanie jest nieco bardziej skomplikowana. x1jest odwrócony 1x, co x + 2^kdla niektórych jest równe k. Jest kto o jeden więcej niż liczba cyfr x, czyli floor(log_2(n))+1. Następuje pełna formuła, z tą różnicą, że jest nieco zmodyfikowana. Oto, co właściwie koduję:

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

Jak Mego i pracowałem w czacie floor(n/2) = (n - n%2)/2. Tak więc log_2(floor(n/2))+1 = log_2(n - n%2). Co więcej, mnożenie przez (n%2)zrzuca zarówno nieparzyste, jak i parzyste części w jedno wyrażenie.

Wreszcie, bez zbędnych ceregieli, oto kod wyjaśniony.

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.
El'endia Starman
źródło
1
Myślę, że nawrót jest tylko przeformułowaniem iteracji poszczególnych bitów.
Martin Ender
3
Obawiam się, że to się nie liczy. Ilekroć widzisz 2ni 2n+1w związku z nawrotem powinieneś natychmiast pomyśleć o tym jako o zapętlaniu bitów.
lub
1
@orlp: Cóż, to kłopot. Jestem trochę przekonany, że twój bonus jest niemożliwy.
El'endia Starman
@ El'endiaStarman Chyba już go mam.
Conor O'Brien,
8

Japt , 29 28 11 7 bajtów

(Możesz zapisać program jako 7-bajtowy plik zakodowany w IEC_8859-1, a następnie przesłać go do tłumacza .)

Japt to skrócony JavaScript stworzony przez ETHproductions .

¢w n2 ²

Wypróbuj online!

Wyjaśnienie:

  1. ¢to skrót do Us2, który się kompiluje U.s(2). Ujest wejściem (niejawnym), .s(2)wywoływanym przez liczbę, wywołuje .toString(2)(konwertuje na binarny, analizuje jako ciąg znaków).

  2. wkompiluje do .w(), co odwraca string ( .split('').reverse().join('')).

  3. n2działa jako parseInt(<number>,2), tzn. konwertuje wartość binarną na dziesiętną.

  4. ²wywołuje Math.pow(<number>,2), tzn. podnosi liczbę do kwadratu.

Nicość
źródło
1
Jest włączona funkcja ciągu n, abyś mógł to zrobić Us2 a w a n2 p2. Dobra robota!
ETHprodukcje
1
Ponadto, wdziała tak samo na sznurkach jak to robi na macierzach, więc nie trzeba dwa as :)
ETHproductions
1
Ostatnia rzecz: Us2 = ¢i p2= ²sprowadzenie do 7 bajtów:¢w n2 ²
ETHprodukcje
3
Tłumacza on-line teraz akceptuje IEC_8859-1 zakodowanych plików. (Chociaż nie jestem pewien, jak zrobić UTF-8 i UTF-16 ...)
ETHproductions
2
@ETHproductions - teraz mogę dać +1 :)
Digital Trauma
5

Python, 32 bajty

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

Wypróbuj online.

Kod jest dość prosty: bin(6)na przykład daje 0b110, binarna reprezentacja 6. [:1:-1]odwraca ciąg i usuwa 0b. intkonwertuje ciąg z liczb binarnych na liczbę całkowitą i **2obciąża go.

NinjaBearMonkey
źródło
5

Jolf , 7 bajtów

Po prostu uruchom. Dane wejściowe na stronie nie działają.

^C_Bj22

Wyjaśnienie

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

Dodałem Qpolecenie, które tworzy te 6 bajtów:QC_Bj2

Conor O'Brien
źródło
4
Przekreślone 7 nadal wygląda jak 7.
spaghetto
2
@ quartata Nie tak zły jak przekreślony 4.
lub
4

Poważnie , 8 7 bajtów

2;,¡R¿ª

Takie wyzwania są idealne na poważnie :)

Wypróbuj online

Wyjaśnienie:

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
Mego
źródło
Dobra robota pasująca do Jolfa!
Conor O'Brien
+1 za zaakceptowanie przez tłumacza kodowania CP437 (lub przynajmniej jego reprezentacji szesnastkowej)
Digital Trauma
4

J, 10 9 bajtów

2^~|.&.#:

To jest milczący, monadyczny czasownik. Wypróbuj online!

Dzięki @randomra za grę w golfa na 1 bajcie!

Jak to działa

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.
Dennis
źródło
Link nie działa, pojawia się błąd 404 na stronie Google z informacją: „Żądany adres URL /host/0B3cbLoy-_9Dbb0NaSk9MRGE5UEU/index.html nie został znaleziony na tym serwerze. To wszystko, co wiemy”.
Bijan
2

JavaScript, 64 63 56 53 bajtów

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

Zdaję sobie sprawę, że jestem wyjątkowo długi, ale hej, mogę to zrobić: P.

Próbny

Nicość
źródło
zamiast tego parseInt(możesz zrobić+("0b"+
Downgoat
@Downgoat hm, nie wydaje się dawać poprawnych wyników.
nicael
[...n.toString(2)]oraz.join``
Conor O'Brien
1
Nawet krótszy w / ES7 (49 bajty): n=>+("0b"+[...n.toString(2)].reverse().join``)**2. Nie działa jeszcze w żadnej przeglądarce
Downgoat
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Dzięki, to oszczędza niektóre bajty.
nicael
2

Perl 6 , 21 bajtów

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

Przykładowe użycie:

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
Brad Gilbert b2gills
źródło
2

PHP, 45 bajtów

echo pow(bindec(strrev(decbin($argv[1]))),2);
nieokreślony
źródło
2

Shell, 25

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

Wejście / wyjście przez STDIN / STDOUT:

$ echo 26|dc -e2o?p|rev|dc -e2i?d*p
121
$ 
Cyfrowa trauma
źródło
1

Pyth - 9 bajtów

Proste konwersje. Właściwie przypisałem 2 do var, co jest dość dziwne.

^i_jQK2KK

Pakiet testowy .

Maltysen
źródło
1

Pyth, 9 bajtów

^i_.BQ2 2

Jest to bardzo prosta odpowiedź oparta na pyth, podobna do odpowiedzi w Pythonie

TanMath
źródło
1

𝔼𝕊𝕄𝕚𝕟, 12 znaków / 21 bajtów

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

Try it here (Firefox only).

Odpowiedź niekonkurencyjna, 9 znaków / 18 bajtów

⦅Յ+ᴙ(ïⓑ)²

Try it here (Firefox only).

Mama Fun Roll
źródło
1
Przez ten licznik bajtów daje 15 bajtów (używa innego kodowania).
Nicola
Oceniam za pomocą UTF-8 (dopóki nie mogę uruchomić kodowania Mines).
Mama Fun Roll
... nazwa języka ... to pudełka?
corsiKa
To jest ESMin w podwójnym uderzeniu. Znaki Unicode nie są w pełni obsługiwane.
Mama Fun Roll
1

Rubin, 35 bajtów

->(x){x.to_s(2).reverse.to_i(2)**2}
Ostra Gupta
źródło
1

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

Prompt X
0→S
While X
2S→S
If X/2≠int(X/2
S+1→S
End
S2
pizzapanty184
źródło