Ludzie powtarzają mi, że kwadrat liczby jest liczbą pomnożoną przez siebie. To oczywiście nieprawda. Prawidłowy sposób kwadratowania liczby polega na przekształceniu jej w kwadrat, umieszczając go na sobie kilka razy równą liczbie cyfr, które ma, a następnie odczytując wszystkie liczby z wynikowego kwadratu, zarówno poziomo (z tylko od lewej do prawej) i pionowo (tylko od góry do dołu), a następnie dodając je do siebie. Tak więc dla liczby 123 najpierw utworzysz kwadrat:
123
123
123
Następnie weź wszystkie wiersze i kolumny z kwadratu i dodaj je razem:
123+123+123+111+222+333
Co daje nam wynik 1035
.
W przypadku liczb ujemnych układasz normalnie (pamiętaj, że liczysz tylko liczbę cyfr , więc znak ujemny nie jest uwzględniany w długości), a następnie odczytujesz liczby poziome normalnie (ze znakami ujemnymi), a następnie ignorujesz znaki ujemne dla liczby pionowe. Tak więc dla liczby -144
otrzymujemy kwadrat:
-144
-144
-144
Co daje nam -144-144-144+111+444+444
, co równa się567
W przypadku liczb zawierających tylko jedną cyfrę kwadrat jest zawsze równy podwojonej liczbie (odczytany raz poziomo i raz pionowo). Więc 4
daje nam
4
Co daje nam 4+4
, co równa się 8
.
W przypadku liczb z częściami dziesiętnymi stos należy układać normalnie (pamiętaj, że tylko liczby są liczone przy liczbie stosów, a zatem przecinek dziesiętny nie jest liczony) i ignoruj symbole dziesiętne podczas czytania liczb pionowych. Na przykład liczba 244.2
daje nam
244.2
244.2
244.2
244.2
Co daje nam 244.2+244.2+244.2+244.2+2222+4444+4444+2222
, co równa się 14308.8
.
Liczby ułamkowe lub zespolone nie mogą być podniesione do kwadratu.
Twoje zadanie:
Mam dość ręcznego zwiększania liczby do siebie, więc postanowiłem zautomatyzować ten proces. Napisz do mnie program lub funkcję, która pobiera liczbę zmiennoprzecinkową lub łańcuch, w zależności od tego, co wolisz, jako dane wejściowe i zwraca wynik ułożenia kwadratu po mojej stronie.
Przykłady:
123 -> 1035
388 -> 3273
9999 -> 79992
0 -> 0
8 -> 16
-6 -> 0
-25 -> 27
-144 -> 567
123.45 -> 167282.25
244.2 -> 14308.8
2 -> 4
-0.45 -> 997.65
0.45 -> 1000.35
Punktacja:
Moje ręce są ciasne od wypisywania tych wszystkich kwadratów, a mój komputer nie obsługuje kopiowania / wklejania, więc wygrywa wpis z najmniejszą ilością kodu (z jakiegoś powodu w bajtach?)!
244.2
nie jest liczbą zmiennoprzecinkową. Nie można go przekonwertować na ciąg"244.2"
.Odpowiedzi:
05AB1E , 7 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Galaretka ,
1312 bajtówŁącze monadyczne przyjmujące listę znaków (dobrze uformowana liczba dziesiętna, dla której wymagane jest pojedyncze wiodące zero -1 <n <1 ) i zwraca liczbę.
Wypróbuj online!
14 bajtów do akceptowania i zwracania liczb (wejście ograniczone do +/- 10 -5 o
ŒṘ
):ŒṘfØDẋ€L$ŒV+⁸S
.W jaki sposób?
źródło
+€
ze+
w wersji 15-bajtowy dla -1.Haskell,
5956 bajtówDane wejściowe są traktowane jako ciąg.
Wypróbuj online!
Jak to działa
źródło
Japt v2 , 16 bajtów
Przetestuj online!
Wyjaśnienie
źródło
C # (.NET Core),
150141133 bajtówZapisano 9 bajtów dzięki @TheLethalCoderZapisano kolejne 8 bajtów dzięki @TheLethalCoder
Wypróbuj online!
Pobiera ciąg znaków jako dane wejściowe i zwraca liczbę „kwadratową” jako liczbę zmiennoprzecinkową.
Ten kod działa zgodnie z następującym algorytmem:
Utwórz nowy ciąg z danych wejściowych, ale bez kropek dziesiętnych i symboli, abyśmy mogli uzyskać naszą długość i liczby dla kolumn z tego miejsca.
Oblicz wejściowe czasy długości ciągu, który utworzyliśmy w punkcie 1.
Dla każdej kolumny w naszym „kwadracie” utwórz nowy ciąg z numerem kolumny i długością wiersza i dodaj go do naszego wyniku.
Przykład:
Wkład:
-135.5
1355
, który ma długość4
.-135.5 * 4 = -542
.1111
,3333
,5555
,5555
.Jeśli zsumujemy te liczby, otrzymamy
15012
dokładnie to, co nasz program wyświetli.źródło
string.Replace()
, ale myślę, że to jedyny sposób, w jaki działa!i
il
zmiennoprzecinkowe..Length
nie może być pośrednio konwertowane na zmiennoprzecinkowe.a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}
141 bajtów. Może być w stanie zapisać, biorąc dane jako afloat
i rzutując na ciąg znaków,n+""
ale nie zaznaczyłem.Brachylog , 23 bajty
Wypróbuj online!
Brachylog nie pasuje do pływaków ...
Wyjaśnienie:
źródło
Łuska , 15 bajtów
Pobiera ciąg i zwraca liczbę. Wypróbuj online!
Wyjaśnienie
To trochę denerwujące, że wbudowana funkcja parsowania
r
powoduje błędy analizy przy nieprawidłowych danych wejściowych zamiast zwracania wartości domyślnej, co oznacza, że muszę jawnie odfiltrować kolumny, które nie są cyframi. Gdyby zwrócił 0 na zniekształconych danych wejściowych, mógłbym upuścićfΛ±
i zapisać 3 bajty.źródło
Python 3 ,
95 94 87 8584 bajtówPakiet testowy .
Python 3 , 78 bajtów
Pakiet testowy.
Drugim podejściem jest port do Pythona 3 zainspirowany rozwiązaniem @ officialaimm.
źródło
Python 2 ,
8174 bajtów-7 bajtów dzięki @Mr. Xcoder :
'/'<i
Wypróbuj online!
Wyjaśnienie:
Powiedz
123.45
jest podany jako dane wejściowe.[i for i in`x`if"/"<x]
podaje listę liczb całkowitych strunowych['1','2','3','4','5']
(która również jestz
). Teraz wykonujemy iterację,[x]+z
tj.[123.45,'1','2','3','4','5']
Mnożąc każdy element przezlen(z)
, tutaj5
i konwertując każdy na zmiennoprzecinkowy (tak, aby łańcuchy również zamieniały się odpowiednio), uzyskując[617.25,11111.0,22222.0,33333.0,44444.0,55555.0]
. Na koniec obliczamysum(...)
i otrzymujemy167282.25
.źródło
i.isdigit()
z"/"<i<":"
i.isdigit()
ze"/"<i
w rzeczywistości, ponieważ oba.
i-
posiadają kody ASCII niższe niż cyfry, ADN/
jest między nimiJavaScript,
7562 bajtówWypróbuj online
-2 bajty dzięki Arnauld
-5 bajtów dzięki Shaggy (myślałem, że funkcja musi otrzymać liczbę, ale teraz widzę, że wiele innych odpowiedzi również otrzymuje ciąg znaków)
źródło
Perl 5 ,
3733 + 1 (-p) =3834 bajtówWypróbuj online!
Użyłem kilku sztuczek z kodu Dom do golenia 4 bajtów
Wyjaśnił:
źródło
-n
i-p
dosłownie owijamwhile(){...}
kod, więc}{
się z niego wybieram. To się resetuje$_
ale jeśli użyjesz$\
jako zmiennej, nadal będzie drukowane, ponieważ$\
jest dołączane do każdego wydruku. Oznacza, że możesz przechowywać numer lub coś w tym i ignorować$_
. Nie jestem pewien, czy to było świetne wytłumaczenie, ale sprawdź Wskazówki dotyczące gry w gwincie Perla , jestem pewien, że wyjaśnię to lepiej! Cieszę się, że pomogłeś w osiągnięciu wyniku!Galaretka , 17 bajtów
Wypróbuj online!
źródło
Pyth, 18 bajtów
Wypróbuj tutaj.
źródło
Pyth ,
21 lat20 bajtówZestaw testowy.
Stosuje zupełnie inne podejście niż odpowiedź @ EriktheOutgolfer , która pomogła mi w golfie 1 bajt na czacie, od 22 do 21.
Wyjaśnienie
źródło
Oktawa ,
10082 bajtówWielkie dzięki @TomCarpenter za nauczenie mnie, że zadania mają wartość zwrotną i oszczędzają
18
bajty!Wypróbuj online!
Niegolfowane / Wyjaśnienie
Działa to w ten sposób, że w zasadzie musimy dodać liczbę
n
razy, a następnie dodać sumę kolumn. Sumowanies' * logspace(0,n-1,n)
pozwala uzyskać sumę kolumn, na przykład jeśliv=-123.4
ta macierz będzie:Musimy to po prostu
sum
zrobić i gotowe.źródło
@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n)))
. Wypróbuj online!Swift 4 ,
139134 bajtówPakiet testowy.
Wyjaśnienie
func f(s:String)
- Definiuje funkcjęf
z jawnym parametrem Strings
.let k=s.filter{"/"<$0}
- Filtruje cyfry: Zauważyłem, że obie-
i.
mają mniejsze wartości ASCII niż wszystkie cyfry, i/
są między.
,-
a0
. Dlatego właśnie sprawdziłem, czy"/"
jest mniejszy niż obecny znak, jak to zrobiłem w mojej odpowiedzi w języku Python.print(...)
- Drukuje wynik.Float(s)!*Float(k.count)
- Konwertuje zarówno ciąg, jak i liczbę cyfr na zmiennoprzecinkowe i mnoży je (Swift nie zezwala na mnożenie zmiennoprzecinkowe i Int :()). Dodaje więc liczbęx
razy, gdziex
jest liczba cyfr, które zawiera.k.map{Int(String(repeating:$0,count:k.count))!
-k.map{}
mapyk
z aktualną wartością$0
.String(repeating:$0,count:k.count)
pobiera każdą cyfrę, tworzy ciągx
identycznych cyfr iFloat(...)!
konwertuje ją na liczbę zmiennoprzecinkową..reduce(0,+)
- Pobiera sumę powyższej listy.I w końcu
+
sumuje oba wyniki.Weźmy przykład!
Powiedz, że nasz ciąg jest
"0.45"
. Po pierwsze, filtrujemy cyfry, więc zostajemy z0, 4, 5
. Mamy przekształcić"0.45"
się unosić i pomnożyć przez liczbę cyfr:0.45 * 3 = 1.35
. Następnie bierzemy każdą cyfrę i przekształcić go w ciąg powtarzających tę cyfrę do momentu zakrycia szerokość placu (ilu cyfr istnieją)0, 4, 5 -> 000, 444, 555
. Podsumowując możemy tego000 + 444 + 555 = 999
. Następnie wystarczy dodać wyniki razem:1.35 + 999 = 1000.35
.źródło
C #,
139137 bajtówZaoszczędzono 2 bajty dzięki @Ian H.
Wypróbuj online!
Wersja pełna / sformatowana:
źródło
var d=(n+ ...
zamiastvar d = (n ...
.Mathematica, 107 bajtów
źródło
PHP,
7888 +1 bajtówUruchom jako potok z
-nR
.Może generować ostrzeżenia w PHP 7.1. Zmień za
$c,$e
pomocą,$c>0?$c:0,$e
aby naprawić.źródło
Python 3 , 68
707377bajtówWypróbuj online!
Pętla nad każdym znakiem cyfrowym i powtarza go przez ogólną liczbę cyfr, zamienia to na liczbę całkowitą i dodaje to
n
. W ten sposóbn
dodawane sąd
czasy, pozioma część sumy, wraz z powtarzaniem cyfr, która jest częścią pionową. Pierwotnie używany,str.isdigit
ale>"/"
dzięki innym w tym wątku zaoszczędził wiele bajtów. Zapisuje dwa bajtyn
jako ciąg znaków, ale dane wyjściowe są bardziej chaotyczne.Wypróbuj online!
źródło