Któregoś dnia mój nauczyciel chemii wyjaśniał nam notację naukową (używając małej liczby i mnożąc ją przez potęgę dziesięciu, aby łatwiej wyrażać duże liczby), co przywróciło mnie o kilka lat, kiedy się go nauczyłem. Po zapoznaniu się z podstawami zadaliśmy kilka typowych pytań matematycznych, z których niektóre były następujące:
W notacji naukowej reprezentuj:
a)
50000000 b) 120000000000000
c) 90000000000000000000000000000000000000
d) pi ^ e ^ i ^ j ^ k ^ std :: vector
...
z) 200
...
I pomyślałem: „Co? Powiedziano nam, że notacja naukowa została użyta, aby zwiększyć efektywność pisania dużych liczb, ale niektóre przypadki wcale nie są bardziej efektywne!”
Rozważ numer
300
i jego reprezentacja w notacji naukowej:
3x10^2
Co, naukowo zanotowana wersja faktycznie zajmuje więcej miejsca? Nie możemy tego teraz mieć, prawda? (Przestrzeń na ekranie jest cenna.)
Moglibyśmy sami ustalić, czy bardziej efektywne jest miejsce na zapisanie liczby w notacji naukowej, czy nie, lub ...
Zadanie
Twój program lub funkcja powinna przyjąć jako wartość wejściową pojedynczą liczbę dodatnią n
o dowolnym rozmiarze (do poziomu obsługiwanego przez Twój język) i wygenerować zanotowaną naukowo wersję liczby.
Jeśli jednak oryginalny numer n
, po usunięciu końcowych zer i końcowego miejsca po przecinku, zajmuje mniej lub tyle samo znaków do wyświetlenia niż jego notowana naukowo wersja, należy n
zamiast tego wydrukować ten oryginalny numer .
Twój kod musi być jak najkrótszy, ponieważ dane wyjściowe również muszą być tak krótkie, jak to możliwe.
Dane techniczne
Efektywna notacja naukowa jest zdefiniowana następująco:
bx10^e
b
jest liczbą wejściową odpowiednio podzieloną przez potęgi 10, takie jak 1 <= b < 10
. Ta liczba musi mieć wszystkie zera końcowe (i kropkę dziesiętną, jeśli jest wymagana), ale musi mieć dokładność oryginalnej liczby (do limitu dziesiętnego w twoim języku, oczywiście). Oznacza to, że 90000
staje się 9
, 13.500
staje się 1.35
, 0.000675
staje się 6.75
itd. Jeśli liczba ta zawiera więcej miejsc po przecinku, niż twój język może znieść, należy ją zaokrąglić do maksymalnej liczby miejsc po przecinku.
e
jest wykładnikiem potęgi, do którego podniesiono dziesięć, że n = b x 10^e
(pamiętaj, że liczba ta musi być ujemna, jeśli n
jest mniejsza niż 1). Liczba ta nie powinna mieć żadnych zer końcowych ani miejsca dziesiętnego (głównie dlatego, że jeśli nie jest liczbą całkowitą, coś jest nie tak ...).
Znaki x10^
muszą pozostać takie, jak w ciągu między b
i e
.
Przypadki testowe
Input -> output
1 -> 1
20 -> 20
3000000 -> 3x10^6
400000 -> 400000
0.008093 -> 0.008093
0.007835000000000 -> 0.007835
0.000003000000 -> 3x10^-6
0.00000065 -> 6.5x10^-7
0 -> 0
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
Inne zasady i wyjaśnienia
- Zera końcowe (i / lub końcowe miejsce dziesiętne) nie są liczone do liczby znaków oryginalnej liczby wejściowej
n
. Pamiętaj o tym w przypadkach takich jak przypadek testowy 6 - Możesz założyć, że jeśli liczba wejściowa jest mniejsza niż 1, zawsze będzie zaczynać się od 0 dla cyfry jedynek (jak w przypadkach testowych 5-8).
- Numer wejściowy nigdy nie będzie ujemny
- Wbudowane rozwiązania, które sprawiają, że wyzwanie jest trywialne, a standardowe luki są niedozwolone
- Końcowy znak nowej linii w wynikach jest OK
EDYCJA
Dzięki użytkownikowi 81655 za wskazanie przypadków testowych 7 i 8 miał niepoprawne moce dziesięciu. Naprawiłem je, więc upewnij się, że Twój kod ocenia je poprawnie.
pi^e^i^j^k^std::vector
byłby wynik dla danych wejściowych ?e
9000 -> 9e3
x10^
. Byłoby to sporo przeróbek na pytanie, które nie wydaje mi się właściwe teraz, gdy zostało opublikowaneOdpowiedzi:
ES6,
8381 bajtówPrawdopodobnie zawiedzie w niektórych przypadkach krawędzi, w których
toString
nalega na format wykładniczy.Edycja: Zapisano 2 bajty dzięki @ user81655.
źródło
/
o końcu wyrażenia regularnego.x=>(e=s=>s.replace(/e\+?/,'x10^'),z=e(x.toExponential()),y=e(''+x))[z.length]?z:y
Python 3,
346342319302 bajtówPrawdopodobnie strasznie grał w golfa, ale hej, to moja pierwsza próba czegoś takiego. Trudno ją przeczytać, więc musi być dobra.
O ile mi wiadomo, powinno działać w każdym przypadku, nawet przy tendencji Pythona do automatycznego przekształcania liczb przekraczających dowolny próg w notację naukową (z wyjątkiem tego fajnego i fantazyjnego „e”). Nie pamiętam dokładnie, w jaki sposób udało mi się zwrócić standardowe numery formularzy, ale robi to.
źródło
Perl 6,
9690 bajtówWydaje mi się, że może to być krótsze, ale na razie jest to moje najlepsze
użycie : przypisz to do zmiennej
Tutaj jest trochę niepoprawny z jakimś złym komentarzem:
źródło
$_ <1
z1>$_
lub1 <=* <10
z10>*>=1
TI BASIC (nspire): 112 bajtów
Wyjaśnienie
Konwertuje dane wejściowe na notację naukową za pomocą funkcji formatu, jeśli nie jest już w tym formacie - ponieważ małe dziesiętne są automatycznie konwertowane.
Znajduje pozycję fantazyjnego E, który oznacza wykładniki potęgowe i zastępuje go „x10 ^”.
Sprawdza, która moc wyjściowa jest większa i zwraca optymalną. Chyba że jest to mały ułamek dziesiętny, który jest domyślnie mniejszy.
źródło
Python (3.5) 177 bajtów
Rozwiązanie wykorzystujące wyrażenie regularne
Wyjaśnienie
Import modułu regexp
Definicja funkcji lambda do zastąpienia
e
przezx10^
Konwersja ciągu w notacji naukowej
Usuń 0 wypełnień w oryginalnym sznurku
porównaj długość
Wyniki
źródło