Emojicode 0,5, 204 201 bajtów
🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕1🍇🍎1🍉🍮s 0🔂k⏩0🐕🍇🍦t➖🐕k🍮r t🔂i⏩1 t🍇🍊😛🚮t i 0🍇🍮➕r i🍉🍉🍮➕s✖r🅰️k🍉🍎➗s🐕🍉🍉
Wypróbuj online!
-3 bajty przy użyciu „mniejszej lub równej 1” zamiast „mniejszej niż 2”, ponieważ emoji „mniej niż” ma dość długie kodowanie UTF-8. Zrobił t
też zamrożenie, aby wyciszyć ostrzeżenie bez wpływu na liczbę bajtów.
Rozszerza klasę 🚂 (liczbę całkowitą) o metodę o nazwie 🅰️. Możesz napisać prosty program, który pobiera liczbę z wejścia, wywołuje numer 🅰️ i wypisuje wynik w następujący sposób:
🏁🍇
🍦str🔷🔡😯🔤Please enter a number🔤
🍊🍦num🚂str 10🍇
😀🔡🅰️num 10
🍉🍓🍇
😀🔤Learn what a number is, you moron!🔤
🍉
🍉
Ta część może być bardzo golfa, pomijając komunikaty i obsługę błędów, ale nie jest uwzględniona w partyturze, więc wolę zamiast tego wyświetlać więcej funkcji Emojicode, jednocześnie poprawiając czytelność po drodze.
Nie golfił
🐋🚂🍇
🐖🅰️➡🚂🍇
🍊◀️🐕2🍇
🍎1
🍉
🍮sum 0
🔂k⏩0🐕🍇
🍦nmk➖🐕k
🍮sig nmk
🔂i⏩1 nmk🍇
🍊😛🚮nmk i 0🍇
🍮➕sig i
🍉
🍉
🍮➕sum✖sig🅰️k
🍉
🍎➗sum🐕
🍉
🍉
Wyjaśnienie
Uwaga: duży wybór emoji nie ma większego sensu w emojicode 0.5. W końcu to 0.x. 0.6 to naprawi.
Emojicode jest zorientowanym obiektowo językiem programowania obejmującym elementy generyczne, protokoły, opcje i zamknięcia, ale ten program nie używa żadnych zamknięć, a wszystkie rodzaje ogólne i protokoły można uznać za niejawne, a jedyna opcja pojawia się w kodzie I / O.
Program działa tylko na kilku typach: 🚂 jest typem całkowitym, 🔡 jest typem ciągu, a ⏩ jest typem zakresu. Pojawia się również kilka booleanów (👌), ale są one używane tylko w określonych warunkach. Wartości logiczne mogą przyjmować wartość 👍 lub 👎, które odpowiadają odpowiednio prawdzie i fałszowi.
Obecnie w Emojicode nie ma żadnych operatorów, więc dodawanie, porównywanie i inne operacje, które normalnie są operatorami, są implementowane jako funkcje, dzięki czemu wyrażenia używają notacji z prefiksem . Operatorzy są również planowani w wersji 0.6.
Najpierw zajmiemy się programem testowym.
🏁
To jest blok 🏁, który można porównać do głównego z innych języków.
🍇 ... 🍉
Winogrona i arbuzy deklarują bloki kodu w emojicode.
🍦str🔷🔡😯🔤Please enter a number🔤
To deklaruje nazwę „zamrożoną” str
i ustawia jej wartość na nowy ciąg utworzony za pomocą inicjatora (konstruktora) 😯, który przyjmuje monit jako ciąg, a następnie wprowadza wiersz od użytkownika. Po co używać zamrożonego zamiast zmiennej? Nie zmieni się, więc zmienna wyemituje ostrzeżenie.
🍊🍦num🚂str 10
Rozwalmy to. 🚂str 10
wywołuje metodę 🚂 na obiekcie jest tworzona z nieopakowaną wartością opcjonalną, a warunek jest oceniany na 👍, (prawda). Dlatego w normalnym użyciu wprowadzany jest blok następujący po warunkowym.str
zamrożonym argumentem 10. Zgodnie z konwencją metody nazwane nazwą typu konwertują obiekt na ten typ. 10 jest podstawą do konwersji liczb całkowitych. Ta metoda zwraca opcjonalny, 🍬🚂
. Opcjonalne mogą zawierać wartość typu podstawowego lub nicość, ⚡. Gdy ciąg nie zawiera liczby, zwracane jest ⚡. Aby użyć wartości, należy rozpakować opcjonalne za pomocą 🍺, co powoduje błąd w czasie wykonywania, jeśli wartość wynosi ⚡. Dlatego dobrą praktyką jest sprawdzanie nicości przed rozpakowaniem opcjonalnego. W rzeczywistości jest tak powszechne, że Emojicode ma na to skrót. Zwykle🍊
jest „jeśli”.🍊🍦 variable expression
oznacza: oceń wyrażenie. Jeśli opcjonalne zawiera nicość, warunek jest oceniany na 👎 (fałsz). W przeciwnym razie zamrożona nazwavariable
🍇 ... 🍉
😀🔡🅰️num 10
🅰️ to metoda, którą główny kod dodaje do 🚂 za pomocą 🐋, która oblicza liczbę partycji. To wywołuje 🅰️ num
zamrożonego, który zadeklarowaliśmy w warunkowej, i konwertuje wynik na ciąg znaków przy użyciu podstawy 10 metodą 🔡. Następnie 😀 drukuje wynik.
🍓🍇 ... 🍉
🍓 oznacza „else”, więc ten blok jest wprowadzany, gdy użytkownik nie wprowadził poprawnie liczby.
😀🔤Learn what a number is, you moron!🔤
Drukuje literał ciągu.
Teraz spójrzmy na program główny. Wyjaśnię wersję bez golfa; w wersji golfowej właśnie usunięto białe spacje i zmieniono nazwy zmiennych na nazwy jednoliterowe.
🐋🚂🍇 ... 🍉
Rozszerz klasę 🚂. Jest to funkcja, która nie jest powszechnie spotykana w językach programowania. Zamiast tworzyć nową klasę z 🚂 jako nadklasą, 🐋 bezpośrednio modyfikuje 🚂.
🐖🅰️➡🚂🍇 ... 🍉
Tworzy nową metodę o nazwie 🅰️, która zwraca 🚂. Zwraca liczbę partycji obliczoną za pomocą formułya(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🍊⬅🐕1🍇
🍎1
🍉
🐕 jest podobny do innych języków this
lub self
z innych języków i odnosi się do obiektu, dla którego metoda została wywołana. Ta implementacja jest rekurencyjna, więc jest to warunek końcowy: jeśli liczba, na którą wywołano metodę, jest mniejsza lub równa 1, zwraca 1.
🍮sum 0
Utwórz nową zmienną sum
i ustaw ją na 0. Domyślnie zakłada się, że wpisz 🚂.
🔂k⏩0🐕
🔂 iteruje nad wszystkim, co implementuje protokół,, podczas gdy ⏩ to dosłowny zakres, który zdarza się implementować 🔂🐚🚂. Zakres ma wartość początkową, wartość zatrzymania i wartość kroku, która przyjmuje się, że wynosi 1, jeśli w start < stop
przeciwnym razie -1. Można również określić wartość kroku za pomocą ⏭, aby utworzyć literał zakresu. Wartość początkowa jest włącznie, natomiast wartość przystanek jest wyłączna, więc jest to równoważne for k in range(n)
lub Sum_{k=0..n-1}
w formule.
🍦nmk➖🐕k
Musimy obliczyć sigma (n - k), czyli sumę dzielników, n - k
innymi słowy, a argument jest potrzebny kilka razy, więc zapisuje się n - k
w zmiennej, nmk
aby zapisać niektóre bajty.
🍮sig nmk
🔂i⏩1 nmk
To ustawia sig
zmienną na argument sigma i iteruje wszystkie liczby od 1 do nmk - 1
. Mógłbym zainicjować zmienną na 0 i iterować po 1..nmk, ale robienie tego w ten sposób jest krótsze.
🍊😛🚮nmk i 0
🚮 oblicza resztę, moduł i 😛 sprawdza równość, więc warunkiem będzie 👍, jeśli i
jest dzielnikiem nmk
.
🍮➕sig i
Jest to zadanie na telefon, podobne do += -= >>=
rodziny operatorów w niektórych gorszych językach wolnych od emoji. Ten wiersz można również zapisać jako 🍮 sig ➕ sig i
. Dlatego po zakończeniu pętli wewnętrznej sig
będzie zawierać sumę dzielników n - k
lubsigma(n - k)
🍮➕sum✖sig🅰️k
Kolejne zadanie przez połączenie, więc dodaje sigma(n - k) * A(k)
się do całości, tak jak w formule.
🍎➗sum🐕
Na koniec suma jest dzielona przez n i zwracany jest iloraz. To wyjaśnienie prawdopodobnie zajęło trzy razy tyle samo czasu, co napisanie samego kodu ...