@Fsharp_chat

Страница 144 из 772
Nikolay
19.05.2017
12:05:44
Или тайп провайдеры не умеют так?

Evgeniy
19.05.2017
12:06:23
@Dolfik WriteTo?

Nikolay
19.05.2017
12:07:10
@Dolfik WriteTo?
Это где?

Roman
19.05.2017
12:07:45
А почему не использовать нормальные сериализаторы вместо тайп провайдера?

Google
Evgeniy
19.05.2017
12:07:51
@Dolfik По идее, этот метод у инстанса твоего типа должен быть.

Artemy
19.05.2017
12:09:30
Вроде, через свойство JsonValue доступно.

Nikolay
19.05.2017
12:09:50
А почему не использовать нормальные сериализаторы вместо тайп провайдера?
А зачем, если нужно один файл один раз сериализовать/десериализовать?

Artemy
19.05.2017
12:10:41
Типа: let x = Settings.Load(...) x.JsonValue.WriteTo(textWriter)

Nikolay
19.05.2017
12:11:08
Settings.GetSample().JsonValue.WriteTo(...)

Вот так)

Evgeniy
19.05.2017
12:11:23
Ага, это оно.

Roman
19.05.2017
12:12:23
А зачем, если нужно один файл один раз сериализовать/десериализовать?
В смысле прочитать сторонний Jason поменять одно значение и записать?

Evgeniy
19.05.2017
12:18:30
@Dolfik Так ты загрузку из файла починил?

Nikolay
19.05.2017
12:21:41
Я тут в перерывах между переносом базы пишу на фшарпе)

Google
Evgeniy
19.05.2017
12:22:55
Ах ты!

Akhmed
19.05.2017
14:33:06
Парни у меня тут одна задачка есть. Я ее решил на F# но такое ощущение что решение не очень.

Кто хочет решить задачу в F# стиле?

Roman
19.05.2017
14:33:27
Akhmed
19.05.2017
14:33:33
// Необходимо из последовательности значений температуры выбрать наиболее близкое к нулю температуру. // При одинаковом значении отрицательной и положительной температуры (-2 и 2) надо выбирать положительную.(2) // При отсутствии значений необходимо возвращать нулевое значение

проспойлерить решение сразу? Или сначала хотите сами попробовать решить?

Roman
19.05.2017
14:34:13
А

а данные на вход в каком виде?

Akhmed
19.05.2017
14:34:27
let temperatures="5 -3 -6 7 -1 8 9"

обычная строка

Roman
19.05.2017
14:34:50
строка, разделители пробелы, всегда

Akhmed
19.05.2017
14:34:55
да

ну и все целочисленное

Vasily
19.05.2017
14:37:03
```s.Split(' ')|>Seq.map (fun x-?int.Parse(x),Math.Abs(x))|>Seq.minBy snd|>Seq.map first

Тьфу

ghbvthyj nfr

примерно так

Akhmed
19.05.2017
14:37:32
не прокатит - ответ будет 1

хотя должно быть "-1"

Vasily
19.05.2017
14:38:02
А, наиболее близкую из положительных

Google
Akhmed
19.05.2017
14:38:02
ааа

Vasily
19.05.2017
14:38:22
Тогда надо чуть переписать

`"5 -3 -6 7 -1 1 8 9".Split(' ')|>Seq.map int|>Seq.map(fun x-?x,Math.Abs(x)))|>Seq.sortByDescending fst|>Seq.minBy snd |> fst

Пилять

Как тут код писать?

Dmitry
19.05.2017
14:47:16
а так работает или нет

` x3

k0balt
19.05.2017
14:47:27
Как тут код писать?
в конце тоже `

Dmitry
19.05.2017
14:47:59
тут код в много строк

короч по три ` в начале и конце

Akhmed
19.05.2017
14:48:28
сорт в принципе не нужен - а так работает

k0balt
19.05.2017
14:48:29
много строк если, то три `

