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 x
i y
taki, który x > y > 0
daje poprawną odpowiedź jako liczbę całkowitą , gdzie cyfry odpowiedzi to cyfry, x * y
po której następuje cyfra, x + y
po 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:
sx
isy
wyskakuje element ze stosu i zapisuje go odpowiednio w rejestrachx
iy
.lx
ily
załaduj element z rejestrówx
iy
odpowiednio i wepchnij go na stos.d
duplikuje ostatni element na stosie.^
oblicza potęgę dwóch liczb.Z
wyskakuje liczba i zwraca liczbę cyfr. Odbywa się to, ponieważdc
nie ma funkcji logarytmu.[...]sa
przechowuje makro w rejestrzea
.la
ładuje to.x
wykonuje makro na górze stosu.
Przykłady:
8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153
źródło
Odpowiedzi:
JavaScript (ES7),
636159 bajtówZaoszczędzono 4 bajty dzięki Neilowi .
źródło
10**-~Math.log10(c)
. (Alereduce
oczywiście +1 za użycie ).async
/await
i operator potęgowania**
**
jest naprawdę przydatne, zgadzam się. To powinno być w ES6.C,
7975 bajtówDzięki @GB za zapisanie 4 bajtów!
Wypróbuj online!
źródło
Bash, 66
Wypróbuj online .
źródło
$[...]
podlegają rozszerzaniu parametrów bez wyraźnego$
(np.d
Zamiast$d
) zapisywania dwóch znaków.((s=$1+$2,d=$1-$2))
aby zainicjalizować dwie zmienne.EXCEL, 61 bajtów
Excel, 18 bajtów niepoprawny
źródło
Skumulowane , 36 bajtów
Wypróbuj online!
Poprzednio:
,@A$(-+*){!A...n!}"!:inits$#'"!$summap:[email protected]\^1\,\*sum
Spróbuję wycisnąć bajt lub dwa przed napisaniem wyjaśnienia. (
#'
= rozmiar i"
jest „zrób na każdym”, nie dołączono tutaj żadnych ciągów.)Noncompeting na 26 bajtów:
$(*+-)#!!:{%y#'10\^x*y+}#\
.źródło
TI-Basic,
3433 bajtyźródło
Prompt A,B
powinien również działaćGNU dc, 36
Definiuje makro,
m
które bierze dwa górne elementy stosu, stosuje makro i pozostawia wynik na stosie (jak w przykładzie w pytaniu):Wypróbuj online .
źródło
Perl 6 ,
81 6158 bajtówSpróbuj
Spróbuj
Spróbuj
źródło
x-y
jest to prawidłowy identyfikator.Galaretka , 27 bajtów
Definiuje diademiczne łącze / funkcję, które można wywołać za pomocą
ç
. Pobiera na wejściu dwie liczby całkowite i zwraca liczbę całkowitą. Ma dodatkową zaletę, że jest w stanie wziąć x<
y lub x>
y przy użyciu absolutnej różnicy.Wypróbuj online!
Wyjaśnienie:
Detale:
źródło
PHP,
7975 bajtówdwie wersje:
pobiera dane wejściowe z argumentów wiersza poleceń; biegać z
-r
.Wydaje mi się, że
strlen
kwalifikuje się jako „funkcja zwracająca liczbę cyfr”,chociaż używa liczby jako łańcucha. Daj mi znać, jeśli nie.
źródło
strlen
była poprawna.C (gcc) , 70 bajtów
Wypróbuj online!
na podstawie odpowiedzi Steadyboksa , umieszczając wszystko w makrze, aby trochę więcej w golfa.
(Uwaga: nieoczekiwanie przypisanie wyniku
d
zamiasta
pracy. Spojrzałem na wygenerowany kod asemblera i wydaje się być w porządku.)źródło
Haskell, 54 bajty
Układanka jest realizowana za pomocą funkcji infix
#
, np8#2 = 16106
. Druga funkcja%
definiuje konkatenację base-10 (przy założeniu, że RHS jest większy niż 0).źródło
Dyalog APL, 31 bajtów
{a⊥⍨10*1+⌊10⍟a←(⍺×⍵)(⍺+⍵)(⍺-⍵)}
na podstawie przykładowego kodu APL z opisu problemu
źródło
PHP, 87 bajtów
i nieprawidłowe rozwiązanie dla 37 bajtów
źródło
Ruby, 61 bajtów
Które podejrzanie wygląda bardzo podobnie do tej odpowiedzi Javascript, ale bez logarytmu.
źródło
Python,
9291 znakówDzięki sugestii Czarodziejów;)
źródło
)
iif
.R (3.3.1), 104 bajty
zwraca anonimową funkcję.
To moja pierwsza gra w golfa, więc wszelkie uwagi są mile widziane.
źródło
REXX, 70 bajtów
Oczywiście rodzimy sposób byłby znacznie krótszy:
źródło
PowerShell, 88 bajtów
PowerShell nie ma operatora mocy, który nie pomaga. Nie można również policzyć długości liczby całkowitej, chyba że policzymy ją jako ciąg, czego nie możemy zrobić, więc sprawdzam, czy jest to
-gt
9, aby poznać długość. Prawdopodobnie może być bardziej zwięzły, ale muszę wrócić do pracy.źródło
Python 2.7,
10996 bajtówPoprawione po przestrzeganiu zasad konkursu. Kredyty dla mbomb007 za obniżenie kodu z 109 bajtów do 96 bajtów
źródło
•You're not allowed to use strings or any kind of concatenation anywhere in your code.
a
lambda.a=lambda n:10**int(...
. Możesz także zrobićb,c=input()
, podając dwa wejścia oddzielone przecinkiem.J , 25 bajtów
*;+;-
Umieść wyniki każdej operacji.10#.inv&.>
Konwertuj każdy wynik na tablicę 10 cyfr podstawowych. (inv
jest^:_1
)[:;
Rozpakuj i dołącz do tablic.10#.
Konwertuj tablicę 10 cyfr podstawowych na liczbę całkowitą.X=.
zdefiniuj powyższe jako operatorX
.Wyniki:
źródło
X=.
Mathematica, 67 bajtów
Bierze
x-y
, a następnie bierze log10x-y
, zaokrągla w górę, oblicza 10 do potęgi tego, a następnie mnoży przezx+y
. Ale musimy również rozważyćlog10(x-y)
bycie 0, więc zamieniamy 0 na 1. Następnie bierzemy log102x
, zaokrąglone w górę, plus 1 i znajdujemy 10 na potęgę tego. Pomnóż to przezxy
i dodaj to.źródło
05AB1E ,
232216 bajtówWypróbuj online!
Moglibyśmy zaoszczędzić kilka bajtów, gdybyśmy mogli używać ciągów w programie (ale nie w obliczeniach), zapętlając ciąg zawierający operacje
"-+*"
, ponieważ kod wykonywany dla każdej operacji jest taki sam.Oczywiście, gdyby pozwolono nam korzystać z konkatenacji, zaoszczędzilibyśmy znacznie więcej.
źródło
R, 64 bajty
Stosowanie:
źródło