воскресенье, 27 октября 2013 г.

Греческий пейзаж.


Уединённый пляж на юге Крита. 
Два раза мы пытались разбить на нём палатку, и оба раза отказались от этой затеи. Помешал мощнейший ветер. Я уже не раз имел сомнительное удовольствие ночевать в палатке при штормовых порывах ветра. Это когда ты безуспешно пытаешься заснуть, и как только это получается, палатка под действием ветра начинает бешенно лупить тебя по спине.  Спасибо, как нибудь в другой раз! 
Пришлось ограничиться купанием и ланчем.

понедельник, 21 октября 2013 г.

Задачка от Dzone: Remove Duplicates From a Linked List

Задача:
Given an unsorted linked list, and without using a temporary buffer, write a method that will delete any duplicates from the linked list.  
Моё решение на Scala:
 

def removeDuplicates[A](li: List[A]): List[A] =
  li match{
   case Nil => li
   case h::Nil => li
   case h::t => if(t.contains(h)) removeDuplicates(t) else h::removeDuplicates(t)
  }


воскресенье, 13 октября 2013 г.

Посещение Ираклеонского Археологического музея

Основная экспозиция всё ещё на замке. Но ремонтные работы, длящиеся уже 10 лет, подходят судя по всему к концу. То один, то другой зал музея открывает свои двери для посетителей. В тестовом режиме, так сказать. В этом году нам посчастливилось попасть в зал с минойскими фресками, об этом я и расскажу.

На первом этаже музея, как и ранее, открыты временная микроэкспозиция плюс зал со статУями. Фрески же разместились на втором этаже. Декорировал зал по-взрослому: мраморные полы, толстые стеклянные щиты для защиты фресок. Внушает. Скамейки тоже имеются. Вот, например, мой сын. Минойское искусство ему вообще никак. А если на скамеечке, да с телефоном  в руках - то можно и потерпеть, пока родители рассматривают что-то непонятное за стеклом.

пятница, 11 октября 2013 г.

Задачка от Dzone: Sudoku Checker

Задача:
Write a program that will accept a 2D array and check if it contains a 100% correct Sudoku solution. For those unfamiliar with the rules, check out http://www.sudoku.name/rules/ .  
Моё решение на Scala:
 

package solver

object SudokuSolver {
  type Sudoku = IndexedSeq[IndexedSeq[Int]]
  
  def toSudoku( s: String): Sudoku  =
   s.split("\n").toVector.map(_.split(" ").map(_.toInt).toVector)

   def check( sudoku:  Sudoku )=
   linesCorrect(sudoku) && rowsCorrect(sudoku) && blocksCorrect(sudoku)
   
    private def isCorrect( splitMethod: Sudoku=>Sudoku) ={
   s:Sudoku => splitMethod(s).filter( isCombinationWrong).isEmpty
   }
   
   private val blocksCorrect = isCorrect(splitToBlocks)
   private val rowsCorrect = isCorrect(splitToRows)
   private val linesCorrect = isCorrect(splitToLines)  
   
   private def splitToLines( sudoku: Sudoku) = sudoku
  
   private def splitToRows( sudoku: Sudoku) =
  for( i <- 0 to 8 )
   yield( for(j<-0 to 8) yield( sudoku(j)(i) ) )
   
  private def splitToBlocks( sudoku: Sudoku) =
  for( i <- 0 to 8 by 3; j <- 0 to 8 by 3 )
   yield( for(ii <- 0 to 2; jj<- 0 to 2 )
    yield(sudoku(i+ii)(j+jj)) )
    
  private def isCombinationWrong( comb: IndexedSeq[Int]) = comb.min != 1  || comb.max != 9 || comb.toSet.size != 9
}

среда, 2 октября 2013 г.

Ущелье Розас: как стать альпинистом

Коричневый указатель на неизвестное ущелье я заприметил по дороге из пещеры Зевса (или Психра). Решение посетить данное место было принято незамедлительно. На следующее утро личный состав выдвинулся в сторону деревни Гониес. Именно тут находится отворот на ущелье Розас.

Задачка от Dzone: A Simple Number Printing Exercise

Задача:
Create a method that takes a string parameter and looks for pairs of strings in the code, breaking the string up using spaces as the delimiter. There are two types of pairs, combinations and adjacent, and you'll need to find a count of each. Adjacent pairs appear alongside each other, while combination pairs cover every permutation that can be found of pairing the strings.

So if you have a string 
dzone java dzone dzone javascript java
the results would be 
dzone has 1 adjacent pair
dzone has 3 combination pairs (0,2) (0,3) (2,3)
java has 1 combination pair (1,5) 


Моё решение на Scala:
 
def hasRepeats( n: Int) = {
    def innerHasRepeats( s: List[Char]):Boolean = s match {
        case a::b::tail =>
          if( a == b) true else innerHasRepeats( b::tail)
        case _ => false
    }
  
     innerHasRepeats( n.toString.toList )
}
  
  
(45 to 4578).filter( !hasRepeats(_) == true).size