Fork me on GitHub
#clojure-russia
<
2017-02-09
>
rmuslimov00:02:54

Собственно поинт был в том что тебе жалко свое время, но не жалко чужого. Это не хорошо

kgofhedgehogs00:02:13

@rmuslimov Ну да, так можно воспринять мой подход к обучению, но я бы не сказал, что мне жалко своё время, скорее мне хочется за меньший промежуток времени узнать больше, чем я смог бы своими силами. Я как никак за неделю потратил на изучение кложуры не меньше 2.5 суток чистого времени

kgofhedgehogs00:02:06

К слову, раз уж о моем коде говорили. Вместо того, чтобы менять структуру данных, я сделал статистику работы программы Поле 160х120. Около 5000 клеток в начале. Время вместе с отрисовкой. Отрисовка занимает от 2 до 15 мс

kgofhedgehogs00:02:01

Вот так увлекательно это выглядит:

andmed05:02:41

@ssesutchenkov ну да. Лайф же! Кгохнеджехог любимую тему задел))

kishanov06:02:24

ащпе лучше через 4clojure или hackerrank учить, там после того, как свой костыль заслал можно другие решения посмотреть и сделать выводы

kishanov06:02:48

а еще раз в год полезно перерешивать с нуля и сравнивать со своими же решениями - вот где стыд и позор наружу вылазает 🙂

kgofhedgehogs10:02:42

О 4clojurе и hackerrank не знал, спасибо

kgofhedgehogs10:02:29

А пересмотр старых решений это да, всегда и на всех языках так :)

mike_ananev11:02:51

Вопрос про clojure.spec. Если есть обычная функция выдающая число, как ее превратить в генератор для спеки?

kgofhedgehogs15:02:46

Это можно как-нибудь умно без loop'а написать на кложуре? Код на питоне:

def parity_bit(x):
    bit = 0
    while x != 0:
        bit ^= 1
        x &= (x - 1)    
    return int(bit)

kgofhedgehogs15:02:29

У меня получилось только с лупом Выглядит очень плохо

nwalkr15:02:14

адовый какой-то код

nwalkr15:02:06

запиши через (reduce … (range x 0))

nwalkr15:02:40

я вообще понять не могу, что оно должно делать и зачем там именно x &= x-1 в цикле

nwalkr15:02:10

там в оригинале нет какого-то коммента, это то вычисление parity bit, что описано в вики, или это что-то другое, просто криво названное?

nwalkr15:02:15

http://p-nand-q.com/python/algorithms/math/bit-parity.html - бери любой из оптимизированных и переписывай

kgofhedgehogs15:02:08

Это алгоритм отсюда, вон, снизу на скрине

nwalkr15:02:36

ну и зачем его брать, если там ниже есть нормальные?

kgofhedgehogs15:02:55

Мне он понравился

nwalkr15:02:32

а потом ты спрашиваешь, как сделать код быстрее

kgofhedgehogs15:02:12

НУУ))) Это разные вещи

kgofhedgehogs15:02:44

Я посмотрел остальные алгоритмы, они завязаны на битности типа, мне не хочется иметь эту зависимость :С

andmed15:02:34

ну вроде совет был вернуться к массивам (читай -- примитивам) а не реализовывать битность на кложе-структурах..

kishanov15:02:07

@mike1452 надо оперелить spec с помощью with-spec и в нем написать кастомный генератор, использующий эту функцию

dottedmag16:02:07

@kgofhedgehogs #(bit-and (Integer/bitCount %) 1)

dottedmag16:02:41

Лениво полный defn писать.

a.espolov16:02:50

Я вот еще про спек. Мне руками придется проверять какая спека подошла для текущего набора данных?

dottedmag16:02:27

@kgofhedgehogs Нужно сначала посмотреть примитивы языка. На SSE4+ Integer/bitCount будет скомпилирован в одну ассемблерную инструкцию POPCNT.

dottedmag16:02:07

Long/bitCount тоже есть.

kgofhedgehogs17:02:48

Спасибо!

kishanov17:02:17

@a.espolov что значит “руками проверять”? ты определяешь спек, в месте где хочешь проверить вызываешь (s/valid? ::spec-name data) или (s/explain-data ::spec-name data) если хочешь получить ошибки, которые можно попарсить

a.espolov17:02:56

@kishanov Вот у меня набор спек и набор данных. Как узнать какая спека соответствует этому набору данных?

a.espolov17:02:52

Понятное дело вызвать функции conform или valid?

kishanov17:02:03

спек - это не тип, он существует сам по себе от данных и магическим образом нигде не биндится на данные, т.е. если ты хочешь иметь что-то типа data.getType() со спеком так не работает

kishanov17:02:29

там, где хочешь проверить, что данные нужной формы - пропускаешь их через s/valid, s/conform и проч

a.espolov17:02:37

Вот я и говорю руками)

a.espolov17:02:26

Берешь проверяешь по одной спеке к набору данных пока не найдешь "подходящую"

kishanov17:02:20

эммм, спеку не для такого использования подразумевали. объясни use case свой

a.espolov17:02:37

Подключаюсь по вебсокетам к сервису подписываюсь на три канала, сообщения это вектор с разным количеством элемнтов и разными типами

a.espolov17:02:55

Можно попробовать три подключения создать вместо одного

a.espolov17:02:29

И не тратить ресурсы браузера на разбор типа входящих сообщений

a.espolov17:02:03

Но вариант с одним коннекшеном тоже норм смотрится

kishanov17:02:09

ну это тебе server side должен давать какую-то дополнительную информацию, чтобы понять что за данные. не думаю, что существует какая-то технология, которая получает поток разношерстных данных и магическим образом определяет что за данные, не имея дополнительной информации

a.espolov17:02:16

Да я бы и не заморачивался если бы бекенд был мой

misha17:02:32

ну на канал редюсер подцепить, который перебором валидирует/конформит данные, и дальше передает их уже с "тайп хинтом"

artemyarulin17:02:57

есть же (s/or :a ::spec1 :b ::spec2) оно вроде как раз оно не?

artemyarulin17:02:57

после conform он вернет как раз ключ + conformed value

artemyarulin17:02:08

если я не наврал

artemyarulin18:02:57

вроде работает

user=> (s/def ::a string?)
:user/a
user=> (s/def ::b int?)
:user/b
user=> (s/def ::ac (s/or :a ::a :b ::b))
:user/ac
user=> (s/conform ::ac "aaa")
[:a "aaa"]
user=> (s/conform ::ac 1)
[:b 1]

artemyarulin18:02:39

>ну это тебе server side должен давать какую-то дополнительную информацию, чтобы понять что за данные. не думаю, что существует какая-то технология, которая получает поток разношерстных данных и магическим образом определяет что за данные, не имея дополнительной информации и имя этой магии clojure.spec parrot

kishanov18:02:04

@artemyarulin да, ты прав, я забыл что s/or позволяет варианты именовать

kishanov18:02:58

полиморфизм через s/or и core.match 🙂

artemyarulin18:02:47

ага, можно один api сделать который будет принимать что угодно (на беке спекой разбирать что пришло) и в ответ получить что угодно, тоже спекой разбирать. Круто же!)

a.espolov18:02:01

@artemyarulin вот спасибо