c++ sudoku solver

c++ sudoku solver
0

Witam,
Przepisałem prawie w 100% kod z filmu youtube

Kopiuj
#include<iostream>
#include<conio.h>
using namespace std;
/*int a[9][9]={{0,0,0,0,0,0,0,3,7},
			 {0,0,4,0,6,0,0,0,0},
			 {0,0,8,7,0,5,0,6,1},
			 {9,0,5,0,0,0,2,0,0},
			 {0,0,6,0,4,9,0,7,0},
			 {0,8,0,0,0,0,0,1,9},
			 {0,0,0,0,0,3,0,9,0},
			 {3,0,7,4,8,0,0,2,0},
			 {8,0,1,9,0,0,0,0,0}};*/
int a[9][9]={{0,4,5,0,9,0,0,7,0},
			 {1,0,7,3,0,6,5,0,8},
			 {0,9,0,2,7,0,0,6,1},
			 {0,1,0,0,2,0,3,8,0},
			 {2,0,8,4,1,9,6,0,7},
			 {0,6,9,0,5,0,0,4,0},
			 {4,5,0,0,8,2,0,3,0},
			 {9,0,6,5,0,1,7,0,4},
			 {0,7,0,0,6,0,8,1,0}};
int b[9][9];
int inputvalue(int x, int y, int value)
{
	for(int i=0; i<9; i++)
	{
		if(value==b[x][i]||value==b[i][y])
		return 0;
	}
	for(int i=(x/3)*3; i<=((x/3)*3)+2; i++)
		for(int j=(y/3)*3; j<=((y/3)*3)+2; j++)
			if(b[i][j]==value) return 0;
	return value;
}
int solve(int x, int y)
{
	int k;
	int temp;
	if(b[x][y]==0)
	{
		for(int i=1; i<10; i++)
		{
			temp = inputvalue(x,y,i);
			if(temp>0)
			{
				b[x][y]=temp;
				if(x==8 && y==8) return 1;
				else if(x==8) 
				{
					if(solve(0, y+1)) return 1;
				}
				else
				{
					if(solve(x+1, y)) return 1;
				}
			}
			k=i;
		}
		if(k==10)
		{
			if(b[x][y]!=a[x][y]) 
			{
				b[x][y]=0;
				return 0;
			}
		}
		if(x==8 && y==8) return 1;
		else if(x==8) 
		{
			if(solve(0, y+1)) return 1;
		}
		else 
		{
			if(solve(x+1, y)) return 1;
		}
	}
}
int main()
{
	for(int i=0; i<9; i++)
		for(int j=0; j<9; j++)
			b[i][j]=a[i][j];
		if(solve(0,0))
		{
			for(int i=0; i<9; i++)
			{
				cout<<endl;
				for(int j=0; j<9; j++)
				{
					cout<<b[i][j];
				}
			}
		}
		else
		cout<<"no solve\n";
	getch();
	return 0;
}

Na youtubie kod działa, tzn. rozwiązuje to same sudoku, co powyżej. U mnie niestety nie.
Gdzie może leżeć problem?

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
0

Jak się odwołujesz do jakiegoś filmiku to powinieneś dać do niego linka.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
0

Jest i link

MarekR22
OMG jak ci się chciało katować czymś takim. To jest w jakimś dziwnym języku, który czasami przypomina angielski.
Azarien
@MarekR22: masz tam też link do wersji angielskiej. i dlaczego „katować”, skąd możesz wiedzieć, jakie kol. Damianek zna języki?
Rekman
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:148
0

Co to jest?
Zera w Sudoku?
Może są eksperci potrafiący napisać Sudoku w tylu liniach... Ja ptrzebowałem 10x tyle i to tylko na - przyznam - rozbudowaną logikę. Interfejs i prezentacja swoją drogą.

0

tak, zero to puste miejsce.
Ja piszę program okienkowy, ale najpierw chce samą esencje napisać w konsoli. Może jakieś wskazówki, jak napisać taki program?

