Konkurs oraz ocena kodu

Konkurs oraz ocena kodu
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
4

Witam wszystkich ;)

Ostatnio strasznie mi się nudziło, więc przez ostatnie 5 dni pisałem własny prosty "język programowania" oparty na BeFunge.
W paczce jest edytor (wraz z prostym debuggerem i kodem źródłowym), krótki poradnik oraz .... konkurs.
Zamieszczając post w tym dziale liczę po części na ocenę kodu, który napisałem (jakoś nie chciało mi się komentować, ale liczę na to, że dacie radę się w nim zorientować ;)), a po części także na to, że ktoś się tym zainteresuje i spróbuje swoich sił w moim konkursie.
Edytor napisany jest w Delphi, lecz sama biblioteka będąca interpreterem w Lazarusie (na początku także chciałem napisać edytor w Lazarusie, ale przegrałem walkę z SynEditem).
A powracając do konkursu - należy rozpracować ten kod:

Kopiuj
v>v>>:1av*:l1a'18'62j27'15'               @#< >062j
&& /j260_">    ^"04p042j>">3> > > >"00p002j ^_^#N=d::/*,<
>^*^<>"Stage 1 finished :> 3 more to go.",Nv>"Almost ;)"^
  >2^^v      /             3              #<^#p3'15'">"<>062j
