Интересные задачи для программистов

DV
На сайте с 01.05.2010
Offline
644
#11

Выхлоп в CSV, в JSON лень.

#!/bin/sh


wget -qO- 'https://0x.com.ua/task-1.json' | sed 's/},{/}\
{/g' | sed 's/\:/,/g' | sed 's/\}//g' | sed 's/\]//g' |
LC_ALL=C awk -F \, '{if($4 > 0.7) print $2 ";" $4}' > out.csv
VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
danforth
На сайте с 18.12.2015
Offline
153
#12
VoV@:
Если не грузить сразу в память всё, то ИМХО, только и перебором символов получится.

Ну оно по сути все через перебор символов работает, только можно делать это буферизированно, а можно задалбывать диск и ядро сисколами, читая по 1 байту.

И можно сразу в память все распаковать, а можно читать и по чуть-чуть распаковывать, попутно высвобождая память. У второго подхода как вы понимаете много преимуществ, на слабых машинах можно парсить огромнейшие файлы, можно прервать распаковку на пол пути, если например стоит задача читать до тех пор, пока не найдем нужный нам объект.

За сколько у вас отработал ваш код на данном файле?

Junior Web Developer
T7
На сайте с 19.09.2018
Offline
63
#13
VoV@:
ИМХО, только и перебором символов получится

Решения выше было со stream_get_line, пачкой символов до разделителя + preg_match. Чтение по одному символу позволяет проще решить задачу.

Особенно если чуть задачу усложнить. В json

[
  {

"id":2234,
"scores":{
"max":267,
"min":17
}
},
{
"id":2235,
"name":"OOOYO",
"price":200319.12,
"scores":{
"max":408,
"min":78
}
}
И надо найти scores.max, например более 500, при этом формат объектов гибкий

Чуть изменив код


$read=0;
......
if($c=='{'){
$read++;
}
if($read>0) {
$str.=$c;
}
if($c=='}') {
$read--;

задача легко решается

------------

danforth:
а можно задалбывать диск и ядро сисколами, читая по 1 байту.

Это да, конструктивное замечание, но за 20 мин сложно набросать рабочее. Мне по крайней мере.:(

png json-2.png
Sly32
На сайте с 29.03.2012
Offline
303
#14

Вот полностью рабочий код с посимвольным вычитыванием на Питон


import json
import time


def truncate_row(data):
start = time.time()
with open('res-task-1.json', 'w') as res:
res.write('[') with open(data) as f:
pos = 1
flag = False
js = ''
while pos:
char = f.read(pos)
if char == ']':
break
if char == '{':
flag = True
if flag:
js += char
if char == '}':
flag = False
data = json.loads(js)
if data.get('scores') >= 0.7:
res.write(json.dumps(data)+',')
js = ''
size = res.tell()
res.truncate(size - 1)

with open('res-task-1.json', 'a') as res:
res.write(']')
print(f'Executing time: {time.time() - start}')


truncate_row('task-1.json')

Executing time: 0.2150096893310547

Выходной файл валидный)

Это конечно очень грубо, можно еще оптимизировать

И просьба ко всем - приводить полностью листинг программы, чтобы можно было запустить и почекать время)

---------- Добавлено 15.06.2020 в 10:47 ----------

Gerga:
На php он может быть еще короче, если не читать посимвольно.

Это уже будет нарушением условий задачи)

HM
На сайте с 14.01.2012
Offline
223
#15

Вы опять потоковый парсер json пишете?

Их в гугле полно https://github.com/salsify/jsonstreamingparser

Gerga
На сайте с 02.08.2015
Offline
94
#16
Sly32:
Это уже будет нарушением условий задачи)

Нет. Идет чтение потока до определенного символа либо length параметра, посимвольным чтением занимается не мой код, а встроенные функции, что конечно быстрее.

---------- Добавлено 15.06.2020 в 11:10 ----------

Sly32:
Executing time: 0.2150096893310547

0.10043406486511 :)

T7
На сайте с 19.09.2018
Offline
63
#17
danforth:
За сколько у вас отработал ваш код на данном файле?

Условия у всех разные. Для справедливой оценки на 1 машине все пускать надо.

У меня например, запускалось примерно в таких условиях

Sly32
На сайте с 29.03.2012
Offline
303
#18
timo-71:
У меня например, запускалось примерно в таких условиях

Ты б еще мельче скрин выложил)

T7
На сайте с 19.09.2018
Offline
63
#19
Sly32:
Ты б еще мельче скрин выложил)

Там кликнуть можно

DV
На сайте с 01.05.2010
Offline
644
#20
timo-71:
Для справедливой оценки на 1 машине все пускать надо.

Причём, одновременно :)

Надо какую-то обёртку, время всех запущеных разом скриптов (на разных языках) сравнивать.

Хотя можно вот так:

time script1.sh > 1.log 2>&1 &

time php script2.php > 2.log 2>&1 &
time python3.6 script3.py > 3.log 2>&1 &
time java script4.class > 4.log 2>&1 &
Это сама идея, х.з. что выйдет, надо поиграться.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий