Pull to refresh
0
0
Eugene Draitsev @drai3

Software Engineer

Send message

Вот моё немного кривое, но работающее решение на js:
https://gist.github.com/EugeneDraitsev/3d19c6ba3ed5770492128e393514047c


Это решение к https://www.codewars.com/kata/5985ea20695be6079e000003/train/javascript/5fa6dea279a15500171a2920 этой кате, поэтому там присутствует один ферзь с заданным начальным положением (2й аргумент в функции solveNQueens)

Есть довольно простой и более быстрый способ решения этой задач — анализировать левые и правые диагонали поля по количеству ферзей на них.


  1. Расставить сразу всех ферзей по 1 на ряд, стараясь учитывать свободные диагонали. Если нет возможности ставить на свободную диагональ, то ставить на как можно менее занятой.
  2. Последовательно переставлять ряды с занятых диагоналей, пока не будет найдено решение, при котором на всех диагоналях поля находится только один ферзь.

С данным алгоритмом мой код на js расставляет поле 1000х1000 за 300мс на i7-8700. Вот тут есть более подробное описание и примерный код алгоритма:


https://www.geeksforgeeks.org/n-queen-problem-using-branch-and-bound/

Ну если вдруг понадобится не только складывать и вычитать числа, бОльшие чем Number.MAX_SAFE_INTEGER, но и делить/умножать (подразумевая наличие дробной части)


100000000000000000000000000000000000n / 3n
// 33333333333333333333333333333333333n
BigInt(100000000000000000000000000000000000 / 3)
// 33333333333333332287788702639325184n

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

Когда кодовая база становится большой — начинаешь калёным железом выжигать всё похожее на это:

Не вижу никакой проблемы в таком коде. Если ваша команда использует достаточно строгий airbnb eslint конфиг, ограничивающие такие строки до 100 символов длины, то всё читается прекрасно все зависимости от размера вашего приложения.


В первую очередь из-за удобных отступов. Ну и финальный штрих это выжигание .map и && за счёт jsx-control-statement (на что не каждая команда согласится).

Я вот в упор понять не могу чем вам ужасный For нравится больше чем красивый "функциональный" подход с map? А насчет if — && вы вполне можете использовать do-expressions из stage-1 без всяких там jsx-control-statement


return (
  <nav>
    <Home />
    {
      do {
        if (loggedIn) {
          <LogoutButton />
        } else {
          <LoginButton />
        }
      }
    }
  </nav>
)
Ещё раз спасибо за объяснения, я ещё несколько коментов назад прочитал ваши первые статьи (и не только) про Svelte и понял как он работает (и я понимаю как работают все фреймвоки с SFC). Действительно получается что в некоторых синтаксис Svelte будет лаконичней JSX, в некоторых нет. Надеюсь попробую Svelte в будущем на практике.

Спасибо за столь терпеливый и объемный ответ. Я обязательно перечитаю всё ещё раз и попробую глубже понять суть, но сразу хочу заметить, что ваш пример сравнения JSX с Svelte-синтаксисом совершенно нечестный


Примеры абсолютно идентичным, просто первый избыточен, так как js плохо читается в потоке html и наоборот. Второй прост и лаконичен.

в JSX-примере вы добавили 2 строчки, который нет в Svelte примере вначале и зачем-то сохранили все todo в переменную вместо вполне обычного мэпа внутри тэга ещё и добавив return. Правильное сравнение должно быть таким:


<ul>
{#each todos as todo (todo.id)}
  <TodoItem todo={todo} />
{/each}
</ul>

против


<ul>
    {todos.map(todo => <TodoItem key={todo.id} todo={todo} />)}
</ul>

ну или код полного компонента:


const TodoList = ({ todos }) => (
<ul>
    {todos.map(todo => <TodoItem key={todo.id} todo={todo} />)}
</ul>
)

Глупо спорить какой код читается лучше — это довольно субъективно, но, как минимум, код JSX лаконичнее.

Спасибо, теперь суть фреймворка ясна намного лучше и результаты бенчмарков очень впечатляют. И всё же мне все равно не ясен ответ на мой второй вопрос. Возможно, я недостаточно точно его сформулировал. Попробую расписать подробнее.


В чем смысл делать такой синтаксис?


<svelte:component this="{foo ? Red : Blue}" name="thing"/>

{#if foo}
<svelte:self/>
{/if}

<svelte:window on:keydown="handleKey(event)" />

<svelte:head>
    <title>{post.title} • My blog</title>
</svelte:head>

Если сравнить с таким же JSX:


<Component this={foo ? Red : Blue} name="thing"/>

{foo && <Self/>}

<Window onCilck={handleKey} />

<Head>
    <Title>{post.title} • My blog</Title>
</Head>

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


JSX очень опасен и не очевиден тем, что это и не валидный JS, так и не валидный HTML, на чем часто попадаются новички

Ваш синтаксис точно такая же "попытка скрестить слона с хомяком", только по-другому:


{#each todos as todo, i (todo.id)}

Это и не валидный js и не валидный xml. Это «слонохомяк» абсолютной такой же степени как и JSX, но с намного меньшим количеством примеров и информации в гугле. Начинающий разработчик может очень быстро нагуглить в чем его проблема и почему display не работает в вашем примере с JSX.


И вот собственно мой вопрос: Какой смысл в использовании нового "слонохомяка", когда есть старые и проверенные шаблоны, к которым привыкли другие разработчики? С моей, возможно неправильной точки зрения, можно было бы использовать JSX, vue-like или angular-like синтаксис, а не изобретать новый велосипед, который только отталкивает разработчиков, как я, от использования svelte

Спасибо за статью. После прочтения статьи и комментариев у меня осталось 2 вопроса и, надеюсь, вы сможете их прояснить для меня)
Первый вопрос: все-таки почему же это не «yet another javascript framework»". Какие проблемы он решает лучше чем React/Angular/Vue?
Второй: Я прекрасно понимаю что JSX это не JavaScript, но чем синтаксис Svelte лучше? Чем вы мотивируете разработчиков учить новый синтаксис нового фреймворка, который не работает (или плохо работает) в многих IDE. Разумно предположить что он как минимум должен быть лучше JSX или подходов Angular/Vue. Возможно были какие-то объективные причины выбора именно такого синтаксиса?
А вы пробовали использовать css-modules или другие способы инкапсуляции css (jss/styled components/etc.)? Или, возможно, у BEM есть какие-то незаменимые преимущества? Субъективно выглядит это всё намного неудобнее любых других способов
Возможно вам уже задавали вопрос, но я не смог найти его. В Opera была чудесная возможность быстро переходить на сайт из Speed Dial с помощью хоткея Ctrl+1..9, где число — позиция сайта на Speed Dial. Есть так же хороший плагин для Firefox — «Speed Dial» от uworks, который позволяет расширить функционал до Ctrl+1...100. Планируется ли у вас поддержка подобного хоткея когда-либо?

Information

Rating
Does not participate
Location
Stockholm, Stockholms Län, Швеция
Date of birth
Registered
Activity