
KrivdaTheTriewe
28.11.2016
13:49:34
val evenMax = numbers.toStream.filter( _ % 2 == 0).max
val oddMax = numbers.toStream.filter( _ % 2 == 1).max
чем плохо такое решение, кстати

Grigory
28.11.2016
13:52:21

folex
28.11.2016
13:52:56
и эксепшн кидается на пустой список

KrivdaTheTriewe
28.11.2016
13:53:43
А еще есть проблема, же, что возвращать если нет чётных чисел,или нечётных, или вообще, что функция должна возвращать.

Google

KrivdaTheTriewe
28.11.2016
13:54:38

Grigory
28.11.2016
13:56:20
)

KrivdaTheTriewe
28.11.2016
13:57:47
очень загадочно, если я ошибась, прошу указать на мою ошибку, дабы я устранил своё невежество в данном вопросе, пожалуйста

Grigory
28.11.2016
14:00:34
да, я не правильно написал, max и min для стрима это редьюс лефт
как и для списка
если не ошибаюсь, оба наследуют траверсабл ванс

Pp
28.11.2016
14:02:37

Grigory
28.11.2016
14:03:05
можно не конвертировать в стрим; думаю такая же сложность будет

folex
28.11.2016
14:03:43

Pp
28.11.2016
14:03:55
Хмм
Жаль, потом обратно затупливать придется

KrivdaTheTriewe
28.11.2016
14:07:25
нет?

Google

Pp
28.11.2016
14:09:20
Ай дунно

Vasily
28.11.2016
14:10:02
Хренью страдаете

KrivdaTheTriewe
28.11.2016
14:10:05
а это важно

Vasily
28.11.2016
14:10:15
Решается в два прохода
По коллекции

KrivdaTheTriewe
28.11.2016
14:10:33
нужен код

folex
28.11.2016
14:10:40
просто fold и в 1 проход, нет?

Vasily
28.11.2016
14:10:48
Тока на f# могу :)

KrivdaTheTriewe
28.11.2016
14:11:15

Vasily
28.11.2016
14:11:32
В целом можно в один прохход без фолда
Две переменные под максимумы
Если фолд, то в качестве аккума tuple
Он же кортеж

KrivdaTheTriewe
28.11.2016
14:14:01
Тут ключевой вопрос, что делать с валидацией данных

?Ivan
28.11.2016
14:14:17
l.foldLeft[(Option[Int], Option[Int])]((None, None)) { case ((odd, even), v) => if (v % 2 == 0) (odd.map(m => math.max(m, v)), even) else (odd, even.map(m => math.max(m, v))) }
хотя нет, днище

Igor
28.11.2016
14:15:49
почему? по-моему норм
осталось причесать

?Ivan
28.11.2016
14:16:14
none всегдя маппиться в none

Pp
28.11.2016
14:16:18
Можно if в гварды засунуть

Google

Pp
28.11.2016
14:16:27
Можно даже сравнение туда засунуть
Будет аккуратно и читабельно, но много печатать

Alex
28.11.2016
14:17:58
там надо нулём инициализировать и отдельно проверять на пустоту

Aleksei
28.11.2016
14:18:24
а если максимум отрицательный? )

Alex
28.11.2016
14:18:38
ну MINVALUE

KrivdaTheTriewe
28.11.2016
14:22:20
не?

folex
28.11.2016
14:22:43
для всех целых
N, вот это всё

KrivdaTheTriewe
28.11.2016
14:23:35
Да, ошибся, прошу прощения

?Ivan
28.11.2016
14:24:51
как то так:
val l = List(1,2,3,4)
def max(v: Int, prevValue: Option[Int]) = {
prevValue match {
case None => v
case Some(x) => math.max(v, x)
}
}
l.foldLeft[(Option[Int], Option[Int])]((None, None)) { case ((odd, even), v) => if (v % 2 == 0) (Some(max(v, odd)), even) else (odd, Some(max(v, even))) }

