IPB

Здравствуйте, гость ( Вход | Регистрация )

> Заполнение матрицы по спирали, желательно на функциональном яп.
packa
сообщение 17 Mar 2013, 11:25
Сообщение #1

Immortal
Сообщений: 3 301
Спасибо сказали: 2643 раза




Интересует алгоритм заполнения матрицы по спирали.

Что значит заполнение по спирали
Код
01 02 03 04 05 06 07
24 25 26 27 28 29 08
23 40 41 42 43 30 09
22 39 48 49 44 31 10
21 38 47 46 45 32 11
20 37 36 35 34 33 12
19 18 17 16 15 14 13


Что в данном случае матрица:

Матрица это список списков
Код
'( (01 02 03 04 05 06 07)
(24 25 26 27 28 29 08)
(23 40 41 42 43 30 09)
(22 39 48 49 44 31 10)
(21 38 47 46 45 32 11)
(20 37 36 35 34 33 12)
(19 18 17 16 15 14 13) )


Собственно внешний контур еще как то удается обработать
(взять первый элемент матрицы,
взять первый элемент в каждом инвертированном элементе матрицы
взять первый элемент инвертированной матрицы
и наконец взять первый элемент в каждом элементе матрицы)

Как поступать далее не знаю. Собственно из описания видно что самое лучшее что мы умеем это брать первый элемент чего-то(соответственно и последний)
Что то из середины брать довольно трудно и нет специальных инструментов
Конечно их можно попробовать сделать, но это другая опера.

язык scheme но не думаю что кто то здесь достаточно хорошо с ним знаком)


--------------------
Удалено Администрацией. Браузеры жаловались на вредоносное ПО.
Ссылка на оригинальное изображение: http://herоeslibrary.nеt/Site_images/admin.jpg
Ссылка на сайт по нажатию баннера: http://herоeslibrary.nеt

(ссылки содержат кириллические символы вместо оригинальных)

Видишь бяку, - упрости! (с) кто-то из выдающихся математиков)
Учи матан & Сходи с ума (с) архидедус


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
gamecreator
сообщение 17 Mar 2013, 13:26
Сообщение #2

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




реализация на common lisp (+ бонусная функция вывода матрицы на экран)


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Shurup
сообщение 17 Mar 2013, 14:26 (Сообщение отредактировал Shurup - 17 Mar 2013, 14:33)
Сообщение #3

Щирий українець
Сообщений: 1 456
Спасибо сказали: 3026 раз




На джаваскрипт

Код
    var directions=[[1,0],[0,1],[-1,0],[0,-1]];
    var matrix = [
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],        
    ]


    function fillSpirale(col,row,direction,W,H,index){
        var    curdir =  directions[direction];
        var count = curdir[0]?W:H;
        if (!count){
            return;
        }
        for (var i=0;i<count;i++){
            col += curdir[0];
            row += curdir[1];
            matrix[row][col]=index++;            
        }
        direction++;
        if (direction >3){
            direction=0;
        }
        W-=Math.abs(curdir[1]);     //если проходили  вертикально - то теперь ширина меньше на 1.
        H-=Math.abs(curdir[0]);
        fillSpirale(col,row,direction,W,H,index);
    }

    fillSpirale(-1,0,0,7,7,1);


Можно было бы конечно не использовать глобальный массив, а передавать его в функцию, да и решение с "-1" колонкой мне тоже не очень нравится. Но смысл вроде понятен.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 17 Mar 2013, 16:18
Сообщение #4

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




более изящное решение (использует -make-range-list из предыдущего)


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
packa
сообщение 17 Mar 2013, 19:37
Сообщение #5

Immortal
Сообщений: 3 301
Спасибо сказали: 2643 раза




t = else
nil = null ?

Кто вообще придумал такое? Не можно чтоли более говорящие название, а не "t"

Почему кстати не через if? у тебя же одноступенчатые


--------------------
Удалено Администрацией. Браузеры жаловались на вредоносное ПО.
Ссылка на оригинальное изображение: http://herоeslibrary.nеt/Site_images/admin.jpg
Ссылка на сайт по нажатию баннера: http://herоeslibrary.nеt

(ссылки содержат кириллические символы вместо оригинальных)

Видишь бяку, - упрости! (с) кто-то из выдающихся математиков)
Учи матан & Сходи с ума (с) архидедус


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 17 Mar 2013, 19:47
Сообщение #6

