Wyzwanie:
W sieciach społecznościowych krąży głupia łamigłówka, która brzmi:
8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?
Zaimplementuj funkcję lub operator, który, jeśli otrzyma dwie dodatnie liczby całkowite xi ytaki, który x > y > 0daje poprawną odpowiedź jako liczbę całkowitą , gdzie cyfry odpowiedzi to cyfry, x * ypo której następuje cyfra, x + ypo której następuje cyfra x - y. Bardzo prosty.
Zasady:
- Standardowe luki są niedozwolone.
- To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach.
- Sprawdzanie poprawności danych wejściowych nie jest wymagane. Ten program może się zawiesić lub zwrócić śmieci, jeśli otrzyma nieprawidłowe dane wejściowe.
- Możesz używać funkcji numerycznych i operatorów (w tym liczb całkowitych i zmiennoprzecinkowych, funkcji biblioteki matematycznej i innych funkcji, które akceptują i zwracają liczby).
- Możesz użyć funkcji, która zwraca liczbę cyfr liczby, jeśli dotyczy.
- Teraz nie wolno używać łańcuchów lub jakiejkolwiek konkatenacji gdziekolwiek w kodzie.
- Wynik może zostać zwrócony lub przekazany na stos, w zależności od tego, który język ma zastosowanie. Wynik musi być liczbą całkowitą, a nie ciągiem.
Przykładowy kod:
Poniższy kod tworzy dynamiczny operator o nazwie X.
X ← {(⍺-⍵) + ((⍺ + ⍵) × 10 * 1 + ⌊10⍟⍺-⍵) + ⍺ × ⍵ × 10 * (2 + ⌊10⍟⍺ + ⍵) + ⌊10⍟⍺- ⍵}
Wyjaśnienie:
W APL oceniasz od prawej do lewej.
⍺ and ⍵są odpowiednio lewym i prawym operandem⌊10⍟⍺-⍵brzmi:floor of log10(⍺-⍵). Najpierw wykonuje odejmowanie, następnie logarytm, a następnie podłogę. Z prawej do lewej. log10 odbywa się w celu zliczenia cyfr⍺-⍵(należy następnie zsumować 1).⍺×⍵×10*(...)czyta:10 to the (...)th power, multiplied by ⍵, multiplied by ⍺Stąd
⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵iloczyn produktu przesunięty w lewo o sumę liczby cyfr sumy i różnicy. Pomnożenie przez potęgę 10 spowoduje przesunięcie liczby całkowitej w lewo.((⍺+⍵)×10*1+⌊10⍟⍺-⍵)to suma przesunięta w lewo o liczbę cyfr różnicy.(⍺-⍵)jest różnica. Nie jest wymagana żadna zmiana biegów.X←{...}to sposób definiowania operatora w APL.
Przykłady:
8 X 2
16106
5 X 4
2091
9 X 6
54153
GNU dc:
Poniższy kod tworzy makro o nazwie a:
[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa
Wyjaśnienie:
sxisywyskakuje element ze stosu i zapisuje go odpowiednio w rejestrachxiy.lxilyzaładuj element z rejestrówxiyodpowiednio i wepchnij go na stos.dduplikuje ostatni element na stosie.^oblicza potęgę dwóch liczb.Zwyskakuje liczba i zwraca liczbę cyfr. Odbywa się to, ponieważdcnie ma funkcji logarytmu.[...]saprzechowuje makro w rejestrzea.laładuje to.xwykonuje makro na górze stosu.
Przykłady:
8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153