Biorąc pod uwagę dwie liczby całkowite większe niż jeden, A i B, wypisz cztery wyrażenia matematyczne w następującej kolejności:
Proste wyrażenie A ^ B (A do potęgi B). np. jeśli A = 2 i B = 3
2^3
,.Ekspansja A ^ B pod względem powtarzających się wielokrotności A. np
2*2*2
.Ekspansja A ^ B pod względem powtarzających się dodatków A. np
2+2+2+2
.Rozszerzenie A ^ B pod względem powtarzających się dodatków 1. np
1+1+1+1+1+1+1+1
.
Cztery wyrażenia mogą być generowane w dowolny rozsądny sposób, o ile są one uporządkowane i wyraźnie odrębne. Na przykład możesz umieścić je na liście lub wydrukować w osobnych wierszach
2^3
2*2*2
2+2+2+2
1+1+1+1+1+1+1+1
a może na jednej linii oddzielonej znakami równości:
2^3=2*2*2=2+2+2+2=1+1+1+1+1+1+1+1
Spacje mogą być wstawiane obok operatorów matematycznych tzw
2^3 = 2 * 2 * 2 = 2 + 2 + 2 + 2 = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
byłby równie prawidłowy, gdy A = 2 i B = 3.
Możesz używać symboli alternatywnych do ^
, *
i +
, ale tylko wtedy, gdy nowe symbole są bardziej idiomatyczne dla twojego języka (np. **
Zamiast ^
w Pythonie).
Możesz założyć, że A i B są wystarczająco małe, aby A ^ B nie przepełnia domyślnego typu liczb całkowitych twojego języka (biorąc pod uwagę, że ten typ ma rozsądne maksimum, co najmniej 255).
Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
Jedno wyjście na linię. Dane wejściowe można wywnioskować, ponieważ pierwszym wyrażeniem jest zawsze A ^ B.
2^2 = 2*2 = 2+2 = 1+1+1+1
2^3 = 2*2*2 = 2+2+2+2 = 1+1+1+1+1+1+1+1
2^4 = 2*2*2*2 = 2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
2^5 = 2*2*2*2*2 = 2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^2 = 3*3 = 3+3+3 = 1+1+1+1+1+1+1+1+1
3^3 = 3*3*3 = 3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^4 = 3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^5 = 3*3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^2 = 4*4 = 4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^3 = 4*4*4 = 4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
10^2 = 10*10 = 10+10+10+10+10+10+10+10+10+10 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
13^2 = 13*13 = 13+13+13+13+13+13+13+13+13+13+13+13+13 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
źródło
=
po lewej stronie nie było żadnych zgubionych3
.2^3
jest prawidłowy format wejściowy? A może to musi być separacja spacją / przecinkiem / linefeedem czy coś takiego?Odpowiedzi:
Python 3.6 ,
8874 bajtów-2 bajty dzięki Dadzie (użycie
~
)-5 bajtów dzięki Erwanowi (użyj f-stringów z Python 3.6)
ktoś online?
W jaki sposób?
Jest to nienazwana funkcja przyjmująca dwa wejścia całkowite
a
ib
każde większe niż0
(nawet jeśli specyfikacja dotyczy tylko tych większych niż1
).W Pythonie 3.6 dostępna jest nowa funkcja, mianowicie sformatowane literały łańcuchowe lub „f-string”. Umożliwiają one budowę ciągów ocenianych w czasie wykonywania. Prowadzący
f
(lubF
) tworzy taki konstrukt, np .f"blah"
Lubf'blah'
. Wewnątrz ciągu f cokolwiek między parą nawiasów klamrowych{...}
, jest wyrażeniem do oceny.Jako takie
f"{a}^{b}={a}{f'*{a}'*~-b}={a}{f'+{a}'*~-a**~-b}=1"
ocenia każdą za
,b
,a
,f'*{a}'*~-b
,a
, if'+{a}'*~-a**~-b}
jako wyrażenia, utrzymując^
,=
,=
, i=1
jako ciągi znaków, z których każdy dostaje sklejone.a
Ib
wyrażenia ocenić przedstawicielstwa
ib
odpowiednio.f'*{a}'
Af'+{a}'
także z kolei f-strings wewnątrz tych wyrażeń, które oceniają sięa
z czołowym'*'
i czołowym'+'
odpowiednioAby utworzyć wymaganą liczbę
a
operacji i operacji dla części*
i,+
zwróć uwagę, że zostanąb
a
pomnożone razem ia**(b-1)
a
dodane. Każdy przypadek wymaga wtedy o jeden znak operatora mniej niż liczbaa
s. Możemy więc powtarzać ciągi ff'*{a}
if'+{a}'
(używając*
) tyle razy, ile jest operatorów, i dodawać je po jednyma
.(b-1)
jest~-b
i(a**(b-1))-1
jest~-a**~-b
.To samo dzieje się w przypadku
1
używania(a**b)-1
bytu~-**b
, ale nie potrzebujemy narzutu strun f, ponieważ1
jest stały, więc powtarzany standardowy ciąg jest łączony+
.Poprzednie wersje Pythona, 81:
Wypróbuj online!
źródło
(b-1)
z~-b
?lambda a,b:f"{a}^{b}={(f'*{a}'*b)[1:]}={(f'+{a}'*a**~-b)[1:]}=1"+'+1'*~-a**b
Cubix,
238 234 217 151 110100 bajtówZaoszczędzono 14 bajtów dzięki ETHProductions
Rozszerzony:
Wypróbuj online!
Wypróbuj tutaj
Wyjaśnienie
Kod składa się z 8 kroków z dwiema pętlami. Przejrzę kod po części.
Krok 1 (A ^ B)
To jest sześcian z usuniętymi częściami, które nie mają znaczenia dla pierwszego kroku. Znak zapytania pokazuje brak operacji, które odwiedzi adres IP, aby jego ścieżka była bardziej przejrzysta.
Teraz stos wygląda następująco:
A, B, A, B
Krok 2 (przygotuj się do wydruku w pętli)
Pętla drukowania trwa 3 argumenty (3 najlepsze elementy na stosie):
P
,Q
iR
.P
oznacza liczbę powtórzeń,Q
jest separatorem (kodem znaków) iR
jest liczbą do powtórzenia. Na szczęście, pętla dba również wymogu, że otrzymany ciąg powinien zakończyć się wR
nieQ
.Chcemy powtarzać
A*
dokładnieB
tyle razy, więc separatorem jest*
. Zauważ, że stos zaczyna się jakoA, B, A, B
. Po raz kolejny usunąłem wszystkie nieistotne instrukcje. Adres IP zaczyna się odS
wskazującej północy.Stos jest teraz
A, B, B, *, A
.Krok 3/6/8 (pętla drukująca)
Pojęcie
IP wchodzi do pętli przez
S
, wskazując na północ i wychodzi z pętli wE
, ponownie wskazując na północ. Dla tego wyjaśnienia stos jest ustawiony na[..., A, B, C]
. Wykonane są następujące instrukcje. Zauważ, że adres IP nie może opuścić pętli przed znakiem zapytania, więc pierwsze cztery instrukcje będą zawsze wykonywane.Realizacja
Oto znowu sześcian, z usuniętymi nieistotnymi częściami. Adres IP zaczyna się od
S
, wskazując na wschód.Jak widać, IP napotyka cztery instrukcje, zanim trafi do pętli. Ponieważ kod znakowy jest ponownie usuwany, dochodzimy do pętli z dokładnie takim samym stosem, jak weszliśmy do tej części.
Wewnątrz pętli obowiązuje powyższe wyjaśnienie.
Krok 4 (różnicowanie adresów IP)
Ponieważ używamy powyższej pętli wiele razy, a wszystkie powodują, że adres IP kończy się w tym samym miejscu, musimy rozróżnić wiele przebiegów. Po pierwsze możemy rozróżnić separator (pierwszy przebieg ma a
*
, podczas gdy drugi i trzeci mają+
separator jako). Możemy rozróżnić przebiegi 2 i 3, sprawdzając wartość liczby, która się powtarza. Jeśli tak jest, program powinien zakończyć się.Pierwsze porównanie
Oto jak to wygląda na kostce. Adres IP zaczyna się w punkcie S i wskazuje na północ. Stos zawiera
[..., * or +, A or 1, 0]
. Liczba 1 pokazuje, gdzie kończy się IP, jeśli jest to pierwsza pętla (skierowana na północ), a liczba 2 pokazuje, gdzie kończy się IP, jeśli jest to druga (lub trzecia) pętla (skierowana na wschód).Jeśli adres IP jest teraz
1
ustawiony, stos jest[A, *, +, -1]
. W przeciwnym razie stos jest[A or 1, +, +, 0]
. Jak widać, na stosie drugiego przypadku wciąż jest nieznany, więc musimy zrobić kolejne porównanie.Drugie porównanie
Ponieważ IP przeszedł kroku 5, stos wygląda jak ten:
[A^(B-1) or nothing, A or 1, +, +, 0]
. Jeśli pierwszym elementem jestnothing
, drugim jest1
, i odwrotnie. Sześcian wygląda tak, z IP zaczynającym się na S i skierowanym na wschód. Jeśli jest to druga pętla, adres IP kończy się naE
, wskazując na zachód. W przeciwnym razie program uderza@
i kończy.Wykonane instrukcje, które nic nie wpływają na przepływ sterowania, są wymienione poniżej.
Stos jest teraz
[A^B, +, A^(B-1), A-1]
, pod warunkiem, że program się nie zakończy.Krok 5 (przygotowanie do „A +” (powtórz A ^ (B-1)))
Niestety Cubix nie ma operatora mocy, więc potrzebujemy kolejnej pętli. Jednak najpierw musimy wyczyścić stos, który teraz zawiera
[B, A, *, +, -1]
.Sprzątanie
Oto znowu kostka. Jak zwykle IP zaczyna się w S (wskazując na północ), a kończy w E, wskazując na zachód.
Obliczanie A ^ (B-1)
Kolejna pętla, która działa mniej więcej tak samo jak pętla drukująca, ale jest nieco bardziej kompaktowa. Adres IP zaczyna się od
S
, wskazując na zachód, ze stosem[B, A, *]
. IP kończy się,E
wskazując na północ.Ciało pętli jest następujące.
Wynikowy stos to
[A, A^(B-1), 0]
.Czyszczenie stosu (ponownie)
Teraz musimy ponownie przejść do pętli drukowania, zawierając górę stosu
[..., A^(B-1), +, A]
. Aby to zrobić, wykonujemy następujące czynności. Oto znowu kostkaKrok 7 (przygotowanie do ostatniej pętli)
Stos jest teraz
[A^B, +, A^(B-1), A-1]
, IP zaczyna się odS
, idzie na zachód, a kończy oE
, idzie w prawo.Wykonane instrukcje:
Wygląda teraz stos
[A^B, +, 1]
, a adres IP ma zamiar wejść do pętli drukowania, więc skończyliśmy.źródło
MATL , 46 bajtów
Wypróbuj online!
Rozciągając tutaj granice „rozsądnego sposobu”, ale wyrażenia są rozdzielone.
Wyjaśnienie
Pierwsze wyrażenie:
Drugie wyrażenie:
Trzecie wyrażenie:
Czwarte wyrażenie:
źródło
JavaScript (ES7), 78 bajtów
Pobiera dane wejściowe w składni curry
(a)(b)
. Wyprowadza ciąg.Przypadki testowe
Pokaż fragment kodu
źródło
Ruby, 52 bajty
źródło
05AB1E , 30 bajtów
Wyjaśnienie:
Wypróbuj online!
źródło
¹²'^ý ¹'*¹«²<׫¹²m¹÷¹s×S'+ý 1¹²m×S'+ý»
, dlaczego pobiłeś mnie o 5 bajtów :(?¹²«¹²×¹¹²m©¹÷×1®×)vySN"^*++"èý,
jest bliżej ;). Teraz wygrywasz tylko o 1;).C (gcc) ,
156149 bajtów-2 bajty, jeśli możemy zignorować 0 mocy;
y=!!i
może zostaćy=1
Wypróbuj online!
źródło
Java 7, 170 bajtów
Nie golfowany:
Kod testowy:
Wypróbuj tutaj.
Wydajność:
źródło
Pip ,
383534 bajtów33 bajty kodu, +1 dla
-n
flagi.Bierze A i B jako argumenty wiersza poleceń; wypisuje jedno wyrażenie w linii. Wypróbuj online!
Wyjaśnienie
Ya**b
jest kod instalacyjny: szarpnija**b
doy
zmiennej. Następnie mamy listę ([]
wewnątrz) zawierającą nasze cztery wyrażenia:gJ'^
: weź pełnąg
listę ar (tutaj listę zawierającąa
ib
) iJ
włącz ją^
aRLbJ'*
: użyjR
epeatL
ist, aby utworzyć listę zb
kopiamia
, a następnieJ
włącz ją*
aRLy/aJ'+
: użyj,RL
aby utworzyć listę zy/a
(tj.a**(b-1)
) kopiamia
, a następnieJ
włącz ją+
1XyJ'+
:1
, ciąg pomnożony przezy
,J
oined on+
Lista jest drukowana z nową linią jako separatorem dzięki
-n
fladze.źródło
JavaScript
115113104 bajtówDzięki @Neil i @TukukX za grę w golfa po jednym bajcie i @ETHproductions oraz Luke za grę w golfa po 9 bajtów
Wypróbuj online
źródło
a=>b=>
.'=1'+'+1'.repeat
?.join
:a=>b=>[a+'^'+b,(a+'*').repeat(b-1)+a,(a+'+').repeat(Math.pow(a,b-1)-1)+a,1+'+1'.repeat(Math.pow(a,b)-1)].join`=`
.join()
...Galaretka , 29 bajtów
Wypróbuj online!
W jaki sposób?
źródło
tinylisp repl,
178186 bajtówUżycie repl pozwala zaoszczędzić 8 bajtów w domyślnych nawiasach zamykających na końcach linii. Definiuje funkcję,
X
która pobiera dwie liczby i zwraca listę wyrażeń. Każde wyrażenie jest w nawiasach, ze spacjami wokół operatorów (w rzeczywistości jest to lista liczb i symboli operatora):Mam nadzieję, że ten format wyjściowy jest akceptowalny. Wypróbuj online! (z kilkoma przypadkami testowymi).
Wyjaśnienie
Potrzebujemy dwóch funkcji ze standardowej biblioteki:
list
i*
.Zdefiniuj funkcję
W
(skrót od „splot”), która pobiera akumulator_
, liczbęN
, symbolS
i liczbę#
. Będziemy używać tej funkcji do generowania większości naszych wyrażeń: na przykład(W () 2 (q +) 3)
spowoduje(2 + 2 + 2)
.Jeśli liczba wynosi 1
(e # 1)
, a następnie przenieś liczbę z przodu akumulatora(c N _)
i zwróć ją. W przeciwnym razie powtórz:(c S(c N _))
: symbol i liczba z przodu poprzedniego akumulatora;N
iS
są takie same;(s # 1)
: liczba - 1.Idiom akumulatora jest potrzebny do osiągnięcia prawidłowej rekurencji ogona , zapobiegając błędowi głębokości rekurencji. (Ta zmiana odpowiada za zwiększenie liczby bajtów o +8.
13^2
Sprawa nie działała w poprzedniej wersji).Niestety, biblioteka nie ma w tej chwili funkcji potęgowania, więc musimy ją zdefiniować.
^
bierzex
iy
. Jeśliy
jest to prawda (niezerowa), rekurencja następuje za pomocąy-1
((s y 1)
) i mnożymy wynik przezx
. W przeciwnym raziey
wynosi zero i wracamy1
.(Uwaga: ta funkcja nie wykorzystuje właściwej rekurencji ogona. Zakładam, że wykładniki będą na tyle małe, że nie będą miały znaczenia. Niektóre eksperymenty na TIO wykazały maksymalny wykładnik 325, co, moim zdaniem, powinno wystarczyć do tego pytania. Jeśli PO się nie zgadza, zmienię to.)
Wreszcie, funkcja nas interesuje,
X
bierzeA
iB
i zwraca listę czterech elementów:(list A(q ^)B)
: lista zawierającaA
literał^
iB
;(W()A(q *)B)
: zadzwoń,W
aby uzyskać listęB
kopiiA
, splecionych z literałem*
;(W()A(q +)(^ A(s B 1)))
: zadzwoń,W
aby uzyskać listęA^(B-1)
kopiiA
, splecionych z literałem+
;(W()1(q +)(^ A B))
: zadzwoń,W
aby uzyskać listęA^B
kopii1
, splecionych z literałem+
.źródło
Brainfuck , 372 bajtów
Wypróbuj online!
Notatki
A**B
nie przekraczały255
. Wynika to z faktu, że pieprzenie mózgu może przechowywać tylko wartości jednego bajtu.10
staje się:
,11
staje się;
itp. Jest tak, ponieważ Brainfuck może przyjmować dane wejściowe tylko jednego bajtu.Wyjaśnienie
Oto mój nieco skomentowany kod. Rozwiążę to później.
źródło
Pyth,
3231 bajtówPrzyjmuje dane wejściowe jako
[2,10]
, dane wyjściowe jako["2^10", "2*2*2*2*2*2*2*2*2*2", "2+2+...
Wyjaśnienie:
Wypróbuj tutaj.
źródło
Perl , 81 bajtów
78 bajtów kodu +
-n
flaga (liczona jako 3 bajty, ponieważ kod zawiera$'
).Wypróbuj online!
źródło
R, 147 bajtów
Anonimowa funkcja, która generuje wymagane, dobrze, wyniki, linia po linii. To rozwiązanie w szerokim zakresie wykorzystuje
switch
funkcję.switch
Funkcja przyjmuje wyrażenie (tutajs
), którego wynikiem jest liczba lub ciąg znaków (patrz?switch
), a następnie przez alernatives odpowiadającychs
. Jeśli brakuje alternatywy (npswitch(s, a=, b= "PPCG")
. Następna nieobecna alternatywa jest oceniana (w przykładzies="a"
wyniki"PPCG"
).The
rep
funkcje powtórzeń (powtórzeń), faktycznie pierwszy argument liczba powtórzeń wskazanych w drugim argumencie.cat
, aby zakończyć, połączyć i wydrukować obiekty za pomocą separatora, który można wybrać za pomocąsep =
argumentu. Drugicat
funkcja służy tutaj do łamania linii.Nie golfowany:
źródło
CJam , 42 bajty
Wypróbuj online!
źródło
k, 44 bajtów
Przypadki testowe.
źródło
Kardynał 202 bajtów
Działa tylko dla liczb, dla których obliczona wartość <256 z powodu ograniczeń wartości, które mogą być utrzymywane przez wskaźniki w Kardynale
Wypróbuj online
Wyjaśnienie:
Krok 1
Otrzymuje dwie liczby aib jako dane wejściowe i wyjściowe jako „a ^ b =”
Przekazuje wskaźnik z aktywną wartością a i nieaktywną wartością b
Krok 2
Otrzymuje wskaźnik z aktywną wartością a i nieaktywną wartością b wypisujący „a” + („* a”) (b-1) razy
Przekazuje wskaźnik z aktywną wartością a ^ (b-1) do następnej części
Krok 3
Pobiera wskaźnik o wartości ^ (b-1) i wysyła „= a” + („+ a”) powtarzane (a ^ (b-1) -1) razy + „=”
Przekazuje wskaźnik o wartości a ^ b do następnej części
Krok 4
Otrzymuje wskaźnik o wartości a ^ b i wypisuje „1” + („+ 1”) powtarzane a ^ b-1 razy
źródło
Retina,
8988 bajtówDane wejściowe to oddzielone przecinkami liczby jednoargumentowe.
Wypróbuj online!
źródło