Rekman
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:148
0

Dokładnie zapoznac się z logiką gry.
Próbowałeś czegoś prostszego?

0
Rekman napisał(a):

Próbowałeś czegoś prostszego?

Co masz na myśli?

Rekman
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:148
0

Coś łatwiejszego. Jak chociażby nieśmiertejne kółko i krzyżyk.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:3 minuty
0

Może są eksperci potrafiący napisać Sudoku w tylu liniach... Ja ptrzebowałem 10x tyle i to tylko na - przyznam - rozbudowaną logikę. Interfejs i prezentacja swoją drogą.

Ja kiedyś napisałem w kilku linijkach, i kod jest gdzieś na tym forum.
Oczywiście oszukiwałem: wprowadzasz reguły i odpalasz Microsoft Solver Foundation.
Od zera (czyli bez gotowego kombajnu matematycznego) rozwiązywacza Sudoku nie pisałem jeszcze nigdy ;-)

0
Rekman napisał(a):

Coś łatwiejszego. Jak chociażby nieśmiertejne kółko i krzyżyk.

To właśnie wczoraj skończyłem.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Mam napisane dwie wersje:

  • jedna - c++, brutal force - mniej wierszy niż w poście wyżej.
  • druga - delphi, kombajn do zgadywania/tworzenia sudoku 3x3,4x4,5x5 do wyboru - 1829 wierszy.
    37ee528846.png

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
0

Można prosić o wersję pierwszą:D
O algorytm rozwiązywania, albo o podpowiedź co zmienić w istniejącym kodzie.?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Algorytm brutal force jest prosty.
Rekurencyjny z nawrotami w każde wolne miejsce podstawiasz wszystkie możliwe liczby i patrzysz czy nie ma kolizji.
Warto zaimplementować wszystkie znane reguły pochodne przynajmniej do trzeciego poziomu - poczytaj na stronach o rozwiązywaniu sudoku.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
P4
  • Rejestracja:około 13 lat
  • Ostatnio:około 4 lata
  • Postów:53
0
Damianek napisał(a):

Można prosić o wersję pierwszą:D
O algorytm rozwiązywania, albo o podpowiedź co zmienić w istniejącym kodzie.?

Najlepiej zrób implementacje własnego pomysłu i nie przejmuj się, że kod zajmuje znacznie więcej linii kodu :)

Chyba umiesz sprawdzić, czy rozwiązałeś sudoku poprawnie? Jeśli tak, to co za przeszkoda :)

Pozdrawiam


"To check for updates, you must first install an update for Windows Update."
msm
Administrator
  • Rejestracja:prawie 16 lat
  • Ostatnio:4 miesiące
1

Niekonstruktywni jesteście, dwie strony i nikt nie spróbował podać rozwiązania : P.

Ja zacząłem czyścić kod pod moje chore upodobania, i po drodze przypadkowo naprawiłem błąd widocznie, bo teraz działa ;) (nie chce mi się już sprawdzać co było źle, obstawiam nieczyszczenie tablicy b/curr, trzecia w nocy prawie ;/) - cały kod solvera:

Kopiuj
bool can_input(int x, int y, int value) {
    for(int i = 0; i < 9; i++) {
        if (value == curr[x][i] || value == curr[i][y]) { return false; }
    }
    for (int i = (x/3)*3; i <= ((x/3)*3)+2; i++) {
        for (int j = (y/3)*3; j <= ((y/3)*3)+2; j++) {
            if (curr[i][j] == value) { return false; }
        }
    } return true;
}

bool next(int x, int y) {
    if (x == 8 && y == 8) return true;
    else if (x == 8) return solve(0, y + 1);
    else return solve(x + 1, y);
}

bool solve(int x, int y) {
    if (sudoku[x][y] == 0) {
        for(int i = 1; i <= 9; i++) {
            if (can_input(x, y, i)) {
                curr[x][y] = i;
                if (next(x, y)) return true;
            }
        } curr[x][y] = 0; return false;
    } return next(x, y);
}