<><><>>>v<><>>"Stage 2 finished :> 2 more to go.",Nv^  |  $   <
>072j   >::d=|j21'25'                              <   >^ '100'
"Failed :<",@>062j>"Stage 3 finished :> 1 more to go.",N>>^
"Success! :D",@>:l\:'220000'-l\2;\//'18'0gd/d:'13'a*v
>>V/*:d\-'100'*'25'v            v3<           <     <                                
               j270_062j        >*:'9000000'`!|
                                              >082j

user image


Dokładniej: kod prosi użytkownika o dwie liczby i wykonuje na nich czarną magię, po czym jeżeli wprowadzone liczby wytrzymały tortury, wyświetlana jest informacja `"Success! :D"` (od razu mówię, iż wprowadzenie dwa razy zera nie jest poprawnym rozwiązaniem, trzeba cały kod przeanalizować i podebugować (w edytorze jest kolorowanie składni i parę innych rzeczy, które to ułatwią)). Jest wiele liczb spełniających ten kod, lecz pomimo wszystko nie radzę brute-forceować ;) Kto wyśle więcej liczb, niebędących kolejnymi po sobie, a będących poprawnymi, wygra ... e.... satysfakcję z rozpracowania kodu :D

Wszelkie rozwiązania proszę pisać na moje PW, a oceny kodu jak i samego edytora, proszę pisać w tym temacie.
Czas konkursu: od teraz do odwołania.

Pozdrawiam :)

PS: ten kod na pierwszy rzut oka jest rzeczywiście czarną magią (chyba, że ktoś masowo pisze w językach ezoterycznych pokroju BeFunge), lecz - jak już napisałem wcześniej - w paczce w załączniku znajduje się krótki tutorial oraz parę dem, więc chyba się odnajdziecie ;)

PS2: jeżeli pomysł się sprawdzi, być może zorganizuje więcej konkursów tego typu.


edytowany 3x, ostatnio: Patryk27
Patryk27
Wyszła wersja 0.2 (jakby ktoś nie śledził dyskusji). Do pobrania w tym poście: http://4programmers.net/Forum/Off-Topic/Oceny_i_recenzje/130176-konkurs_oraz_ocena_kodu?p=876810#id876810
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:4 minuty
  • Lokalizacja:Tuchów
  • Postów:12166
0
Patryk27 napisał(a)

Edytor napisany jest w Delphi, lecz sama biblioteka będąca interpreterem w Lazarusie (na początku także chciałem napisać edytor w Lazarusie, ale przegrałem walkę z SynEditem).

Więc dlatego pisałeś wątek o numerowaniu wierszy w TSynEdit? Nie rozumiem, przecież kładąc tą kontrolkę na formularzu od razu jest numerowanie włączone...


Składnia tego języka to czarna magia, BrainFuck już ma łatwiejszą... :]


To ja może z innej beczki - moje uwagi na temat GUI;

0. Ikona programu

Nie ładnie, brak własnej ikony... O.o

1. Rozmiar okna

Niestety podczas powiększenia okna na cały ekran przez systemowy przycisk nie działa to jak należy (sam się dziwię czemu - tym też się bawiłeś?) - okno nie "dotyka" górnej krawędzi ekranu, a dolna część (połowa StatusBar'a) wchodzi pod pasek zadań - na WinXP; Nie wiem dlaczego tak się dzieje, ale cóż - fail;

2. Rozmiar kontrolek

Jak dla mnie edytor kodu jest za mały i nie można go na życzenie powiększyć - brak Splitter'a; Z racji tej, że mam niską rozdzielczość (1024x768) trochę niewygodnie się pisze; Przydałaby się możliwość dostosowania wielkości kontrolek według własnych potrzeb;

3. Menu główne

Mało tych opcji (i nie ma pomocy!); Przydałoby się jeszcze kilka, ale to sprawa mniej ważna;

4. Menu podręczne

A raczej jego brak w edytorze kodu; Szkoda, bo często z niego korzystam w innych kompilatorach środowiskach; Ponadto w grupie Stack and Input, w kontrolce zapewne od stosu jest menu podręczne, ale nie obsługuje skrótów klawiszowych - odkryłem przez przypadek chcąc usunąć pozycję klawiszem Del;

5. Edytor kodu

Tutaj wszystko wygląda w porządku (chociaż brak PopupMenu), ale jedno mnie dziwi, dlaczego w pasku z numerami wierszy (z lewej obok numeru wiersza) wyświetlana jest także pozycja X kursora - trochę myli patrząc na numer linii, te dwie liczby zlewają się w jedną;


Tak tylko pomarudziłem, teraz spróbujemy rozszyfrować kod, który podałeś :]


Chyba zepsułem coś, bo program się zapętlił... podałem dwie liczby, wyjście wygląda tak:

Kopiuj
Stage 1 finished :> 3 more to go.
Stage 2 finished :> 2 more to go.
Stage 3 finished :> 1 more to go.
Almost ;)

i nie chce przestać działać... :]


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 4x, ostatnio: flowCRANE
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
1

Przecież par liczb spełniających warunki zadania jest nieskończenie wiele :/. No, w pewnym momencie można przekroczyć zakres obsługiwany przez typ Extended w Pascalu. Nie wiem czy program do końca jest poprawny, czy robi to co według ciebie miał robić. Gdzie jest w jakikolwiek sposób wykorzystywany wynik and 13 oprócz tego byle nie wyniósł 0, bo pętla się nie skończy (jak wyżej)?

W przedziale od 0 do 1000000000 jest ich 44193928. Jak duże załączniki przyjmuje twoja poczta ;P?

edytowany 2x, ostatnio: Rev
iooi
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:573
0

Czy liczby muszą spełnić wszystkie Stage finished, czy tylko Success?
Nie wiem, czy to zamierzone, ale na pozycji (5, 14) masz j21'25' (w lewo), co spowoduje skok na pozycję (1, 2) z kierunkiem w prawo.
A tam masz: /j (co daje skok uzależniony od wejścia użytkownika).

edytowany 7x, ostatnio: iooi
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
0

@iooi: no jak? wchodząc tam z prawej strony na stos masz wrzucone 25 1 2, więc skaczesz do (1, 25).

edytowany 1x, ostatnio: Rev
iooi
My bad. Jakimś sposobem i tak czytałem to od lewej.
0

Może i się czepiam, ale...

Konkurs oraz ocena kodu

Ten wątek się źle nazywa. Dużo lepiej byłoby "MLang - ocena kodu i konkurs". Tak to nawet nie masz nazwy tego 'kodu'. To tak przyszłościowo, warto myśleć co to znaczy na liście, żeby temat mówił o zawartości.

Kopiuj
 Reg := TRegistry.Create;
 Try
  Try
   Reg.RootKey := HKEY_CLASSES_ROOT;
   Reg.OpenKey('.'+Ext, True);
   Reg.WriteString('', Ext+'file');
   Reg.CloseKey;
   Reg.OpenKey(Ext+'file', True);
   Reg.WriteString('', 'MLang program');
   Reg.CloseKey;
   Reg.OpenKey(Ext+'file\DefaultIcon', True);
   Reg.WriteString('', Application.ExeName+',0');
   Reg.CloseKey;
   Reg.OpenKey(Ext+'file\shell\open', True);
   Reg.WriteString('', '&Open in MLang Editor');
   Reg.CloseKey;
   Reg.OpenKey(Ext+'file\shell\open\command', True);
   Reg.WriteString('', Application.ExeName+' "%1"');
   Reg.CloseKey;
  Except
  End;
 Finally
  Reg.Free;
 End;
 

Darmowe zaśmiecanie rejestru... I fajne bloki try.

3.Zapisywanie kodu jako 'temp.src' i w ten sposób przekazywanie go do Dllki to słaby pomysł...

Kto wyśle więcej liczb, niebędących kolejnymi po sobie, a będących poprawnymi

No to trzeba dopisać warstwę losującą kolejność tych liczb... czy uważasz że będziemy ręcznie myśleć nad liczbami które spełniają twoje warunki?...

Kopiuj
TMLang.Load:
Direction := dNone;
 Case Prog[0, 1] of
  '>': Direction := dRight;
  'v': Direction := dDown;
  else Direction := dRight;
 End;

Ten kod po pierwsze zawiera niepotrzebne ustawianie Directory na dNone, a po drugie wystarczy dać Direction:=dRight;.

Tyle dotychczas wynika z mojej pobieżnej analizy...

RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
1

Ok. Podaję swoje liczby tutaj, bo konkurs i tak jest IMO spaczony. Plik tekstowy z liczbami oddzielonymi znakiem nowej linii. W sumie czterdzieści cztery miliony sto dziewięćdziesiąt trzy tysiące dziewięćset dwadzieścia osiem liczb. Mogę dać więcej.

http://ja.revciu.pl/pub/4p/130176-konkurs_oraz_ocena_kodu/liczby.7z (17.4MB)

Podane liczby to a w (a * b) / 2. Więc do algorytmu trzeba podać tę liczbę oraz 2 albo dwa razy mniejszą liczbę niż podaną i 4, itd.

edytowany 1x, ostatnio: Rev
0

spoko że stage 1, 2, 3 aż do "almost" są proste a potem nagle zaczyna się dziać tyle rzeczy że nawet przestałem śledzić :O mimo to magicznie przechodzą chyba wszystkie wyniki które tam dochodzą

nie chce mi się generować wyników ani zresztą nie mam jak wysłać PM więc napiszę tu w ukryciu solucję
iloczyn liczb musi być podzielny przez 4 i 9, połowa tego iloczynu musi mieć nieparzystą liczbę cyfr

RE
dajmy więc na to parę liczb: 252 i 2. iloczyn to 504 i nie przejdzie :)
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Prawdę mówiąc, nie sądziłem iż tyle liczb jest poprawnych :D
Dzisiaj napiszę ten kod od nowa, a zadaniem będzie podanie wzoru, a nie liczb spełniających równanie.

Furious Programming napisał(a)

Nie ładnie, brak własnej ikony... O.o

Nie jestem grafikiem, lecz może dzisiaj postaram się jakąś wykonać.

Furious Programming napisał(a)

Niestety podczas powiększenia okna na cały ekran przez systemowy przycisk nie działa to jak należy (sam się dziwię czemu - tym też się bawiłeś?) - okno nie "dotyka" górnej krawędzi ekranu, a dolna część (połowa StatusBar'a) wchodzi pod pasek zadań - na WinXP; Nie wiem dlaczego tak się dzieje, ale cóż - fail;

Windows 7, 1280x800 - wszystko jest ok, nic się nie rozjeżdża ani nie wychodzi poza ekran.
Problemem może być fakt, iż automatycznie ustawiam szerokość/wysokość każdego GroupBox'a na odpowiednie wymiary przy zdarzeniu onResize.

Furious Programming napisał(a)

Jak dla mnie edytor kodu jest za mały i nie można go na życzenie powiększyć - brak Splitter'a; Z racji tej, że mam niską rozdzielczość (1024x768) trochę niewygodnie się pisze; Przydałaby się możliwość dostosowania wielkości kontrolek według własnych potrzeb;

Ok, dzięki - pomyślę nad tym.

Furious Programming napisał(a)

Mało tych opcji (i nie ma pomocy!); Przydałoby się jeszcze kilka, ale to sprawa mniej ważna;

Jest plik Readme, które jest całą pomocą, lecz dodam odpowiednią opcję w edytorze.

Furious Programming napisał(a)

A raczej jego brak w edytorze kodu; Szkoda, bo często z niego korzystam w innych kompilatorach;

Faktycznie, zapomniałem dodać, zaraz się poprawi ;)

Furious Programming napisał(a)

Ponadto w grupie Stack and Input, w kontrolce zapewne od stosu jest menu podręczne, ale nie obsługuje skrótów klawiszowych - odkryłem przez przypadek chcąc usunąć pozycję klawiszem Del;

Ok, dodałem do listy rzeczy do zrobienia.

Furious Programming napisał(a)

Tutaj wszystko wygląda w porządku (chociaż brak PopupMenu), ale jedno mnie dziwi, dlaczego w pasku z numerami wierszy (z lewej obok numeru wiersza) wyświetlana jest także pozycja X kursora - trochę myli patrząc na numer linii, te dwie liczby zlewają się w jedną;

Ten język umożliwia metaprogramowanie, instrukcje takie jak g czy p wymagają podania numeru linii oraz numeru znaku, liczenie ich samemu byłoby żmudne.

Furious Programming napisał(a)

Chyba zepsułem coś, bo program się zapętlił... podałem dwie liczby, wyjście wygląda tak:

Mój błąd, w pewnym momencie pod koniec kodu następuje mnożenie liczby przez 3, dopóki nie będzie ona większa od 9000000.
Nie przewidziałem, że może być ona równa zero, przez co zawsze będzie mniejsza od 9000000.

Furious Programming napisał(a)

i nie chce przestać działać...

F10 lub Program->Stop ;)

Rev napisał(a)

W przedziale od 0 do 1000000000 jest ich 44193928. Jak duże załączniki przyjmuje twoja poczta ;P?

Nie sądziłem, iż tyle liczb jest poprawnych, dlatego w następnym konkursie jako rozwiązanie trzeba będzie wysłać wzór ;)

cloudm33 napisał(a)

Czy w pierwszym inpucie wpiszemy 0, czy w drugim, to program się zapętla.

Na początku następuje mnożenie obu liczb, jeżeli któreś z nich jest równe zero, mnożenie także zwróci zero i program się zapętli.

clodum33 napisał(a)

- omija następną instrukcję. Wszystko było by ok, tylko, że spacja to też pewna instrukcja (NOT), a tego nie napisałeś..

Mój błąd, było dosyć późno jak to pisałem, zaraz wprowadzę odpowiednie poprawki.

cloudm33 napisał(a)

komenda 'd' - w nawiasie nie napisałeś że string konwertuje się na liczbę całkowitą, tylko że na liczbę

Niedopatrzenie, zaraz się poprawi ;)

-123oho napisał(a)

Darmowe zaśmiecanie rejestru... I fajne bloki try.

To copy&paste z mojego starszego dawnego kodu, blok "try...except" jest po to, aby w razie gdy np.user nie ma dostępu do rejestru niepotrzebnie nie wyświetlać informacji o niedodanym wpisie, ale zmienię to.

-123oho napisał(a)

Zapisywanie kodu jako 'temp.src' i w ten sposób przekazywanie go do Dllki to słaby pomysł..

Może w takim razie przekazywanie TStringList do dllki?

-123oho napisał(a)

Ten kod po pierwsze zawiera niepotrzebne ustawianie Directory na dNone, a po drugie wystarczy dać Direction:=dRight;.

Na początku było założenie, aby pierwszy znak w kodzie był znakiem kierunku (>, <, ^, v), potem to zmodyfikowałem i nie zauważyłem tej pozostałości.


Dzięki wszystkim za przejrzenie kodu i uczestnictwo :) Przyjrzę się waszym sugestiom i poprawie odpowiednio kod, a także napiszę nowy kod na konkurs (tylko jak już wspomniałem - nie będzie chodziło o podanie liczb, a wzoru).

edytowany 1x, ostatnio: Patryk27
Demonical Monk
  • Rejestracja:około 17 lat
  • Ostatnio:11 miesięcy
0
Patryk27 napisał(a):
-123oho napisał(a)

Darmowe zaśmiecanie rejestru... I fajne bloki try.

To copy&paste z mojego starszego dawnego kodu, blok "try...except" jest po to, aby w razie gdy np.user nie ma dostępu do rejestru niepotrzebnie nie wyświetlać informacji o niedodanym wpisie, ale zmienię to.

Rozumiem że cały czas siedzisz na adminie? Do HKCR nie można zapisywać ze zwykłego użytkownika. Takie pierdoły powinny być opcjonalne do wyboru przy instalacji.


Women were the reason I became a monk - and, ah, the reason I switched back...
Patryk27
Aktualnie wykonałem to tak, że jest opcja w ustawieniach programu (wraz z możliwością usunięcia tego z rejestru).
0

Może w takim razie przekazywanie TStringList do dllki?

W sumie to mogłoby się nadać (ale mam wątpliwości o takiej możliwości na D7 z Lazarusem). W sumie to wydaje mi się że lepiej wysłać to z #13 w PChar a potem można łatwo skonwertować obustronnie na TStrings. Jeszcze lepiej by było gdyby komunikacja editor<->dll byłaby oparta na interfejsach, wtedy dllka mogłaby wykonywać niektóre funkcje editora, ale tutaj to głównie edytor rozkazuje dllce więc nie ma większego problemu.

Ah, jeszcze zapomniałem się przyczepić do edytora: Brakuje możliwości stawiania breakpointów, a masz 'opcode' odpowiedzialny za breakpoint, ale jego wstawianie w gotowy kod jest niewygodne ;P .

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0
-123oho napisał(a)

W sumie to wydaje mi się że lepiej wysłać to z #13 w PChar

Ok, z tym akurat większego problemu nie będzie ;)

-123oho napisał(a)

Brakuje możliwości stawiania breakpointów, a masz 'opcode' odpowiedzialny za breakpoint, ale jego wstawianie w gotowy kod jest niewygodne ;P .

Może dodać taką możliwość do menu kontekstowego edytora?
Znaki ustawione jako "breakpoint" miałyby dodatkowo jakieś podświetlenie czy coś.
Nic innego mi nie przychodzi na myśl.


Macie jakieś pomysły na ikonę? Póki co wykombinowałem coś takiego: ![ico.png](//static.4programmers.net/uploads/attachment/1046723521503dfef4e296f.png)
  • ico.png (4 KB) - ściągnięć: 102

edytowany 4x, ostatnio: Patryk27
0
Patryk27 napisał(a):

Może dodać taką możliwość do menu kontekstowego edytora?
Znaki ustawione jako "breakpoint" miałyby dodatkowo jakieś podświetlenie czy coś.
Nic innego mi nie przychodzi na myśl.

Tylko dodaj też żeby ten breakpoint gdy zostanie osiągnięty to zamieniał się w opcode który tam wcześniej był i żeby dało się te breakpointy usuwać. Jak jeszcze zbindujesz dodawanie/usuwanie na F2 to będzie prawie jak IDA ;) .

Powalające to jakoś nie jest i takie "puste".

Możesz dodać tam opcody 'v' '>' '^' '<', random idea.

RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
3

Generator liczb do programu:

Kopiuj
class Program
{
	static bool IsValid(int number)
	{
		if (number % 2 != 0) return false;
		if (number % 9 != 0) return false;

		int numberLength = (int)Math.Ceiling(Math.Log10(number));
		if (numberLength % 2 == 0) return false;

		int nineth = number / 9;

		int ninethLength = (int)Math.Ceiling(Math.Log10(nineth));
		int strangeNumber = nineth - 220000;
		int strangeNumberLength = strangeNumber.ToString().Length;

		double ratio = (double)ninethLength / strangeNumberLength;

		double number2 = nineth / ratio;
		number2 /= 6;

		int number3 = (int)Math.Round(number2);

		return (number3 & 13) != 0;
	}

	static void Main(string[] args)
	{
		var numbers = from number in Enumerable.Range(1, 1000).AsParallel().AsOrdered()
						where IsValid(number)
						select number;

		foreach (int number in numbers)
			Console.WriteLine(number);
	}
}
iooi
Liczba musi być podzielna przez 4, nie tylko przez 2.
RE
Jeżeli ta liczba jest podzielna przez dwa to jej iloczyn z dwójką będzie podzielny przez 4.
iooi
Ale to nie musi być iloczyn z dwójką.
RE
Możesz w takim razie potraktować moje liczby jako połowę tego iloczynu. Czynniki możesz sobie na tej podstawie dobrać jakie chcesz.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:4 minuty
  • Lokalizacja:Tuchów
  • Postów:12166
0
Patryk27 napisał(a)
Furious Programming napisał(a)

i nie chce przestać działać...

F10 lub Program->Stop

No nie traktuj mnie jak matoła... Sprawdziłem obsługę zanim zacząłem się nim bawić :]

Patryk napisał(a)
Furious Programming napisał(a)

Mało tych opcji (i nie ma pomocy!); Przydałoby się jeszcze kilka, ale to sprawa mniej ważna;

Jest plik Readme, które jest całą pomocą, lecz dodam odpowiednią opcję w edytorze.

Bardziej chodziło mi o pozycję w menu, dzięki której otwiera się okienko z zawartością pomocy (np. F1); Nie musi to mieć drzewiastej struktury, ale zwykłe TMemo z zawartością pliku (ew. dorzuć kolorowanie, żeby zwiększyć czytelność);


Co do ikon - sieć jest ich pełna, polecam IconsPedia - potężny zbiór ikon (większość mam na dysku);


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Bardziej chodziło mi o pozycję w menu, dzięki której otwiera się okienko z zawartością pomocy (np. F1); Nie musi to mieć drzewiastej struktury, ale zwykłe TMemo z zawartością pliku (ew. dorzuć kolorowanie, żeby zwiększyć czytelność);

Aktualnie po naciśnięciu F1 otwiera się domyślny edytor tekstowy otwierając plik pomocy.
Ponadto dodałem funkcję "opisu funkcji"; po zaznaczeniu jakiegoś znaku w kodzie i naciśnięciu F3 otwierana jest pomoc wraz z krótkim opisem zaznaczonej funkcji.


0
Rev napisał(a)

dajmy więc na to parę liczb: 252 i 2. iloczyn to 504 i nie przejdzie :)

ok, źle napisałem
nie podzielny, tylko ma się rozkładać na te liczby

RE
a jaka jest różnica? bez wzięcia pod uwagę tego and 13 na obliczonej liczbie nie otrzymasz poprawnej listy liczb.
0

a jaka jest różnica? bez wzięcia pod uwagę tego and 13 na obliczonej liczbie nie otrzymasz poprawnej listy liczb

różnica spora, w każdym razie tak jak mówiłem - nawet nie przeglądałem tej części programu. po prostu sprawdziłem kilkanaście liczb spełniających tamte warunki i przechodziły, np:

a = 2

b:
4 * 4 * 9 = 144 (przechodzi)
4 * 9 * 9 = 324 (przechodzi)
4 * 4 * 9 * 9 * 9 = 11664 (przechodzi)
9 * 4 * 4 * 4 * 4 * 4 * 4 = 36864 (przechodzi)

więc stwierdziłem że to może być już rozwiązanie, ale faktycznie dla niektórych liczb program się zawiesza
godzina i tak była późna więc musiałem kończyć ;)

0

a właściwie znowu mi zagmatwałeś, jednak wystarczyło że była podzielna, po prostu to była jedna z liczb, druga ma być 2 i wtedy podane przez Ciebie 504 też przechodzi ;)

RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
0

9 * 9 * 9 * 9 * 4 = 2304 (nie przechodzi)
9 * 7 * 2 = 126 (przechodzi)
:P

0
Rev napisał(a):

9 * 9 * 9 * 9 * 4 = 2304 (nie przechodzi)
9 * 7 * 2 = 126 (przechodzi)
:P

mój kalkulator mnie oszukuje i mówi że 9 * 9 * 9 * 9 * 4 = 26244 (przechodzi) ;P

0

a 2304 nie ma nieparzystej liczby cyfr ;P

0

no i napisałem że iloczyn ma być podzielny przez 4, a tak naprawdę po prostu połowa iloczynu ma być podzielna przez 2 - niby to samo ale trochę wprowadziło zamętu ;)

w każdym razie brakuje jeszcze jednego warunku, a nie wiem czy da się go prosto opisać - może ktoś spróbuje ;P

RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
1

A, dziewiątki z czwórkami się pomyliły. Ale ok, faktycznie, nie ma nieparzystej liczby cyfr.

4 * 4 * 4 * 4 * 9 * 9 = 20736
4 * 4 * 4 * 4 * 9 * 9 * 9 * 9 = 1679616
Nie przechodzą. Bo nie spełniają tego brakującego warunku właśnie. Masz go w moim programie do generowania na poprzedniej stronie.

Raczej nie da się go prosto opisać. Jak dla mnie to Patrykowi po prostu znudziło się w pewnym momencie wymyślanie sensownego algorytmu i włączył mu się totalny random ;P.

edytowany 1x, ostatnio: Rev
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

W nowszej wersji dodałem ustawienia, a w nich:
-możliwość powiązania/usunięcia powiązania z rozszerzeniem
-możliwość zmiany rozmieszczenia (tj.jest do wyboru pomiędzy statyczne a dynamiczne), jeżeli wybierze się statyczne, można ustawić sobie wymiary komponentów za pomocą splittera, jeżeli jest ustawione dynamiczne, ustawia się dwa czynniki, które podstawiane są pod wzór:

Kopiuj
  gbOutput.Left  := Round(Width-Width/AlignFactor1);
  gbOutput.Width := Round(Width/AlignFactor1);
  gbStack.Top    := Round(Height-Height/AlignFactor2);
  gbStack.Height := Round(Height/AlignFactor2);
  StatusBar.Top  := Height;

-możliwość zmiany czcionki
Oczywiście wszystko zapisywane do pliku ;)
Dodatkowo:
-breakpointy
-możliwość "w locie" z poziomu edytora dodawania/edycji/usuwania elementów ze stosu
-możliwość po wciśnięciu "F3" zobaczenia opisu aktualnie zaznaczonej funkcji
-wszystko (włącznie z komunikatami błędów) zostało spolszczone
-menu podręczne edytora
-drobne poprawki z wyświetlaniem pozycji "X" na gutterze (tym szarym polu po lewej)
I coś pewnie jeszcze dodałem, ale zapomniałem :>


Wersję wrzucę dopiero pojutrze, ponieważ zostało mi parę rzeczy do zrobienia, a dzisiaj wyjeżdżam i jutro mnie cały dzień nie ma ;)

edytowany 2x, ostatnio: Patryk27
User52632
Nie zapominaj o konkursie ;)
0
Patryk27 napisał(a):

Wersję wrzucę dopiero pojutrze, ponieważ zostało mi parę rzeczy do zrobienia, a dzisiaj wyjeżdżam i jutro mnie cały dzień nie ma ;)

to po co teraz piszesz :P

  1. wtf - jakie znowu współczynniki? jakie wzory? :O widzę że masz wrodzony talent do utrudniania rzeczy; zrób po prostu splittery które można ustawiać przez drag&drop i po ich ustawieniu samemu odczytaj te czynniki żeby przy zmianie rozmiaru okna się automatycznie skalowało

  2. przy redo zmień może hotkey z ctrl+shift+z na standardowo używane do tego celu ctrl+y

  3. "Stack and input" zmień może na "Input and stack" skoro to "input" jest z lewej a "stack" z prawej...

Patryk27
Napisałem teraz, aby jak ktoś ma jakieś pomysły czy sugestie, mógł je napisać od razu ;)
0

btw - gdyby to trochę uprościć i dodać grafikę to mogłaby powstać całkiem niezła gra logiczna

0

dobra - okazuje się że już oczywiście są takie gry

np Carnage Heart - :)

0

Moja próba ogarnięcia tego "syfu": (bez urazy ;) ) :P

Kopiuj
vVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> $23r2j
> 0'30'2j Adres początku programu
> '24'    Linia obsługa funkcji
> Rejestry: (0xw - zapis; 0xr - odczyt)
05 - domyślny rejestr zwracania wartości
06
07
08      
09

v INT16 "Random" V103j 
                  >0v     >3'13'2j
>08\4*'18''13'0jv1?2>+\1-:|
                v 3 ^     >$05w\5+\2j
                > > ^

v INT16 "Random_range" V203j (05 min, 06 max)
>06r05r -1+05r\ V103j 05r\%+ 05w\5+\2j

v VOID "Next_line" V303j
>\$1+0\2j

01234567890123456789012345678901234567 Vx03j
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv Obsługa funkcji
   > 0'20'2j      Przejście do następnej linii kodu :D
  > 0'18'2j      Random_range
 > 0'13'2j      Random
> 0'24'2j      Adres początku programu

vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv Początek programu
> "Podaj dolną wartość zakresu"{: 05w V303j
> "Podaj górną wartość zakresu"{: 06w V203j V303j
> \"Losowa liczba w przedziale ",."- ",."to: ",05r.@

obsługę funkcji można by było zrobić prościej i ładniej najzwyklejszymi jumpami ale nie chciałem całkowicie porzucać idei tego języka ;P
przydałaby się jakaś funkcja umożliwiająca zrobienie ramki stosu ;P
albo żeby nie było łatwo - funkcja wrzucająca na stos aktualny rozmiar stosu ;)

to kto się podejmie zrobienia generatora liczb do poprzedniego zadania w tym języku? :D

2

albo jednak trochę przerobiłem żeby nie trzeba było zmieniać adresu w dwóch miejscach gdy dochodzą nowe funkcje:

Kopiuj
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
0VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> $03r+2\2j
'23' "numer linii początku programu"
>>>> 0j -> Rejestry: (0xw - zapis; 0xr - odczyt)
05 - domyślny rejestr zwracania wartości
06
07
08      
09
 
v INT16 "Random" V100j 
                  >0v     >3'13'2j
>08\4*'18''13'0jv1?2>+\1-:|
                v 3 ^     >$05w\5+\2j
                > > ^
 
v INT16 "Random_range" V200j (05 min, 06 max)
>06r05r -1+05r\ V100j 05r\%+ 05w\5+\2j
 
v VOID "Next_line" V300j
>\$1+0\2j
 
vvvVVV LINIA POCZĄTKU PROGRAMU VVVvvv 
v 0'13'2j Random
v 0'18'2j Random_range
v 0'20'2j Przejście do następnej linii kodu :D
 
vvvVVV POCZĄTEK PROGRAMU VVVvvv
> "Podaj dolną wartość zakresu"{: 05w V300j
> "Podaj górną wartość zakresu"{: 06w V200j V300j
> \"Losowa liczba w przedziale ",."- ",."to: ",05r.@
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)