k0balt
19.05.2017
14:48:52
если 1 строка, то одна `

Akhmed
19.05.2017
14:50:01
ща

подправил, вот:

open System let temperatures="5 -3 -6 7 -1 8 9" //let temperatures="" let closedToZero temperatures= if String.IsNullOrEmpty(temperatures) then 0 else temperatures.Split([|' '|]) |> Seq.map(fun x->int(x), Math.Abs(int(x))) |> Seq.minBy snd |> fst

но вот что лично мне не нравится в этом решении это то что если список большой то мы все равно будем итерировать до конца хотя понятно что если есть хотя бы один ноль то на этом можно было бы остановиться

а ну да - еще в этом решении не соблюдается условие что если есть -1 и 1 то надо всегда выбирать 1

Google
Roman
19.05.2017
15:09:03
не продумано

Pavel
19.05.2017
15:19:09


Хоть что-то про F#

Akhmed
19.05.2017
15:23:04
а dotnet разве сегодня?

k0balt
19.05.2017
15:23:27
http://ideone.com/rOw9gd
с takeWhile 0 не попадает в выборку

Roman
19.05.2017
15:23:36
Vasily
19.05.2017
15:25:56
Я поэтому сорт и сделал

Чтобы первый min вернул

Igor
19.05.2017
15:26:12
Опять что-то про ботов, azure, и data sience?

Admin
ERROR: S client not available

Roman
19.05.2017
15:26:13
Я поэтому сорт и сделал
с sort много оверхеда

Akhmed
19.05.2017
15:26:14
Сорт убивает смысл проверки на ноль

мы делаем прохождение

Vasily
19.05.2017
15:26:46
Тогда условие с положительной температурой не будет соблюдаться

Akhmed
19.05.2017
15:27:01
почему же - вот решение Романа соблюдает

Roman
19.05.2017
15:27:17
там теперь takeWhile добавился, который все ломает

Akhmed
19.05.2017
15:27:32
я сделал такое же решение как у Романа - но не так кратко и элегантно - разложил все по отдельности )

Vasily
19.05.2017
15:27:36
А где решение Романа?

Roman
19.05.2017
15:28:02
Akhmed
19.05.2017
15:28:49
open System let temperatures="5 -3 -6 7 -1 8 9" // let temperatures="" let tempArray=if String.IsNullOrEmpty(temperatures) then Seq.empty else temperatures.Split([|' '|]) |> Seq.map int let closedToZeroByAbs x y = if abs x < abs y then x else y let closedToZero x y = if abs x = abs y then max x y else closedToZeroByAbs x y let closedToZeroFromSequence tempArr=if Seq.isEmpty tempArr then 0 else Seq.reduce closedToZero tempArray closedToZeroFromSequence tempArray |> printfn "%i" - решение хоть и аналогичное но синтаксически хуже чем у Романа.

Google
Vasily
19.05.2017
15:42:22
let res="5 -3 -6 7 -1 1 8 9".Split(' ')|>Seq.map int|>Seq.map(fun x->(x,Math.Abs(x)))|>Seq.fold (fun acc (x,y)->match acc with |0,0->x,y |n,a when y<a->x,y |n,a when y=a->if(x>n) then (x,y) else acc |_->acc ) (0,0) |>fst

Во, получилось

Без сорта

В целом можно и без первого мапа обойтись

Akhmed
19.05.2017
15:44:18
тут собственно он кортеж создает и по прежнему полное прохождение ведь делает даже если 0 встретит

ну т.е. если у тебя гигабайт данных и первое значение 0 то проходить весь гигабайт нет смысла

Vasily
19.05.2017
15:45:10
На нолике мы должны уйти из цикла?

Akhmed
19.05.2017
15:45:18
крайне желательно

Vasily
19.05.2017
15:45:21
Тогда рекурсия

Akhmed
19.05.2017
15:45:27
просто на C# это ничего не стоит сделать

в императивном стиле

Vasily
19.05.2017
15:58:56
let res="5 -3 -6 7 -1 1 8 9".Split(' ') |> Seq.map int|>List.ofSeq let rec parse arr acc = match arr with |[]->acc |hd::tl->if(hd=0) then 0 else match hd,acc with |x,0->parse tl x |x,y when Math.Abs(x)=Math.Abs(y)->if(x>y) then x else y |x,y->parse tl (Math.Min(Math.Abs(acc),Math.Abs(x))) let r=parse res 0

Akhmed
19.05.2017
15:59:35
я тоже такое же решение получил

но все упирается в этот гадский List.ofSeq

Vasily
19.05.2017
15:59:42
И даже упростить слегка можно, по идее

Можно без него

Akhmed
19.05.2017
16:00:00
он ведь по сути еще хуже - создает в памяти список

для Seq match |[] не получается сделать (

ну т.е. вместо него можно Seq.isEmpty

но вот |hd::tl ->

Vasily
19.05.2017
16:01:12
Of

Ща

Страница 144 из 772