Btw. przemianowałem 'a' na sudoku oraz b na curr, imo jest czytelniej.

Edit 2
Wzięło mnie na 'codegolf', więc jeszcze dam 'ambitniejszą' wersja can_input - takiego kodu /nie/ należy pisać (no ale krótsza i solver zajmuje efektywnie 18 linijek kodu) ;)

Kopiuj
bool can_input(int x, int y, int v) {
    for(int i = 0; i < 9; i++) {
        if (v == curr[x][i] || v == curr[i][y] || v == curr[x/3*3+i%3][y/3*3+i/3]) return false;
    } return true;
}

Testowane dla:

Kopiuj
int sudoku[9][9]= {
    {0,1,0,0,5,6,2,7,0},
    {0,0,0,0,8,0,0,0,9},
    {0,7,8,0,0,3,6,0,5},
    {0,0,0,0,0,4,5,0,1},
    {8,5,2,0,0,0,7,3,4},
    {6,0,1,7,0,0,0,0,0},
    {1,0,6,4,0,0,9,5,0},
    {3,0,0,0,6,0,0,0,0},
    {0,2,7,3,9,0,0,8,0}
};

/*
413956278
265187349
978243615
739824561
852619734
641735892
186472953
394568127
527391486
*/

int sudoku[9][9]={{0,4,5,0,9,0,0,7,0},
             {1,0,7,3,0,6,5,0,8},
             {0,9,0,2,7,0,0,6,1},
             {0,1,0,0,2,0,3,8,0},
             {2,0,8,4,1,9,6,0,7},
             {0,6,9,0,5,0,0,4,0},
             {4,5,0,0,8,2,0,3,0},
             {9,0,6,5,0,1,7,0,4},
             {0,7,0,0,6,0,8,1,0}};

/*
645198273
127346598
893275461
514627389
238419657
769853142
451782936
986531724
372964815
*/

Na pierwszy rzut oka OK.

Może są eksperci potrafiący napisać Sudoku w tylu liniach... Ja ptrzebowałem 10x tyle i to tylko na - przyznam - rozbudowaną logikę. Interfejs i prezentacja swoją drogą.

Nie widzę związku między tym w ilu linijkach Ty napisałeś sudoku a tym czy ten kod ma szanse być poprawny ;). Na pewno można by to napisać wydajniej (constraint propagation z oczywistych rzeczy - seealso np. http://norvig.com/sudoku.html) ale dobry bruteforce z nawrotami nie jest zły.

Edit - w sumie słowo komentarza (chociaż to Ty oglądałeś film, ja go nawet nie uruchamiałem ;) ) do kodu.
can_input (dawniej inputvalue) - przyjmuje parametry x, y, i. Sprawdza czy na pozycji [x, y] można wstawić wartość i. Czyli po prostu sprawdza czy nie występuje w wierszu/kolumnie/kwadracie.

Funkcja next to taki mały helper na powtarzający się kawałek kodu, jej zadanie to wywołanie solve dla następnego pola w kolejności - zasada jest taka że najpierw zgadujemy co może być na pozycji (0,0), potem (1, 0), potem (2, 0), ... (8, 0), (0, 1), (1, 1), (2, 1) etc. np. next(2, 0) po prostu wywołuje solve(3, 0) (następne w kolejności) i zwraca wynik.

No a solve. Jeśli sudoku[x, y] != 0, przechodzi do następnego pola (za pomocą next).
Jeśli sudoku[x, y] == 0, solve(x, y) próbuje dopasować wszystkie możliwe wartości od 1-9 do tego pola, i rekurencyjnie wywołuje się dla następnego (czy ze zgadnięta wartością uda się ułożyć sudoku). I w sumie tyle, działa.

edytowany 6x, ostatnio: msm
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