😸🧡✊✌️
Сообщений: 16 375
Спасибо сказали: 3199 раз




packa: это LISP, детка!

Цитата(packa @ 17 Mar 2013, 19:37) *
t = else
t это ... true


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
packa
сообщение 17 Mar 2013, 20:45
Сообщение #7

Immortal
Сообщений: 3 301
Спасибо сказали: 2643 раза




Довольно неожиданно.
Всмысле условие при true идет в конце???

Опять они со своим синтаксисом шутят?)


--------------------
Удалено Администрацией. Браузеры жаловались на вредоносное ПО.
Ссылка на оригинальное изображение: http://herоeslibrary.nеt/Site_images/admin.jpg
Ссылка на сайт по нажатию баннера: http://herоeslibrary.nеt

(ссылки содержат кириллические символы вместо оригинальных)

Видишь бяку, - упрости! (с) кто-то из выдающихся математиков)
Учи матан & Сходи с ума (с) архидедус
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 17 Mar 2013, 21:03
Сообщение #8

😸🧡✊✌️
Сообщений: 16 375
Спасибо сказали: 3199 раз




Да, последняя ветка для условия true. Можно было бы сказать, что да, это такое else, но это не совсем верно.


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 17 Mar 2013, 22:02
Сообщение #9

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




Цитата(packa @ 17 Mar 2013, 18:37) *
nil = null ?
да, или ложь. в зависимости от контекста.
Цитата(packa @ 17 Mar 2013, 18:37) *
Почему кстати не через if? у тебя же одноступенчатые
мне больше нравится cond, он универсальный


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 17 Mar 2013, 22:10
Сообщение #10

😸🧡✊✌️
Сообщений: 16 375
Спасибо сказали: 3199 раз




Он кондовее. )))


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
packa
сообщение 18 Mar 2013, 19:49 (Сообщение отредактировал packa - 18 Mar 2013, 19:51)
Сообщение #11

Immortal
Сообщений: 3 301
Спасибо сказали: 2643 раза




На паре вот так запилили:

