Najkrótszy kod dla problemu osmiu hetmanów

Odpowiedz Nowy wątek
2011-07-07 17:39
dfgdfg45534534
0

Najkrótszy kod jaki udało mi się znaleźć jest w języku Icon:

procedure main()
    write(q(1), q(2), q(3), q(4), q(5), q(6), q(7), q(8))
end
procedure q(c)
    suspend place(1 to 8, c) # look for a row
end
procedure place(r, c)
    static up, down, row
    initial 
    {
        up := list(15, 0)
        down := list(15, 0)
        row := list(8, 0)
    }
    if row[r] = down[r + c –1] = up[8 + r – c] = 0 # place if free
    then suspend row[r] <– down[r + c – 1] <– up[8 + r – c] <– r
end
 

Czy zna ktoś jakiś język w którym dało by się to krócej napisać?

W Pascalu mogłaby to być nawet jedna linijka :) - Patryk27 2011-07-07 17:43

Pozostało 580 znaków

2011-07-07 17:47
ddgfd54554
0

Znalazłem też kod w haskellu:

 
  import Control.Monad
  queens boardSize = foldM (\y _ -> [ x : y | x <- [1..boardSize], safe x y 1]) [] [1..boardSize]
  safe x [] n = True
  safe x (c:y) n = and [ x /= c , x /= c + n , x /= c - n , safe x y (n+1)]

Pozostało 580 znaków

2011-07-07 17:50
dfgd546456
0

JayLanguage:

queens =: (](1&=@(>./@(+/,+//.,+//[email protected]|.))"2#])@,/@:((],"_ _ [email protected]@#@{.)"2)^:[(1 0&,$0:))
 

Pozostało 580 znaków

2011-07-07 17:56
0

http://rosettacode.org/wiki/N-queens_problem#J


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-07-07 17:59
dfgd46456
0

jakoś nie wieżę że w Pascalu da się to zapisać w jednej linijce...proszę o kod

Daj mi 7 minut... - Patryk27 2011-07-07 18:10
WSZYSTKO można w pascalu zapisać w jednej linijce. - Azarien 2011-07-08 09:02

Pozostało 580 znaków

2011-07-07 18:18
blee
0

"Daj mi 7 minut... - Patryk27 7 minut temu" time is over! :D

He he. Trochę się zaciąłem :) Już kończę program. - Patryk27 2011-07-07 18:24
Heh. To trochę trudne... Ale skończę! Masz moje słowo, że będzie to jedna linijka :) - Patryk27 2011-07-07 18:27

Pozostało 580 znaków

2011-07-07 18:32
hfghfg56456
0

Dobra ale jak nie będzie to przelejesz na moje konto 100zł - zgoda ?

Ok. Już kończę. ;D - Patryk27 2011-07-07 18:35
4 minuty i gotowe. Jeszcze tylko poprawiam kod. - Patryk27 2011-07-07 18:44

Pozostało 580 znaków

2011-07-07 18:36
0

To w Pascalu znak znak nowej linii cokolwiek znaczy? (oczywiście poza stringami)


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2011-07-07 18:36
Że komuś chce się ogarniać te języki... ogólnie - szypxx 2011-07-07 19:42
Edit: miało byc do posta z linkiem. - szypxx 2011-07-07 19:43

Pozostało 580 znaków

2011-07-07 18:47
fgdf5456
0

mam nadzieję że to będzie w Pascalu stworzonym przez Wirtha

Pozostało 580 znaków

2011-07-07 18:59
fgfg5456
0

już 10minut mineło.

Pozostało 580 znaków

2011-07-07 19:01
0

Proszę:

Uses Crt;Type ChessBoard=Array[1..8,1..8]Of Integer;Var Board:ChessBoard;N:Integer;Procedure Initialize(Col:Integer);Var I,J:Integer;Begin For I:=1 To N Do For J:=Col To N Do Board[I, J]:=0;End;Procedure Display(Var Board:Chessboard;Size: Integer);Var I,J:Integer;Begin ClrScr;For I:=1 To N Do Begin For J:=1 To N do if Board[I,J]=1 Then Write('Q')Else Write(#254);WriteLn;End;End;Function Can_Place(Row,Col:Integer):Boolean;Var I,J:Integer;NoConflict:Boolean;Begin NoConflict:=True;
For J:= 1 To Col-1 Do if Board[Row,J]=1 Then NoConflict:=False;I:=Row;J:=Col;While(I>0)And(J>0)And NoConflict Do Begin Dec(I);Dec(J);if(Board[I,J]=1)Then NoConflict:=False;End;I:=Row;J:=Col;While(I<=N)And(J>0)And NoConflict Do Begin Inc(I);Dec(J);if(Board[I,J]=1)Then NoConflict:=False;End;Can_Place:=NoConflict;End;Procedure Place(var Board:ChessBoard;Row,Col:Integer);Begin if(Col>N)Then Display(Board,N)Else Repeat Begin Initialize(Col);if Can_Place(Row,Col)Then Begin Board[Row,Col]:=1;Place(Board,1,Col+1)End;Inc(Row)End;Until(Row>N);End;Begin N:=8;Place(Board,1,1);ReadLn;End.

Na ogromnej szerokości będzie to jedna linijka.
I działa!
W Delphi należy jeszcze dodać {$APPTYPE CONSOLE}


edytowany 1x, ostatnio: Patryk27, 2011-07-07 19:03
Pokaż pozostałe 5 komentarzy
Bo ja wiem... Akurat teraz nie chce mi się myśleć... ;D - Patryk27 2011-07-07 19:58
Oszsz ty... :P - szypxx 2011-07-07 20:01
Nie mówiłbyś tak, gdybyś pisał kod (tj.czytał błędy) od 4 rano... - Patryk27 2011-07-07 20:02
To nie miało być hamskie "oszsz ty" - szypxx 2011-07-07 20:05

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0