@msm - podejście jest nierozsądnie czasochłonne.
Przy każdym polu oznacz które cyfry są jeszcze możliwe, czyli 9-bitowa informacja.
Po każdym wstawieniu odznaczasz wybraną cyfrę w pionie, poziomie i kwadracie za wyjątkiem wstawionego miejsca oczywiście.
Jeżeli po jakimś odznaczeniu gdzieś wyszło że nie zostało żadnego bitu to znaczy że trzeba się cofnąć.
Wybór które pole zmieniamy teraz powinien zależeć od ilości możliwości w nim (na pierwszy strzał - większe możliwości).
Warto te bity odwrócić czyli 1-ka oznacza że cyfra nie jest możliwa do wstawienia.
Zamiast tego potworka:

Kopiuj
for (int i = (x/3)*3; i <= ((x/3)*3)+2; i++) {
        for (int j = (y/3)*3; j <= ((y/3)*3)+2; j++)

Warto zastanowić się nad tabliczką:

Kopiuj
unsigned squares[9*9]=
  {
   1,1,1,2,2,2,3,3,3,
   1,1,1,2,2,2,3,3,3,
   1,1,1,2,2,2,3,3,3,
   4,4,4,5,5,5,6,6,6,
   4,4,4,5,5,5,6,6,6,
   4,4,4,5,5,5,6,6,6,
   7,7,7,8,8,8,9,9,9,
   7,7,7,8,8,8,9,9,9,
   7,7,7,8,8,8,9,9,9,
  };

oraz nad jej odwróconą postacią.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Zobacz pozostałe 5 komentarzy
Koziołek
Jako, że wywołany do tablicy - Metody brute force są dobre jeżeli pokrywają jakieś 99% przypadków typowych i większość brzegowych. Udziwnienia należy wprowadzać gdy rozwiązanie tego typu jest nieakceptowalne ze względu np. na czas trwania, ale jeżeli wydajność czasowa nie była elementem wymagań... olać. Koncepcja praktycznej części przemysłu IT opiera się na założeniu, że klient jest zainteresowany działaniem, a nie szczegółami technicznymi.
_13th_Dragon
@Koziołek, akurat tu się pomyliłeś ponieważ klientem jest sam programista - próbuje się nauczyć a jako skutek klient jest zainteresowany szczegółami technicznymi a nie działaniem ;P
Koziołek
przypadek specyficzny...
msm
@Koziołek - wybacz, nie chciałem Cię wołać do tablicy, tylko skojarzył mi się Twój wpis :<. @_13th_Dragon - Jakie najtrudniejsze sudoku? Najtrudniejsze na świecie?:< Wpisałem w google sudoku hard, przepisałem pierwsze, ./a.exe 0,03s user 0,01s system 36% cpu 0,124 total. A twoja tablica nie eliminuje żadnego dzielenia, ponieważ żadnego dzielenia w wynikowym .exe nie ma (za to są dwa mnożenia,poza pętlą). Za to dodaje dziewięć odwołań do pamięci, możemy się licytować co będzie szybsze, ale skończmy to lepiej bo prawdopodobnie się nigdy nie dogadamy (jak zwykle) :P.EOT
_13th_Dragon
"... bo prawdopodobnie się nigdy nie dogadamy ..." - ja cały czas mam nadzieje że uda ci się przyznać że istnieje cokolwiek poza "jedynym słusznym" kompilatorem, wtedy zaczniemy się dogadywać. "... za to są dwa mnożenia,poza pętlą ..." - to że tak twierdzisz nie wystarczy - http://ideone.com/Amn8AZ - czym wyjaśnisz 10% przyspieszenie? To tylko na samym wyniesieniu dzielenia poza pętle, jak zrobisz to poprzez tablice (całkowicie eliminując dzielenie) to będzie jeszcze szybciej.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

@msm, to jest hard:

Kopiuj
5-- --6 9-4
3-- --- 8--
-7- 4-- -1-
--- 952 ---
--9 --- 2--
--- 87- ---
-6- --1 ---
--1 --- --5
7-8 2-- --3

co do eliminacji dzielenia to może jakiemuś kompilatorowi udaje się to sensownie optymalizować.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
BA
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:36
0

W kwestii rozwiązania, pogoogluj 'problem 8 hetmanów', bo rozwiązanie jest analogiczne

KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:5 miesięcy
  • Postów:2514
0

hard:

Kopiuj
...|...|.1.
4..|...|...
.2.|...|...
---+---+---
...|.5.|4.7
..8|...|3..
..1|.9.|...
---+---+---
3..|4..|2..
.5.|1..|...
...|8.6|...

░█░█░█░█░█░█░█░█░█░█░█░
_13th_Dragon
wg mojej oceny to jest prymityw.
KR
ale jak brutem czysto jedziesz to najciezszy
0

Witam po przerwie.
Jaki jeszcze algorytm można zastosować do rozwiązywania sudoku?
Ten Brute Force na Intel Core i5 działa bardzo szybko, ale z ciekawości uruchomiłem na Celeronie 633MHz, to najtrudniejsze potworki rozwiązuje do 30 sekund. Jaki algorytm będzie szybszy?

_13th_Dragon
A ten w poście wyżej?
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
0

Poszukaj na forum, był tu kiedyś wątek, w którym wielu z nas zamieszało kod liczący możliwe rozwiązania dla niepełnego sudoku (takiego które ma więcej rozwiązań).
Testowane to było planszy z około 1200 rozwiązaniami. Większość kodów zliczyło rozwiązania poniżej sekundy.

jeśli dobrze pamiętam to dawałem w tedy kod python-a, który sobie radził na dość starym sprzęcie w 10 sekund (wersja w C++ byłaby pewnie 10 razy szybsza).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
0

Dzięki, poszukam.
@_13th_Dragon
Rozwiązanie sudoku, które podał krwq zajęło ok 20 sekund.

0

To dalej ja.
Zacząłem modyfikować kod podany prze użytkownika @msm, stosując się do rad @_13th_Dragon.
Dodałem funkcję która zapsuje w tablicy trójwymiarowej jaki liczby można wstawić w danym polu sudoku. To znacznie przyspieszyło rozwiązywanie. Teraz próbuję zrobić to:

Po każdym wstawieniu odznaczasz wybraną cyfrę w pionie, poziomie i kwadracie za wyjątkiem wstawionego miejsca oczywiście.
Jeżeli po jakimś odznaczeniu gdzieś wyszło że nie zostało żadnego bitu to znaczy że trzeba się cofnąć.

Ale zastanawia mnie gdzie trzeba się cofnąć? jedno miejsce wstecz, tak próbowałem i nie rozwiązuje to poprawnie sudoku.
Dodałem takie dwie funkcje

Kopiuj
 
bool remove_value(int x, int y, int value)
{
	// na początek usuwamy tylko w poziomie.
	for(int i=0; i<9; i++)
	{
		int max = tab_insert[x][i][9];
		for(int k=0; k<max; k++)
		{
			if(tab_insert[x][i][k]==value)
			{
				tab_insert[x][i][k]=0;
				tab_insert[x][i][9]-=1;
				if(tab_insert[x][i][9]==0) return prev(x, y);
			}
		}
	}
	return true;
}

bool prev(int x, int y)
{
   if (x == 0 && y == 0) return solve(8, 8);
    else if (x == 0) return solve(8, y - 1);
    else return solve(x - 1, y);

}

remove_value() wywołuję po wstawieniu liczby ale to chyba nie o to chodzi, co miał na myśli @_13th_Dragon.

Ile z takiego kodu można jeszcze wycisnąć, bo znalazłem jakiś co rozwiązuje te najtrudniejsze sudoku do 100ms.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

... poniżej 5ms na niezbyt szybkim komputerze.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
0

a kod zły jest?

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)