Код
    #lang racket
    
    (define (matr n name)
      ;==========
      (define (build-matr m n func)
        (build-list m (λ (x) (build-list n (λ (y) (func x y))))))
         ;==========
      (define (proc i j)
        (define (iter i j s n)
          (cond
            ((= i (- n 1)) (+ s (* 2 (- n 1)) (- n j)))
            ((= i 0)       (+ s j 1))
            ((= j (- n 1)) (+ s n i))
            ((= j 0)       (- (+ s (* n 4) ) i 3))
            (else (iter (- i 1) (- j 1) (+ s(* 4 (- n 1)) ) (- n 2)))))
        (iter i j 0 n))
         ;=========
      (define out (open-output-file name #:exists 'replace))
      (define mat (build-matr n n proc))
      (for-each (λ (line)
                  (for-each (λ (ch)
                              (write ch out) (write-char #\ out)) line)
                  (write-char #\return out)
                  (write-char #\newline out)) mat)
      (close-output-port out))


--------------------
Удалено Администрацией. Браузеры жаловались на вредоносное ПО.
Ссылка на оригинальное изображение: http://herоeslibrary.nеt/Site_images/admin.jpg
Ссылка на сайт по нажатию баннера: http://herоeslibrary.nеt

(ссылки содержат кириллические символы вместо оригинальных)

Видишь бяку, - упрости! (с) кто-то из выдающихся математиков)
Учи матан & Сходи с ума (с) архидедус


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 19 Mar 2013, 18:50
Сообщение #12

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




кто вас только учит форматировать код
Go to the top of the pageAdd Nick
 
+Quote Post
Guevara-chan
сообщение 20 Mar 2013, 11:01 (Сообщение отредактировал Guevara-chan - 20 Mar 2013, 19:21)
Сообщение #13

•●Revolucionario●•
Сообщений: 2 467
Спасибо сказали: 5936 раз




Списки, списки everywhere... Никакой вам лямбды, но душа на месте:

Код
Structure OfIntegarz : List _.i() : EndStructure
NewList Matrix.OfIntegarz(); Essential.
#TestWidth = 6 : #TestHeight = #TestWidth : #Edge = 99; Settings.

Procedure SetUp(List List.OfIntegarz(), Width, Height, Edge = #Edge); Make.it, kinda essential as well...
Define I, K, *Childe.OfIntegarz : ResetList(List())
For I = 1 To Height : AddElement(List()) : *Childe = @List()
For K = 1 To Width  : AddElement(*Childe\_()) : *Childe\_() = Random(Edge)
Next K : Next I
EndProcedure
;/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\
Macro NE : NextElement     : EndMacro
Macro PE : PreviousElement : EndMacro
Macro AEdge(Val, Neg, Pos, Det, Sect) : Bool(Val >= (Neg+Det) And Val < (Pos-(Det)) And (Sect)) : EndMacro
Macro REdge(Val, Neg, Pos, Det, Sect) : Bool(Val > (Neg+Det) And Val <= (Pos-(Det)) And (Sect)) : EndMacro

Procedure Fillomania(List List.OfIntegarz()); Spiral.it, you asked for that.
Define Y, YBound = ListSize(List()) - 1, *P.Point
Define X, XBound = ListSize(List()\_()) - 1, Accum
Define XHalf.f = (XBound+1) / 2.0
Define YHalf.f = (YBound+1) / 2.0
NewList Edgez.Point(); Caching.
ForEach List() : AddElement(Edgez()) : *P = @Edgez(); Speeding future up...
FirstElement(List()\_()) : *P\X = @List()\_() : LastElement(List()\_()) : *P\Y = @List()\_()
Next : FirstElement(List()) : FirstElement(List()\_()) : FirstElement(Edgez())
List()\_() = Accum : Repeat : Select #True
Case AEdge(X, -1, XBound, Y, Y < YHalf)  : NE(List()\_()) : X + 1
Case AEdge(Y, 0, YBound, XBound-X, 1.0+X > XHalf) : NE(List()) : NE(Edgez()) : Y + 1 : ChangeCurrentElement(List()\_(), EdgeZ()\Y)
PE(List()\_()) : EdgeZ()\Y = @List()\_() : NE(List()\_())
Case REdge(X, 0, XBound, YBound-Y, 1.0+Y > YHalf) : PE(List()\_())  : X - 1
Case REdge(Y, 1, YBound, X, X < XHalf)   : PE(List()) : PE(Edgez()) : Y - 1 : ChangeCurrentElement(List()\_(), EdgeZ()\X)
NE(List()\_()) : EdgeZ()\X = @List()\_() : PE(List()\_())
Default : Break; Acceptable. From reality.
EndSelect : Accum + 1 : List()\_() = Accum  : ForEver
EndProcedure
;\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/-\-/
;{ Graphic whistlez:
Macro Delim() : LSet("", 28, "=") : EndMacro
Macro Service() : ConsoleColor(3, 0) : EndMacro
Macro Dourly()  : ConsoleColor(7, 0) : EndMacro
Macro Digitz(Val) : (Int(Log10(Val))+1) : EndMacro

Procedure ShowDown(List List.OfIntegarz(), Padding); Show.it, I'm just gonna leave it here:
Define IP = Digitz(ListSize(List())-1)
ForEach List() : Print("["+RSet(Str(ListIndex(List())), IP, "0") + "]: ")
Define *Childe.OfIntegarz = @List()
ForEach *Childe\_() : Print(RSet(Str(*Childe\_()), Padding, "0") + ", ") : Next
Print(#BS$+#BS$+";"+#CRLF$) : Next
EndProcedure

OpenConsole() : ConsoleColor(10, 0) : PrintN("Broken Helix v"+Pow(10, -10)+#CRLF$+Delim())
SetUp(Matrix(), #TestWidth, #TestHeight) : Dourly() : ShowDown(Matrix(), Digitz(#Edge))
Service() : PrintN(Delim()+#CRLF$+"Now, here goes some spiralz:"+#CRLF$+Delim())
Fillomania(Matrix()) : Dourly() : ShowDown(Matrix(), Digitz(#TestWidth*#TestHeight-1))
Service() : Print(Delim()+#CRLF$+"Press ENTER to exit...")
Input(); Press ENTER key to exit. No, really.
;} EndWhistlez.

P.S. Для прямоугольной матрицы можно, в принципе, упростить секторные тесты до счетчика: будет чуть быстрее и красивше.


--------------------
life MOV.I #life+1, *life
האם יש זמן לעצור ?


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 7 July 2025 - 17:35
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика