[Algorytmy] Funkcja dwóch zmiennych dla podanych wejść
[Algorytmy] Funkcja dwóch zmiennych dla podanych wejść
Witam serdecznie,
Nie wiem czy jestem już zmęczony, czy może coś przeoczyłem albo po prostu nie da się tego tak "ładnie" zrobić.
Jest funkcja dwóch zmiennych: \(\displaystyle{ f\left(x, y\right)}\)
Na wyjściu, może zwrócić jedną z wartości podanych w zbiorze: \(\displaystyle{ \left\{1, 2, 3\right\}}\) (lub też \(\displaystyle{ 0}\), aczkolwiek, najlepiej by go w wyniku zabrakło).
Zmienna \(\displaystyle{ x}\) oraz \(\displaystyle{ y}\) \(\displaystyle{ \subset \left\{0, 1, 2, 3\right\}}\)
Teraz jak miała by funkcja \(\displaystyle{ f}\) działać.
Przede wszystkim, chciałbym zaznaczyć, że "zabrałem" się do tego w systemie BIN, bo docelowo tak ma działać algorytm (tzn. najlepiej by było).
Wytłumaczę to na przykładzie.
Zawsze do porównania są dwie zmienne (czyli \(\displaystyle{ x}\) i \(\displaystyle{ y}\)).
Chciałbym by w zależności od danych wejściowych, funkcja zwracała wartości właśnie te ze zbioru jaki podałem wyżej.
\(\displaystyle{ f\left(0, 0\right) \rightarrow 1 \vee 2 \vee 3}\)
\(\displaystyle{ f\left(0, 1\right) \rightarrow 2 \vee 3}\)
\(\displaystyle{ f\left(0, 2\right) \rightarrow 1 \vee 3}\)
\(\displaystyle{ f\left(0, 3\right) \rightarrow 1 \vee 2}\)
\(\displaystyle{ f\left(1, 1\right) \rightarrow 2 \vee 3}\)
\(\displaystyle{ f\left(1, 2\right) \rightarrow 3}\)
\(\displaystyle{ f\left(1, 3\right) \rightarrow 2}\)
\(\displaystyle{ f\left(2, 2\right) \rightarrow 1 \vee 3}\)
\(\displaystyle{ f\left(2, 3\right) \rightarrow 1}\)
\(\displaystyle{ f\left(3, 3\right) \rightarrow 1 \vee 2}\)
Już próbowałem xor-ować, and-ować itp. różnych kombinacji.
Niektóre sprawdzały się tylko dla kilku powyższych przypadków, inne wcale.
Czy w ogóle da się stworzyć taką funkcję?
Oczywiście, można pogrupować wyniki i potem porównując z wzorcem, wyciągnąć wyniki z tablicy/pamięci/... (jako stałe), ale wolałbym tego uniknąć ("if else" zawsze wstawić można).
Jeśli da się to zrobić logiką binarną i ewentualnie jakimiś prostymi nie złożonymi operacjami (dodawanie, odejmowanie, mnożenie, przesuwanie itp.) to było by fajnie.
Jeśli miały by się tam pojawić jakieś wymyślne przeliczenia to gra nie warta świeczki, no ale może, jednak da się to sparametryzować.
Z góry przepraszam, jeśli coś nie jest jasne albo dziwnie brzmi - mam nadzieję, że nie używałem jakiś skrótów myślowych, jeśli tak to dajcie znać, postaram się dany fragment lepiej opisać.
Pozdrawiam i dziękuję za ewentualne podpowiedzi.
Nie wiem czy jestem już zmęczony, czy może coś przeoczyłem albo po prostu nie da się tego tak "ładnie" zrobić.
Jest funkcja dwóch zmiennych: \(\displaystyle{ f\left(x, y\right)}\)
Na wyjściu, może zwrócić jedną z wartości podanych w zbiorze: \(\displaystyle{ \left\{1, 2, 3\right\}}\) (lub też \(\displaystyle{ 0}\), aczkolwiek, najlepiej by go w wyniku zabrakło).
Zmienna \(\displaystyle{ x}\) oraz \(\displaystyle{ y}\) \(\displaystyle{ \subset \left\{0, 1, 2, 3\right\}}\)
Teraz jak miała by funkcja \(\displaystyle{ f}\) działać.
Przede wszystkim, chciałbym zaznaczyć, że "zabrałem" się do tego w systemie BIN, bo docelowo tak ma działać algorytm (tzn. najlepiej by było).
Wytłumaczę to na przykładzie.
Zawsze do porównania są dwie zmienne (czyli \(\displaystyle{ x}\) i \(\displaystyle{ y}\)).
Chciałbym by w zależności od danych wejściowych, funkcja zwracała wartości właśnie te ze zbioru jaki podałem wyżej.
\(\displaystyle{ f\left(0, 0\right) \rightarrow 1 \vee 2 \vee 3}\)
\(\displaystyle{ f\left(0, 1\right) \rightarrow 2 \vee 3}\)
\(\displaystyle{ f\left(0, 2\right) \rightarrow 1 \vee 3}\)
\(\displaystyle{ f\left(0, 3\right) \rightarrow 1 \vee 2}\)
\(\displaystyle{ f\left(1, 1\right) \rightarrow 2 \vee 3}\)
\(\displaystyle{ f\left(1, 2\right) \rightarrow 3}\)
\(\displaystyle{ f\left(1, 3\right) \rightarrow 2}\)
\(\displaystyle{ f\left(2, 2\right) \rightarrow 1 \vee 3}\)
\(\displaystyle{ f\left(2, 3\right) \rightarrow 1}\)
\(\displaystyle{ f\left(3, 3\right) \rightarrow 1 \vee 2}\)
Już próbowałem xor-ować, and-ować itp. różnych kombinacji.
Niektóre sprawdzały się tylko dla kilku powyższych przypadków, inne wcale.
Czy w ogóle da się stworzyć taką funkcję?
Oczywiście, można pogrupować wyniki i potem porównując z wzorcem, wyciągnąć wyniki z tablicy/pamięci/... (jako stałe), ale wolałbym tego uniknąć ("if else" zawsze wstawić można).
Jeśli da się to zrobić logiką binarną i ewentualnie jakimiś prostymi nie złożonymi operacjami (dodawanie, odejmowanie, mnożenie, przesuwanie itp.) to było by fajnie.
Jeśli miały by się tam pojawić jakieś wymyślne przeliczenia to gra nie warta świeczki, no ale może, jednak da się to sparametryzować.
Z góry przepraszam, jeśli coś nie jest jasne albo dziwnie brzmi - mam nadzieję, że nie używałem jakiś skrótów myślowych, jeśli tak to dajcie znać, postaram się dany fragment lepiej opisać.
Pozdrawiam i dziękuję za ewentualne podpowiedzi.
Ostatnio zmieniony 10 maja 2014, o 10:07 przez Afish, łącznie zmieniany 2 razy.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
-
- Użytkownik
- Posty: 22210
- Rejestracja: 15 maja 2011, o 20:55
- Płeć: Mężczyzna
- Lokalizacja: Bydgoszcz
- Podziękował: 38 razy
- Pomógł: 3755 razy
[Algorytmy] Funkcja dwóch zmiennych dla podanych wejść
Rzeczywiście, przeoczyłeś coś na lekcji polskiego. "Dwuch" to "fstyt"-- 9 maja 2014, o 22:50 --\(\displaystyle{ h:\{0,1,2,3\}^2\to 2^{\{1,2,3\}}}\) określamy tak:
\(\displaystyle{ h(a,b)=\{1,2,3\}\setminus \{a\}\setminus \{b\}}\).
\(\displaystyle{ g:2^{\{1,2,3\}}\to \{1,2,3\}}\) definiujemy jako \(\displaystyle{ g(A)=\min A}\).
Wtedy \(\displaystyle{ f=g\circ h}\)
\(\displaystyle{ h(a,b)=\{1,2,3\}\setminus \{a\}\setminus \{b\}}\).
\(\displaystyle{ g:2^{\{1,2,3\}}\to \{1,2,3\}}\) definiujemy jako \(\displaystyle{ g(A)=\min A}\).
Wtedy \(\displaystyle{ f=g\circ h}\)
[Algorytmy] Funkcja dwóch zmiennych dla podanych wejść
Niezbyt jest to dla mnie jasne (jakie \(\displaystyle{ A}\)? \(\displaystyle{ min A}\)?)a4karo pisze: \(\displaystyle{ h:\{0,1,2,3\}^2\to 2^{\{1,2,3\}}}\) określamy tak:
\(\displaystyle{ h(a,b)=\{1,2,3\}\setminus \{a\}\setminus \{b\}}\).
\(\displaystyle{ g:2^{\{1,2,3\}}\to \{1,2,3\}}\) definiujemy jako \(\displaystyle{ g(A)=\min A}\).
Wtedy \(\displaystyle{ f=g\circ h}\)
Mógłbym to trochę bardziej rozwinąć?
Dzięki
[Algorytmy] Funkcja dwóch zmiennych dla podanych wejść
Hmm przeczytałeś całość mojego posta?a4karo pisze:najmniejsza liczba z zbiorze \(\displaystyle{ A}\)
Nie za bardzo rozumiem w ogóle to co napisałeś? (jakie \(\displaystyle{ A}\) gdzie zdefiniowane? jak?)
Po drugie w poście pytałem o możliwie proste działania (dodawanie, odejmowanie,..., and, or...), a tu widzę piszesz \(\displaystyle{ min}\) (czyli to czego chciałem uniknąć)... złożenie funkcji?
-
- Użytkownik
- Posty: 22210
- Rejestracja: 15 maja 2011, o 20:55
- Płeć: Mężczyzna
- Lokalizacja: Bydgoszcz
- Podziękował: 38 razy
- Pomógł: 3755 razy
[Algorytmy] Funkcja dwóch zmiennych dla podanych wejść
\(\displaystyle{ A}\) to dowolny podzbiór zbioru \(\displaystyle{ \{1,2,3\}}\). Tak sie skłąda, że wartościa funkcji \(\displaystyle{ h}\) jest zawsze zbiór niepusty, więc minimum jest dobrze okreslone.
Jak chcesz sie bawić w programowanie, to takie trywialne rzeczy jak minimum nie powinny byc skompliowane.
Jak chcesz sie bawić w programowanie, to takie trywialne rzeczy jak minimum nie powinny byc skompliowane.
[Algorytmy] Funkcja dwóch zmiennych dla podanych wejść
Widzę, że nie czytasz ze zrozumieniem i w dodatku jesteś bardzo niemiły.a4karo pisze:\(\displaystyle{ A}\) to dowolny podzbiór zbioru \(\displaystyle{ \{1,2,3\}}\). Tak sie skłąda, że wartościa funkcji \(\displaystyle{ h}\) jest zawsze zbiór niepusty, więc minimum jest dobrze okreslone.
Jak chcesz sie bawić w programowanie, to takie trywialne rzeczy jak minimum nie powinny byc skompliowane.
Napisze, że nie znasz odpowiedzi i tyle, albo napisz ją tak, bym ja głupiec mógł to zrozumieć.
Jeśli chcesz się droczyć i udowadniać jaki to nie jesteś wspaniały i genialny to Ci ułatwię jesteś geniuszem, jest ok?
Teraz do rzeczy, jeśli masz mi pisać cały czas w podobny sposób bez konkretów rzucając jakimiś definicjami bez zrumienia tematu jaki zadałem to jak Cię proszę nie pisz.
Pamiętaj, że Ciebie mogą ocenić równie szybko i niesłusznie.
Pozdrawiam
-
- Moderator
- Posty: 2828
- Rejestracja: 15 cze 2008, o 15:45
- Płeć: Mężczyzna
- Lokalizacja: Seattle, WA
- Podziękował: 3 razy
- Pomógł: 356 razy
[Algorytmy] Funkcja dwóch zmiennych dla podanych wejść
Każdą liczbę \(\displaystyle{ n}\) zapisujesz jako \(\displaystyle{ n}\)-ty zapalony bit od prawej strony (matematycznie jest to \(\displaystyle{ 2^n}\)), czyli masz:
\(\displaystyle{ 0 = 0001\\
1 = 0010\\
2 = 0100\\
3 = 1000}\)
Teraz \(\displaystyle{ f(x,y) = \neg \left(\left(1<<x\right) \vee \left(1<<y\right) \right)}\). Z wyniku bierzesz dowolny zapalony bit i ponownie korzystasz z tabelki, albo obliczasz logarytm o podstawie dwa i bierzesz podłogę.
\(\displaystyle{ 0 = 0001\\
1 = 0010\\
2 = 0100\\
3 = 1000}\)
Teraz \(\displaystyle{ f(x,y) = \neg \left(\left(1<<x\right) \vee \left(1<<y\right) \right)}\). Z wyniku bierzesz dowolny zapalony bit i ponownie korzystasz z tabelki, albo obliczasz logarytm o podstawie dwa i bierzesz podłogę.
[Algorytmy] Funkcja dwóch zmiennych dla podanych wejść
Dzięki Afish.Afish pisze:Każdą liczbę \(\displaystyle{ n}\) zapisujesz jako \(\displaystyle{ n}\)-ty zapalony bit od prawej strony (matematycznie jest to \(\displaystyle{ 2^n}\)), czyli masz:
\(\displaystyle{ 0 = 0001\\
1 = 0010\\
2 = 0100\\
3 = 1000}\)
Teraz \(\displaystyle{ f(x,y) = \neg \left(\left(1<<x\right) \vee \left(1<<y\right) \right)}\). Z wyniku bierzesz dowolny zapalony bit i ponownie korzystasz z tabelki, albo obliczasz logarytm o podstawie dwa i bierzesz podłogę.
Do podobnego kodowania również doszedłem, ale problem jest taki, że tu kodujesz za pomocą 4 bitów, a to mnie nie urządza (wystarczą mi 3 stany wyrażone 2 bitami + 0, tzn. źle... napisałem, że wystarczą powinienem użyć słowa, muszą - chodzi o to by zużyć jak najmniej w bajcie i jednocześnie jak najwięcej upakować). Logarytm raczej odpada.
Dziękuję raz jeszcze Afish za zainteresowanie.
Właściwie mogę uznać, że pytanie dostało satysfakcjonującą mnie odpowiedź - nie w prost, ale dla mnie wystarczającą - chyba, że ktoś ma jeszcze jakiś pomysł?
Pozdrawiam
-
- Moderator
- Posty: 2828
- Rejestracja: 15 cze 2008, o 15:45
- Płeć: Mężczyzna
- Lokalizacja: Seattle, WA
- Podziękował: 3 razy
- Pomógł: 356 razy
[Algorytmy] Funkcja dwóch zmiennych dla podanych wejść
Jeżeli musisz mieścić się na kodowaniu binarnym, to nic mi nie przychodzi do głowy. Z drugiej strony rozwiązaniem jest zawsze jedna z trzech liczb (\(\displaystyle{ 1, 2}\) lub \(\displaystyle{ 3}\)), więc łatwo sprawdzić, która z nich spełnia wymagania.
[Algorytmy] Funkcja dwóch zmiennych dla podanych wejść
Tak tak, zgadza się AfishAfish pisze:Jeżeli musisz mieścić się na kodowaniu binarnym, to nic mi nie przychodzi do głowy. Z drugiej strony rozwiązaniem jest zawsze jedna z trzech liczb (\(\displaystyle{ 1, 2}\) lub \(\displaystyle{ 3}\)), więc łatwo sprawdzić, która z nich spełnia wymagania.
Jak pisałem w pierwszym poście, myślałem, że uda się wyłuskać jakąś zależność i pominąć lub co najmniej w maksymalnym stopniu uniknąć porównań/sprawdzeń itp., ale po wczorajszej walce do późna, stwierdziłem, że mimo wyników z jednej grupy i swoistych dyskretnych zależności, porównania muszą być (co najmniej jedno), ale chyba i tak rezultat - jak dla mnie - jest satysfakcjonujący
Serdecznie dziękuję.
Pozdrawiam