Stwórzmy proste, przejmujące odwzorowanie od liczb całkowitych dodatnich do liczb całkowitych Gaussa , które są liczbami zespolonymi, w których rzeczywistymi i urojonymi częściami są liczby całkowite.
Na przykład 4538
, biorąc pod uwagę dodatnią liczbę całkowitą, wyraż ją binarnie, bez wiodących 0
:
4538 base 10 = 1000110111010 base 2
Usuń wszystkie końcowe 0
:
100011011101
Zamień dowolne przebiegi jednego lub więcej 0
na jedno +
:
1+11+111+1
Wymień wszystkie 1
„sz i
” s:
i+ii+iii+i
Oceń wynikowe złożone wyrażenie i wyprowadź uproszczoną liczbę całkowitą Gaussa:
i+ii+iii+i = i+i*i+i*i*i+i = 2i+i^2+i^3 = 2i+(-1)+(-i) = -1+i
Dane wyjściowe można wyrazić w tradycyjny sposób matematyczny lub podać jako dwie oddzielne liczby całkowite dla części rzeczywistej i złożonej. Na 4538
przykład dowolne z nich byłoby w porządku:
-1+i
i-1
-1+1i
(-1, 1)
-1 1
-1\n1
Do surowców jak 29
, MATHY sformatowane wyjść, na przykład 0
, 0i
czy 0+0i
to wszystko jest w porządku.
Używanie j
(lub czegoś innego) zamiast i
jest w porządku, jeśli jest to bardziej naturalne dla twojego języka.
Najkrótszy kod w bajtach wygrywa.
źródło
4+2j
->100+10j
...Odpowiedzi:
MATL , 7 bajtów
Wypróbuj online!
Jak to działa
Rozważmy
4538
na przykład dane wejściowe .źródło
Galareta , 8 bajtów
Wypróbuj online!
Jak to działa
źródło
Python 2, 53 bajty
Próbowałem grać w golfa i wydaje się, że można grać w golfa, ale nie mam pomysłów ...
źródło
(k or 1)
nie wydaje się optymalna, ale tylko inne rzeczy mogę myśleć to(k+0**k)
...0**k
nie działają na skomplikowanek
...Mathematica,
4438 bajtówWyjaśnienie
Konwertuj dane wejściowe na bazę 2. (
4538
staje się{1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
)Pomnóż przez
I
({1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
staje się{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
)Podziel według przebiegów (
{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
staje się{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
)Znajdź produkt na poziomie 2. (
{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
staje się{I, 0, -1, 0, -I, 0, I, 0}
)Zsumuj wynik. (
{I, 0, -1, 0, -I, 0, I, 0}
staje się-1 + I
)źródło
Tr[Times@@@(I*Split@RealDigits[#,2][[1]])]&
I
najpierw wykorzystałem twój pomysł na pomnożenie , aleIntegerDigits
ostatecznie byłem krótszy.Python 2 ,
777671 bajtówDzięki @ZacharyT za grę w golfa na 1 bajcie!
Wypróbuj online!
źródło
JavaScript (ES6),
6764 bajtówDane wyjściowe jako tablica 2-elementowa.
Wyjaśnienie
Ponieważ JavaScript nie ma liczb urojonych, musimy śledzić rzeczywiste i urojone części w osobnych zmiennych. Najłatwiej to zrobić w jednej tablicy, z prawdziwą częścią na początku. i jest reprezentowane jako [0,1] , i 2 (lub -1 ) jako [-1,0] , i 3 (lub -i ) jako [0, -1] oraz i 4 (lub 1 ) jako [1 , 0] .
Po pierwsze, wielokrotnie dzielimy liczbę przez 2, zbierając każdy z nich w ich reprezentacji binarnej. Każde uruchomienie n tych odpowiada i n . Odpowiada to dodaniu 1 - (n i 2) do pozycji o indeksie n i 1 w tablicy dwóch elementów. Więc to robimy.
Powinienem chyba dodać więcej wyjaśnień, ale nie mogę wymyślić, co jeszcze trzeba wyjaśnić. Skomentuj dowolne pytania.
źródło
Python,
1991291241169490716361 bajtówDane wejściowe to sama liczba.
Dane wyjściowe mają format
(a+bj)
, w którymj
jest jednostką urojoną.0j
zostanie wypisany zamiast(0+0j)
Najpierw przekonwertuj na binarny. Obetnij
'0b'
off. Zabij końcowe zera. Podziel za pomocą bloku zer (s) jako ogranicznika. Odwzoruj każdy blok na1j ** len
. Następnie weź sumę całej rzeczy.-70 bajtów , nie zamieniając na plusy. Regex
-5 bajtów jest krótszy.
-8 bajtów poprzez pozbycie się dwóch niepotrzebnych zmiennych, które były wywoływane tylko raz.
-22 bajtów przy użyciu liczb zespolonych zamiast mojej dziwnej rzeczy. Dzięki odpowiedzi @Dennis za poinformowanie mnie o liczbach zespolonych!
-4 bajty , uświadamiając sobie, że
map
jest to tylko fantazyjny sposób robienia list, z wyjątkiem dłuższych.-19 bajtów , przechodząc na nieco tajemniczą metodę unikania błędów
j ** 0
i unikania wyrażenia regularnego. Zainspirowany komentarzem @ Griffin. Dzięki! :)-8 bajtów , przesuwając
if
część do końca.-2 bajty Dzięki @Griffin za zaoszczędzenie 2 bajtów poprzez usunięcie nawiasów kwadratowych, aby zamiast tego było wyrażeniem generatora!
źródło
sum(1j**x.count('1')for x in bin(input()).split('0')if x)
1
bloków i nie używa wyrażenia regularnego, jak moje. Nie chcę też kraść ci kodu, ponieważ jest o wiele lepszy niż moja wersja. :)1
s zamiast długości,0x
najpierw bierze część z przodu. Dzięki za pomysł przeniesieniaif
do końca; Nigdy bym nie wiedział, że to działa inaczej!MATLAB, 58 bajtów
Użyjmy
285
do zilustrowania procesu:Na szczęście
1+++1
zachowuje się tak jak1+1
w MATLAB, więc powyższe ocenia:1+111+1
.Teraz to połączenie
strrep
jest prawdziwym klejnotem! Wstawiająci*1
do1
mamy coś naprawdę miłego. Jeśli jest tylko jeden1
, po prostu rozumiemy,i*1
co jesti
. Jeśli istnieje więcej niż jeden, a następniei*1
zostanie powtórzony i łączone w kolejności:i*1i*1i*1i*1
. Ponieważi==1i
w MATLAB i1i*1==i
jest to po prostu:i*i*i*i
.Dołączanie
.0
wydaje się tutaj niepotrzebne, ale jest potrzebne, jeśli ostatnim znakiemtemp3
jest+
. Nie możemy dodać tylko zera, ponieważ dałoby toi*10
w powyższym przypadku, a zatem zły wynik.I w końcu:
To nie działa w Octave z kilku powodów.
strrep
nie może przyjmować wartości ASCII jako danych wejściowych, potrzebuje rzeczywistych znaków ('0'
zamiast48
). Również+++
nie ocenia się tylko+
w Octave, ponieważ spowodowałoby to złamanie skrótów zwiększania / zmniejszaniax++
ix--
.źródło
eval
:-P Nie możesz użyć1i
zamiast1*i
?i*1
części ...Pyth - 15 bajtów
Frustrująco długo.
Pakiet testowy .
źródło
Mathematica, 84 bajty
Funkcja anonimowa. Pobiera liczbę jako dane wejściowe i zwraca liczbę zespoloną jako dane wyjściowe.
źródło
Mathematica, 75 bajtów
Niezależnie wymyślił prawie to samo rozwiązanie, które LegionMammal978 opublikował 23 minuty temu! Zastąpienie
1
przezI
(który jest wewnętrznym symbolem Mathematica pierwiastka kwadratowego z -1) działa, ponieważ spacje są traktowane jako zwielokrotnienie sąsiednich wyrażeń. Miejsce, które zapisałem na innym rozwiązaniu, a mianowicie przez unikanie potrzebyStringTrim
, polega zawsze na dołączaniu-0
: jeśli liczba binarna kończy się1
, to to wyrażenie kończy się,...I-0
co nie wpływa na jego wartość; podczas gdy jeśli liczba binarna kończy się na „0”, to to wyrażenie kończy...+-0
się parsowaniem jako „dodaj ujemne 0” i w ten sposób pozbywa się końcowego znaku plus.źródło
Matlab, 99 bajtów
Przypadki testowe:
źródło
Haskell,
102918987 bajtówWielokrotnie dzieli przez dwa i sprawdza bit. Utrzymuje akumulator,
i^(number of odds)
gdziea+b*i
jest zakodowany jako[a,b]
i*i
jest[a,b]↦[-b,a]
(obrót o 90 stopni). Inicjał(*2)
jest uniknięcie wyszukiwania pierwszego bitu.Zastosowanie (podziękowania dla przykładów @OwenMorgan):
źródło
Java, 172 bajty
źródło
Clojure, 183 bajtów
Czy mogę to zrobić?
Użyj funkcji w następujący sposób:
źródło
Właściwie 35 bajtów
Wypróbuj online!
Wyjaśnienie:
Z grubsza równoważny kod Python 3:
Wypróbuj online!
źródło
'0@s
i``░
przycinanie dowolnych ciągów pustych ciągów powinno zaoszczędzić cztery bajty.Galaretka , 10 bajtów
To nie jest lepsze niż odpowiedź Jelnisa na Dennisa, ale i tak chciałem spróbować swoich sił w odpowiedzi na Jelly. Zapraszamy do gry w golfa! Wypróbuj online!
Ungolfing
źródło
1 => 1 => 1j
jest to równoważne z2 => 10 => 1 => 1j
.Tak właściwie 15 bajtów
Zapraszamy do gry w golfa! Wypróbuj online!
Ungolfing:
źródło
Axiom,
140, 131, 118108 bajtów% i jest wyimaginowanym kosztownym
wyniki
źródło
Perl 6 ,
4046 bajtówDość szybko to wymyśliłem
Niestety jest to obecnie niedokładne w implementacji Rakudo na MoarVM .
say i ** 3; # -1.83697019872103e-16-1i
Musiałem więc zrobić następną najlepszą rzecz:
Rozszerzony:
Test:
źródło
PHP, 87 bajtów
Prawie to samo co rozwiązanie ETHproductions; tylko iteracyjne zamiast rekurencyjne.
Pobiera dane z wiersza poleceń, ustawia zmienne
${0}
i${1}
.źródło
TI-Basic (TI-84 Plus CE), 70 bajtów
Nie ma wbudowanego programu do konwersji na ciąg binarny (ani też nie ma go na parsowanie), więc ten program ręcznie dzieli przez 2, zwiększając N za każdym razem, gdy zobaczy 1 i dodając i ^ N do S (N> 0) i resetując N, jeśli widzi zero.
źródło
Java , 100 bajtów
Wypróbuj online!
źródło
R , 54 bajty
Wypróbuj online!
n%/%2^(0:log2(n))%%2
oblicza wektor cyfr binarnych. Używając kodowania długości przebiegu, używamy typu R,complex
aby obliczyć odpowiednią sumę, mnożąc przezx$values
aby usunąć zera.Zwraca
complex
wektor jednego elementu.źródło