@@smashno К сожалению сильно завязано на двух операциях, если их количество изменится, придется все переписывать. Плюс еще сравнение со строкой не очень хорошо, от строк в условиях лучше всего избавляться, так как это источник ошибок. Но для минутного решения пойдет. Спасибо вам за интересные задачки :)
@@Андрей-й9ц6я Если не ошибаюсь задача построена на реальном формате данных с реального проекта. Так что такое решение вполне ок. Учитывая то что операции бывают только buy и sell и новых не предполагается ). На подходе новые задачки - посложнее.
Что удивительно с первого раза заработало, хотя обычно несколько итераций фикса своих ошибок приходится делать) const f = (input) => input.reduce((res, [cName, oName, val]) => { res[cName] = [ (res[cName]?.[0] ?? 0) + (oName === 'buy' ? val : 0), (res[cName]?.[1] ?? 0) + (oName === 'sell' ? val : 0) ]; return res; }, {});
Мой франкенштейн. function calc(arr) { let out = {} arr.forEach(el => { let key = el[0] if(!out[key]) out[key] = [0, 0] el[1] === 'buy' ? out[key] = [out[key][0] + el[2], out[key][1]] : out[key] = [out[key][0], out[key][1] + el[2]] }) return out } Красивое первое решение у автора видео, читаемое и лаконичное. Пару моментов взял себе на заметку.
Задача легкая, но свое решение оставлять не буду, так как оно вышло не таким красивым. Мне понравилась эта строка кода в решении: output[name][type === 'buy' ? 0 : 1] += value; Максимально кратко и лаконично!
@@frontendscience было бы интересно увидеть задачу про формирование сценария. Там даны роли и текст и нужно строку текста разделить на реплики отдельных персонажей и построчно выводить. когда-то не получилась она
Спасибо за задачу, у меня получилось но мне самому страшно на это смотреть. Ваш первый вариант прям конфетка. function trans(input){ let obj = {}; for(let item of input){ if(item[0] !== Object.keys(obj)){ obj[item[0]] = [0,0] } } Object.keys(obj).forEach((key) => { for(let i = 0; i < input.length; i++){ if(input[i][1] === 'sell' && input[i][0] === key){ obj[key][1] += Number([input[i][2]]) } if(input[i][1] === 'buy' && input[i][0] === key){ obj[key][0] += Number([input[i][2]]) } } }) return obj; }
Подскажите почему эта строчка : accum[curr[0]][curr[1] === 'buy' ? 0 : 1] += curr[2]; при true добавляет в нулевой элемент массива а при false в первый, что делать если больше двух параметров? Как грамотно присвоить им значение
Рекомендую почитать про тернарный оператор в js. Именно благодаря ему мы в зависимости от значения buy или sell делаем присвоение или в 0 или d 1 элемент массива. Если будет больше 2х вариантов то тернарным оператором уже не обойтись, можно было бы такое решить или через switch/case или через if/else. Есть и другие способы но тут уже может зависеть от формата входных данных
Да, вместо тернарника здесь можно использовать быстрое преобразование типов: +(type === 'sell') или +(type !== 'buy') true у нас превратится в 1, а false в 0... Но практиковать в реальном проекте неочевидные преобразования всё таки не самая лучшая идея, поскольку они затрудняют интуитивное понимание кода и дальнейшую поддержку проекта. Лучше избрать менее лаконичный, но более читаемый вариант, например: {'buy': 0, 'sell': 1}[type]
Еще один вариант на reduce:
input.reduce((accum, [currency, operation, sum]) => {
let [buy = 0, sell = 0] = accum[currency] || [];
operation === 'buy' ? (buy += sum) : (sell += sum);
accum[currency] = [buy, sell];
return accum;
}, {})
Класс! Вышло вообще обойтись без индексов 0 и 1 для массива :) Читать удобно!
@@smashno К сожалению сильно завязано на двух операциях, если их количество изменится, придется все переписывать. Плюс еще сравнение со строкой не очень хорошо, от строк в условиях лучше всего избавляться, так как это источник ошибок. Но для минутного решения пойдет. Спасибо вам за интересные задачки :)
@@Андрей-й9ц6я Если не ошибаюсь задача построена на реальном формате данных с реального проекта. Так что такое решение вполне ок. Учитывая то что операции бывают только buy и sell и новых не предполагается ). На подходе новые задачки - посложнее.
Что удивительно с первого раза заработало, хотя обычно несколько итераций фикса своих ошибок приходится делать)
const f = (input) =>
input.reduce((res, [cName, oName, val]) => {
res[cName] = [
(res[cName]?.[0] ?? 0) + (oName === 'buy' ? val : 0),
(res[cName]?.[1] ?? 0) + (oName === 'sell' ? val : 0)
];
return res;
}, {});
Мой франкенштейн.
function calc(arr) {
let out = {}
arr.forEach(el => {
let key = el[0]
if(!out[key]) out[key] = [0, 0]
el[1] === 'buy'
? out[key] = [out[key][0] + el[2], out[key][1]]
: out[key] = [out[key][0], out[key][1] + el[2]]
})
return out
}
Красивое первое решение у автора видео, читаемое и лаконичное. Пару моментов взял себе на заметку.
Благодарю за решение! Хорошо вышло!
Задача легкая, но свое решение оставлять не буду, так как оно вышло не таким красивым.
Мне понравилась эта строка кода в решении:
output[name][type === 'buy' ? 0 : 1] += value;
Максимально кратко и лаконично!
let countCash = (transactions) =>{
let result ={};
for(let i = 0; i
Класс! Всегда клево видеть свой прогресс. Заказывай еще задачки.
@@frontendscience было бы интересно увидеть задачу про формирование сценария. Там даны роли и текст и нужно строку текста разделить на реплики отдельных персонажей и построчно выводить. когда-то не получилась она
Вадим Бєк а есть пример входных данных?
Спасибо.
На Java:
import java.util.ArrayList;
import java.util.HashMap;
public class ValuteOperations {
public static void main(String[] args) {
Money[] inputAr = {
new Money("usd", "buy", 10000),
new Money("usd", "sell", 5000),
new Money("gbp", "buy", 9000),
new Money("eur", "sell", 7000),
new Money("uah", "buy", 10000),
new Money("usd", "sell", 25000)
};
outputAr(inputAr);
}
private static void outputAr(Money[] arr) {
HashMap mapAr = new HashMap();
for (Money m : arr) {
ArrayList listAr = new ArrayList();
if (m.operation.equals("buy")){
listAr.add(m.count);
listAr.add(0);
} else {
listAr.add(0);
listAr.add(m.count);
}
ArrayList mSearch = mapAr.get(m.name);
if ((mapAr.get(m.name)) != null) {
listAr.set(0, listAr.get(0) + mSearch.get(0));
listAr.set(1, listAr.get(1) + mSearch.get(1));
}
mapAr.put(m.name, listAr);
}
System.out.println(mapAr); } }
class Money {
String name;
String operation;
int count;
public Money(String name, String operation, int count) {
this.name = name;
this.operation = operation;
this.count = count; } }
var output = input.reduce((output, [currency, operation, value]) => {
const cursorOperation = operation === 'buy' ? 0 : 1;
output[currency] = output[currency] || [0, 0];
output[currency][cursorOperation] += value;
return output;
}, {});
Классно получилось - и компактно и читаемо!
Спасибо за задачу, у меня получилось но мне самому страшно на это смотреть. Ваш первый вариант прям конфетка.
function trans(input){
let obj = {};
for(let item of input){
if(item[0] !== Object.keys(obj)){
obj[item[0]] = [0,0]
}
}
Object.keys(obj).forEach((key) => {
for(let i = 0; i < input.length; i++){
if(input[i][1] === 'sell' && input[i][0] === key){
obj[key][1] += Number([input[i][2]])
}
if(input[i][1] === 'buy' && input[i][0] === key){
obj[key][0] += Number([input[i][2]])
}
}
})
return obj;
}
Благодарю за решение! Отлично справились!
const currency = (input) => {
const hash = {}
for(let [curren, operation, value] of input){
if(!hash[curren]) hash[curren] = [0, 0]
hash[curren][operation === 'buy' ? 0 : 1] += value
}
return hash
}
Подскажите почему эта строчка :
accum[curr[0]][curr[1] === 'buy' ? 0 : 1] += curr[2];
при true добавляет в нулевой элемент массива а при false в первый, что делать если больше двух параметров? Как грамотно присвоить им значение
Рекомендую почитать про тернарный оператор в js. Именно благодаря ему мы в зависимости от значения buy или sell делаем присвоение или в 0 или d 1 элемент массива. Если будет больше 2х вариантов то тернарным оператором уже не обойтись, можно было бы такое решить или через switch/case или через if/else. Есть и другие способы но тут уже может зависеть от формата входных данных
Почему просто не оставить type===sell, если это так, то 1 индекс, иначе же 0
присылай решение!
Да, вместо тернарника здесь можно использовать быстрое преобразование типов:
+(type === 'sell')
или
+(type !== 'buy')
true у нас превратится в 1, а false в 0...
Но практиковать в реальном проекте неочевидные преобразования всё таки не самая лучшая идея, поскольку они затрудняют интуитивное понимание кода и дальнейшую поддержку проекта. Лучше избрать менее лаконичный, но более читаемый вариант, например:
{'buy': 0, 'sell': 1}[type]
У меня получился менее "ниндзявый" вариант
function calcCurrencies(transactions) {
return transactions.reduce((acc, transaction) => {
const [curr, type, amount] = transaction
const typeIndex = type === 'buy' ? 0 : 1
if (!acc[curr]) acc[curr] = [0, 0];
acc[curr][typeIndex] += amount
return acc
}, {})
}
Отличный вариант вышел! Благодарю что поделились!
Спасибо, у меня похоже получилось
const result = {};
input.forEach(([currency, action, amount]) => {
result[currency] ||= [0, 0];
const isSell = action === 'sell';
result[currency][+isSell] += amount;
});
ты монстр
function SumMoney(arg){
let res = arg.reduce((a,el)=>{
if(!a[el[0]]){
a[el[0]] = [0,0]
}
a[el[0]][el[1] === 'buy' ? 0 : 1] += el[2]
return a
},{})
return res
}
input.reduce((acc, [currency, type, amout]) => {
acc[currency] = acc[currency] || [0, 0];
const index = {'buy': 0, 'sell': 1}[type];
acc[currency][index] += amout;
return acc;
}, {});
красиво