Możesz pamiętać w pierwszej lub drugiej klasie, używając rozszerzonej formy, aby dowiedzieć się o wartości miejsca liczb. Łatwiej to wyjaśnić na przykładzie, więc zastanów się nad liczbą 123
. W rozszerzonej formie jest reprezentowany jako 100 + 20 + 3
, co pomaga młodemu umysłowi wizualizować wartość miejsca. Przypomina to, jak to mówisz: sto (plus) dwadzieścia (plus) trzy.
Możemy przedłużyć tę jednostkę o miejsca po przecinku: 2.718 => 2 + 0.7 + 0.01 + 0.008
Twoim wyzwaniem jest napisanie programu lub funkcji, która przyjmuje dodatnią liczbę zmiennoprzecinkową lub zero (zakładając, że jest tak duża lub precyzyjna, jak twój język może to obsłużyć; nie będzie w notacji naukowej) lub ciąg znaków i drukuje / zwraca ją w rozszerzonej formie jak wyjaśniono powyżej.
Nie potrzebujesz spacji między +
zerami ani zerem przed kropką dziesiętną, więc powyższy przykład może być 2+.7+.01+.008
. Wartości, które byłyby równe zeru, należy pominąć ( 101.01 => 100 + 1 + 0.01
), chyba że wartością wejściową jest zero (patrz poniżej).
Wartości nie powinny mieć więcej niż jednego zera wiodącego przed kropką dziesiętną ani żadnych zera końcowego po nim (no-no's 0060, 0000.2, 30., 30.000, .0400
:). Dane wejściowe również będą zgodne z tym.
Ponieważ pierwszoklasiści mają krótki czas koncentracji, twój kod będzie musiał być jak najkrótszy.
Przypadki testowe
0 => 0
6 => 6
0.99 => 0.9 + 0.09
24601 => 20000 + 4000 + 600 + 1
6.283 => 6 + 0.2 + 0.08 + 0.003
9000000.0000009 => 9000000 + 0.0000009
źródło
Odpowiedzi:
CJam,
3326 bajtówTo nie będzie działać z interpreterem Java; druk pływa inaczej. Wypróbuj z interpreterem CJam .
Zostanie wydrukowany ostatni przypadek testowy
9000000+9e-7
, który został uznany za ważny przez @NinjaBearMonkey .Dzięki @ jimmy23013 za grę w golfa poza 7 bajtami!
Jak to działa
źródło
r_ee\'0fe<f{\~t~}{},'+*0e|
.JavaScript (ES7), 102 bajty
Wyjaśnienie
Wymaga wprowadzenia liczby jako ciągu bez zer wiodących (chyba że liczba jest
0
oczywiście).Uwaga: Z powodu dziwnego zmiennoprzecinkowego niektóre liczby (jak
.3
) wychodzą źle, ale teoretycznie działa to na dowolną liczbę.Test
Testowe zastosowania
Math.pow
zamiast**
zgodności przeglądarki.Pokaż fragment kodu
źródło
Math.floor
=>0|
...?1
ulegnie zerwaniu, ponieważMath.log10(n)
zwróci liczbę ujemną i|0
zaokrągli się do zera zamiast podłogi.0|Math.log10(n),p-=p<0
zamiastMath.floor(Math.log10(n))
?n<1
ponieważ0|
będziep
równa0
dla obu0.1
i-0.1
. Najkrótszym sposobem, jaki mogę wymyślić,p=Math.log10(n),p=p-(p<0)|0
jest taka sama długość jak używanieMath.floor
. :(n=0.1
.Retina ,
867775 bajtówLiczba bajtów zakłada, że źródło jest zakodowane jako ISO 8859-1.
Końcowe podawanie linii jest znaczące.
Wypróbuj online.
Wyjaśnienie
Zaczynamy od przekształcenia danych wejściowych w osobną listę komponentów podawaną przez wiersz, chociaż poprawna jest tylko cyfra wiodąca (lub końcowa). Odbywa się to poprzez nadużywanie podzielonego etapu. Zamiast dzielić dane wejściowe, dopasowujemy je wszystkie, więc pozostałe segmenty są puste. Usuwamy puste segmenty z
_
opcją. Problem polega na tym, że podzielone etapy zwracają również wartości wszystkich grup przechwytywania. Dlatego używamy lookahead przy każdym dopasowaniu, aby uchwycić prawidłową część ciągu: najpierw staramy się znaleźć.
lewą stronę dopasowania. W takim przypadku rejestrujemy wszystko z.
aż do cyfry, którą aktualnie dopasowujemy. W przeciwnym razie musimy znajdować się w części liczbowej wejściowej, więc przechwytujemy wszystkie liczby po dopasowaniu (w tym dopasowanie). Musimy także pozbyć się kropki dziesiętnej, więc drugie przechwytywanie jest opcjonalne. Jeśli nie ma\d
przechwytywania, spowoduje to po prostu usunięcie dopasowania z danych wejściowych.Teraz używamy etapu transliteracji, aby przekształcić wszystkie cyfry oprócz wiodących / końcowych w zera. Albo dopasowujemy komponent, który jest mniejszy niż 1,
\..+\B
gdzie\B
zapewnia, że zatrzymamy dopasowywanie jednej cyfry przed końcem, lub dopasowujemy część całkowitą, w(?<=^\d).+
której to lookbehind zapewnia, że zaczynamy jedną cyfrę od liczby. Etap transliteracji zastąpi następnie wszelkie cyfry (d
) zerami w dopasowaniach.Teraz rzeczywisty format wyjściowy
+
nie powinien wykorzystywać kanałów jako separatorów. W¶
dopasowuje wysuwu wiersza do zrobienia, że podstawienie. W tym momencie usuwamy również wiersze zawierające tylko0
s i.
s.Poprzedni etap nie usuwa wiodącego ani końcowego
0
(ponieważ nie mają one linii przed i po nich), więc usuwamy je jawnie.źródło
Python 2,
216210196175 bajtówOto trochę lekko golfowy kod, który będę grać w golfa, kiedy będę miał czas. Wykorzystuje analizę ciągów.
Wyjaśnienie
Tak więc wejście jest podzielone na liczbę całkowitą i dziesiętną. Następnie istnieje lista pętli for. W części całkowitej długość łańcucha po znaku dziesiętnym jest mnożona przez „0”, aby uzyskać tyle zer na końcu, jeśli ten znak.
W przypadku części dziesiętnej indeks bieżącego znaku to liczba zer przed nim, więc ta część jest prosta.
Try i wyjątek służy do ustalenia, czy ma część dziesiętną, czy nie (za pomocą błędu).
Ostateczny wynik jest połączony ze znakami plus.
Wypróbuj tutaj!
źródło
o if o else ["0"]
może byćo or["0"]
.o=[(...)] for
,e(I) if
,e(i[1]) if
,print "+"
, i zewnętrznej w nawiasieo=[(...)
, a także, w rzeczywistości. Na koniec możesz usunąć końcową funkcję warunkową z funkcji łączenia w następujący sposób:print"+".join(o)or"0"
ponieważ sprzężenie zwróci pustą listę, jeślio
jest pusta, więc warunek oceni ten sam sposób, który pozwoli Ci zaoszczędzić jeden bajt.Pyth, 30 bajtów
Zestaw testowy
Podstawowym rozwiązaniem jest zastąpienie wszystkich cyfr na wejściu
0
, a następnie wstawienie każdej cyfry w odpowiednim miejscu, ewaluacja, odfiltrowanie zer i połączenie plusów. Niestety, funkcja evalu Pytha nie akceptuje obecnie wiodących zer. Będę pracował, aby to naprawić.Aby obejść ten problem, dodałem funkcję pomocnika
y
, która rekurencyjnie ponawia próbę ewaluacji, dopóki nie zostanie zgłoszony błąd, usuwając za każdym razem pierwszą cyfrę. Zauważ, że ta funkcja będzie się zapętlać w nieskończoność przy nieprawidłowym wejściu.Potrzebny był również specjalny przypadek dla danych wejściowych
0
.Podsumowując, uważam, że kod jest całkiem dobry, ale możliwości językowe mogą być lepsze. Kto chce błędów?
źródło
Python 3, 138
Jest to luźno oparte na podejściu TanMath / Ogaday polegającym na odczytywaniu liczby jako ciągu i analizowaniu jej w ten sposób. Muszę użyć przypisania do gwiazdy,
i
aby poprawnie obsługiwała liczby całkowite.źródło
Python,
141132128 bajtówTen jest nadal stosunkowo czytelny. Konwertuj na ciąg i przetwarzaj
>1
cyfry oddzielnie od<1
cyfr. Mamy też specjalny przypadek zerowy. Mógłbym usunąć jeszcze dwie spacje poniżej, ale lubię to utrzymywać.Minusem jest to, że spowoduje awarię pływaków z więcej niż 9 miejscami po przecinku.
Poniżej znajduje się oryginał. Pierwsza edycja miała na celu skrócenie zerowego przypadku specjalnego, druga edycja polegała na usunięciu zera przed przecinkiem, trzecia na usunięciu dodatkowych nawiasów i spacji.
Wyjaśnienie:
źródło
Mathematica, 81 bajtów
Przypadek testowy:
źródło
CJam, 44 bajty
Wypróbuj tutaj.
Nie powiedzie się w ostatnim przypadku testowym i wyświetla następujące wyniki:
Ale powiedzmy, że to zbyt precyzyjne, że CJam nie może sobie z tym poradzić.
Wyjaśnienie
źródło
Python 3,
187180173154 bajtówUdało się zagrać w golfa o 19 bajtów więcej dzięki powyższym sugestiom @Thomas Kwa
result or['0']
, a także przestawić algebrę ( 154 bajty ):Moja najlepsza jak dotąd próba( 173 bajtów ). W oparciu o nowe podejście, patrz na dole postu:grałem w golfa mój oryginalny do 180 bajtów :
Nauczyłem się dziś nowej funkcji języka! Warunki warunkowe za pomocą indeksowania logicznego. Być może nieco go przesadziłem.
Próbowałem wyodrębnić wyrażenia, ale nie mogłem go skrócić ( 196 bajtów ):
(Sekwencje cofania są drogie!)
Choć kopalnia jest krótszy teraz, myślę TanMath może golf His w dół, aby dopasować moje: Używanie
e=enumerate
, zastępującpass
z0
, i stosując'0'
w miejsce['0']
w zestawieniu powrotnej powinien zapisać 4 + 3 + 2 = 9 bajtów! Sprowadza się to do 187. Jestem pewien, że gdzieś można zgolić kolejne kilka bajtów ...edytować Nowe podejście ( 156 bajtów ). Jednak może poradzić sobie tylko z precyzją do 6dp, podobną do wpisu CJam @ jimmy23013, więc nie przejdzie ostatniego testu. Nie mogłem go zmusić do wydrukowania więcej zer, może ktoś inny może. Zamiast tego użyłem go jako podstawy mojej najlepszej jak dotąd próby, patrz góra (również to podejście wypisuje 0 przed miejscem dziesiętnym, ale wydaje się to również poprawne). Wziął
try:... except:...
podejście od TanMath:źródło
pure bash, 210
lub
Test:
źródło
Python, 131 bajtów
Naprawdę, bardzo niechlujna funkcja rekurencyjna, prawdopodobnie nie jest to najlepszy sposób na rozwiązanie tego problemu. Dane wejściowe jak
f("10.0203")
.źródło
C,
155153161 bajtów+2 do linku w bibliotece matematycznej (samo źródło to 159).
Nie golfił
źródło
Dyalog APL , 47 bajtów
Pobiera liczbę w postaci wektora znaków, np
'123'
.Przykłady:
Uwagi:
○ Powodem zmodyfikowanego ostatniego przykładu jest to, że APL, podobnie jak niektóre inne zgłoszenia, domyślnie przełącza się na notację naukową dla takich ekstremalnych liczb.
○ Fraza
↑⍕¨f¨,¨
jest potrzebna tylko do przetworzenia wszystkich przykładów jednocześnie.źródło
Siatkówka, 113 bajtów
Obecnie znacznie dłużej niż rozwiązanie Martina, ale używa innej metody, więc postanowiłem to opublikować.
Wypróbuj online tutaj.
źródło
perl, 132 bajty
131 +1 dla
-p
przełącznika.Jest to oparte na mojej poprzedniej
sed
odpowiedzi :Zestaw testowy:
źródło
PowerShell -
172166193 bajtówWszystko w jednym wierszu:
Nie golfowany:
Przypadki testowe oraz jeden dodatkowy:
źródło
$args = 0
. Oto prosta poprawka błędu, która oszczędza również 3 bajtyPerl, 248 bajtów
Ew, jestem noobish w golfie Perl.
Wypróbuj tutaj.
źródło
5
, wróć50
.Jawa,
284244243 bajtówNiestety nie mogłem znaleźć krótszego sposobu tworzenia powtarzalnych ciągów niż:zbudujchar[]
wymaganą długośćza pomocąArrays.fill
ustawić znakiużyj,new String
aby można było połączyćDzięki inspiracji @Khaled A Khunaifer mogłem ogolić 40 bajtów.
Edit:
indexOf
trwa int, więc mogę wymienić'.'
z46
. Niestety nie wydaje się to możliwereplace
.źródło
.replace('\0','0')
funkcję zamień,String
nie oczekujchar
, powinno być.replace("\0","0")
Python, 125 bajtów
Po usunięciu mojej pierwszej odpowiedzi (sry!), Która nie mogła poradzić sobie z małymi liczbami z powodu problemów z epsilon maszyny, znalazłem inne rozwiązanie. Obsługuje zarówno liczby zmiennoprzecinkowe, jak i liczby całkowite, końcowe zera (!) I jest zapisywany jako funkcja.
Dzięki @ogaday za przydatne wskazówki i kompaktową poprawkę „0”!
Gra w golfa:
Nie golfowany:
Stosowanie:
źródło
f('0')
jednak przypadek testowy, a kiedy kopiuję i wklejam bezpośrednio do mojego tłumacza, otrzymuję notację naukową (co moim zdaniem jest w porządku). Jest takżelist(c)
krótszy. Jeśli połączysz'.'
przed przekształceniem go w listę, nie musisz go dodawać[]
. Użyciefind
zamiast indeksu w ciągu przed przekształceniem go w listę, po dodaniu'.'
również oszczędza bajt.def f(x):x+='.';i=x.find('.');z=list(x);del z[i];return"+".join([str(int(o)*10**(i-j-1))for j,o in enumerate(z)if"0"<o])or'0'
CoffeeScript, 144 bajty
Proste rozwiązanie:
Plik wykonywalny:
Pokaż fragment kodu
źródło
Stax , 18 bajtów
Uruchom i debuguj
Rozpakowane, niepolowane i skomentowane, wygląda to tak.
Uruchom ten
Podobnie jak wiele innych opublikowanych rozwiązań, produkuje
9000000+9e-7
dla ostatniego przypadku testowego. Zgodnie z ustalonym precedensem jest to dozwolone, ponieważ przypadek testowy jest zbyt precyzyjny dla języka.źródło
Lua, 350 bajtów
Myślę, że są dwa sposoby na dalszą grę w golfa:
Mógłbym użyć
macro.define
do zastąpienia niektórych wspólnych wyrażeń (nie mogę teraz przetestować i nie jestem pewien, czy to sprawi, że zyskam trochę bajtów)Użyj podziału na kropce zamiast iteracji na całym ciągu. Po raz kolejny nie jestem pewien, czy zmniejszyłoby to rozmiar tej funkcji, ponieważ manipulowanie łańcuchem w lua jest dość bolesne.
Objaśnienia
Możesz przetestować lua online i użyć następującego kodu źródłowego, aby uruchomić go z niektórymi przypadkami testowymi
źródło
C, 253 bajtów
Uwaga:
putchar(8)
należy wykonać backspace.Szczegółowe , spróbuj tutaj
źródło
sed,
136128 bajtówZmniejszony o 8 znaków przez upuszczanie spacji i bezużyteczny
0
.Przypadki testowe:
źródło
JavaScript (ES7), 114 bajtów
Działa z dowolnymi liczbami długości, ponieważ używa manipulacji ciągami w całym tekście.
Bez zrozumienia tablicy (122 bajty):
Nie golfowany:
źródło
R - 133 bajty
Solidny, ignoruje Machine Epsilon i działa również z końcowymi zerami.
a) Gra w golfa:
Nie golfowany:
Stosowanie:
źródło