Oleksandr
28.11.2016
14:25:00
var odd = Option.empty[Int]
var even = Option.empty[Int]
for (i <- numbers) {
if (i ℅ 2 == 0) odd match {
case Some(old) if old < i => odd = Some(i)
case None => odd = Some(i)

Oleksandr
28.11.2016
14:25:20
ну и для нечетных

Vasily
28.11.2016
14:25:27
Без фолда поинтереснее

Oleksandr
28.11.2016
14:25:27
лениво с моба писать все
интересно, можно ли не писать "odd = Some(i)" дважды, как-то вывернуть этот иф

KrivdaTheTriewe
28.11.2016
14:26:10
varчики подъехали

?Ivan
28.11.2016
14:26:31

Oleksandr
28.11.2016
14:26:42
как будто что-то плохое

Pp
28.11.2016
14:32:31
Будет аккуратно и читабельно, но много печатать
l.foldLeft[(Option[Int],Option[Int])]((None, None)) {
case ((Some(odd), even), v) if v % 2 == 1 && odd < v => (Some(v), even)
case ((odd, even), v) if v % 2 == 1 => (odd, even)
case ((odd, Some(even)), v) if even > v => (odd, Some(v))
case ((odd, even), v) => (odd, even)
}

Google

Oleksandr
28.11.2016
14:33:33
а теперь добавь ещё аналогичные минимумы

Pp
28.11.2016
14:33:34
Можно не разделять odd и even на 2 и 4 строчке, вместо v написать _

Oleksandr
28.11.2016
14:34:09
не, я про поиск 4 чисел
мин/макс чет/нечет

Admin
ERROR: S client not available

Oleksandr
28.11.2016
14:34:32
у фолда сложность линейная
(количество кода, который надо добавить)

Alex
28.11.2016
14:35:12
да просто скомпозить два моноида

KrivdaTheTriewe
28.11.2016
14:37:48
Мне нравится этот подход !
<dependency>
<groupId>org.scalaz</groupId>
<artifactId>scalaz-core_${scala.suffix.version}</artifactId>
</dependency> врывается в тред , да у меня нет sbt на проекте :(

Grigory
28.11.2016
14:39:23
противник джава стайла)

Oleksandr
28.11.2016
14:43:26

?Ivan
28.11.2016
14:43:47
val l = List(1,2,3,4)
def value(v: Int, prevValue: Option[Int], f: (Int, Int) => Int) = {
prevValue match {
case None => Some(v)
case Some(x) => Some(f(v, x))
}
}
case class Result(a: Option[Int], b: Option[Int], c: Option[Int], d: Option[Int])
l.foldLeft(Result(None, None, None, None))((r, v) =>
if (v % 2 == 0)
r.copy(a = value(v, r.a, math.min), b = value(v, r.b, math.max))
else
r.copy(c = value(v, r.c, math.min), d = value(v, r.d, math.max))
)

Alex
28.11.2016
14:44:36
общий то зачем

folex
28.11.2016
14:45:09
#codegolfday

Alex
28.11.2016
14:45:51
сделать два инстанса полугруппы для Even и Odd и потом xs.fold[(Option[Even], Option[Odd])]

KrivdaTheTriewe
28.11.2016
14:46:00
Имхо Int на Long стоит заменить

?Ivan
28.11.2016
14:49:19
чтобы тип вообще не указывался, а выводился из коллекции

Google

Vasily
28.11.2016
14:56:05
Я сделяль...
let findMax (x:int option) (y:int option)=
match x,y with
|Some a ,Some b->Some (Math.Max(a,b))
|Some a,_->x
|_,Some b->y
|_,_->None
let isEven (number:int option)=
match number with
|Some x when x%2=0->Some true
|Some x when x%2<>0->Some false
|_->None
let calcMax arr =
arr|>Seq.fold (fun (even,odd) x-> match isEven x with
|Some true-?findMax even x),odd)
|Some false-?even,(findMax odd x))
|_-?even,odd))
Типизация по вкусу соответственно

KrivdaTheTriewe
28.11.2016
15:15:09
в F# смайликами программируют?

Mikhail
28.11.2016
15:15:36
у тебя ненужное условие в isEven
да и функция работает неправильно)
хотя там же инт на входе, тогда просто ненужное

Vasily
28.11.2016
15:26:51
Там опшн на входе
Опшн на выходе

Mikhail
28.11.2016
15:27:38
тощно)

Vasily
28.11.2016
15:36:48
В условии у нас коллекция опшнов, соответственно и работаем с опшнами по возможности

?Ivan
28.11.2016
15:41:32

Alex
28.11.2016
15:43:06
да вроже норм
только двойные скобки убрать
( o => { }) -> { o => }

?Ivan
28.11.2016
15:43:56
да, точно проглядел