Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Блог нуба-шахматиста (https://javascript.ru/forum/offtopic/77034-blog-nuba-shakhmatista.html)

Allegro75 15.03.2019 20:09

Блог шахматиста, новичка в программировании
 
Здравствуйте.

Я решил учиться программированию.
Начинаю с нуля, уже пару месяцев учусь.
Надеюсь, здесь можно вести свой блог.

Последней моей профессией была игра в онлайн-покер.
Ранее я занимался дизайном (полиграфии).
И ещё я люблю шахматы (кандидат в мастера).
Вот мой шахматный канал на youtube - https://www.youtube.com/channel/UCCN...NqvsJK9rd4PpMQ

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

Пока мне интересно освоить HTML, CSS и JavaScript.
(PHP, может быть (хотя я не вполне понимаю, зачем он нужен)))
То есть мне хочется уметь делать сайты.
Интернет я люблю, и хотя бы как пользователь понимаю, что это такое).

...

Сейчас среди прочего я решил решать задачки по JavaScript, к-рые нашёл на одном обучающем ресурсе (не знаю, можно ли тут его называть), и за проверку к-рых там уже просят денег.
(А я хочу обучаться по возможности бесплатно)

вот первая из этих задачек:

"
Реализуйте и экспортируйте по умолчанию функцию reverseInt, которая переворачивает цифры в переданном числе и возвращает новое число.

reverseInt(13); // 31
reverseInt(-123); // -321
reverseInt(8900); // 98
"


Вот моё решение:
const reverseInt = (num) => { 
  if (num >= 0) {
    let index = 0;
    let resultStr = '';
    let initStr = num.toString();

    while (index < initStr.length) {
      resultStr = `${initStr[index]}${resultStr}`;
      index += 1;
    }
    return Number(resultStr);
  }

  else {
  let index = 1;
  let resultStr = '';
  let initStr = num.toString();

  while (index < initStr.length) {
      resultStr = `${initStr[index]}${resultStr}`;
      index += 1;
    }
  return (Number(resultStr)) * -1;
  }
}


Я делал и проверял это на repl.it, вроде бы работает.

Проблемы возникли разве что с экспортом по умолчанию.

Я пытался писать первую строку так:
export default function reverseInt(num) {

и это не пролезало.

В ответ на это пишут:
evalmachine.<anonymous>:2
export default function reverseInt(num) {
^^^^^^

SyntaxError: Unexpected token export

и ещё много строчек.

Что не так с моим "export default", не подскажете?

laimas 15.03.2019 20:51

Можно и проще

var n = 8900;
alert(Number(n.toString().split('').reverse().join('')))

Allegro75 15.03.2019 21:15

Сильно, laimas)

Хотя на том ресурсе подразумевалось, что набор знакомых решателям методов очень ограничен.
В частности, с массивами они ещё не знакомы. И т. п.

Но всё равно, конечно, сильно.

Вот разве что, похоже, Ваш метод выдаёт "NaN" на отрицательных числах.

laimas 15.03.2019 21:33

Цитата:

Сообщение от Allegro75
метод выдаёт "NaN" на отрицательных числах

Math.abs()

Rise 15.03.2019 21:36

Цитата:

Сообщение от Allegro75
Что не так с моим "export default", не подскажете?

Экспорты подключаются через импорты, например.

Allegro75 16.03.2019 18:44

Цитата:

Сообщение от Rise (Сообщение 504845)
Экспорты подключаются через импорты, например.

Не понимаю я пока этого.
Видимо, для того, чтобы сделать корректный экспорт мне нужны два файла, что ли - один, из к-рого экспорт; и другой, куда импортируем?
И всего этого на repl.it не сделать?..

...

А пока решил ещё одну задачку:

"
Реализуйте и экспортируйте по умолчанию функцию invertCase, которая меняет в строке регистр каждой буквы на противоположный.

invertCase('Hello, World!'); // hELLO, wORLD!
invertCase('I loVe JS'); // i LOvE js

...используйте свойство length...
...используйте метод toUpperCase...
...используйте метод toLowerCase...

"

Решил так:
const invertCase = (str) => {  
  let index = 0;
  let result = '';
  let lowerStr = str.toLowerCase();
  let upperStr = str.toUpperCase();
  for (; index < str.length; index += 1){
    if (str[index] === lowerStr[index]) {
      result = `${result}${upperStr[index]}`;
    }
    else
    result = `${result}${lowerStr[index]}`;
  }
  return result;
}

рони 16.03.2019 20:14

Allegro75,
чуть покороче ...
const invertCase = (str) => {
    let index = 0;
    let result = '';
    let lowerStr = str.toLowerCase();
    let upperStr = str.toUpperCase();
    for (; index < str.length; index++){
        if (str[index] === lowerStr[index]) {
            result += upperStr[index];
        }
        else result += lowerStr[index];
    }
    return result;
}
alert(invertCase('Hello, World!'));

laimas 16.03.2019 20:30

Цитата:

Сообщение от рони
чуть покороче ...

Можно еще короче :)

return str.replace(/.?/g, function(v) {
    return v == v.toLowerCase() ? v.toUpperCase() : v.toLowerCase()  
})


А, length же не у дел остался. :)

Allegro75 18.03.2019 18:42

Между тем начинаю новый день учёбы с решения ещё одной задачки.

Условие:
Преобразование DNA в RNA
"ДНК и РНК это последовательности нуклеотидов.
Четыре нуклеотида в ДНК это аденин (A), цитозин (C), гуанин (G) и тимин (T).
Четыре нуклеотида в РНК это аденин (A), цитозин (C), гуанин (G) и урацил (U).
Цепь РНК составляется на основе цепи ДНК последовательной заменой каждого нуклеотида:
G -> C
C -> G
T -> A
A -> U
Реализуйте и экспортируйте функцию по умолчанию, которая принимает на вход цепь ДНК и возвращает соответствующую цепь РНК (совершает транскрипцию РНК).

Если во входном параметре нет ни одного нуклеотида (т.е. передана пустая строка), то функция должна вернуть пустую строку.

Если в переданной цепи ДНК встретится "незнакомый" нуклеотид (не являющийся одним из четырех перечисленных выше), то функция должна вернуть null.

dnaToRna('ACGTGGTCTTAA'); // 'UGCACCAGAAUU'
dnaToRna('CCGTA'); // 'GGCAU'
dnaToRna(''); // ''
dnaToRna('ACNTG'); // null

Подсказки
Длина строки str находится так: str.length

"

Решение:
const dnaToRna = (dna) => {
  let index = 0;
  let result = '';
  for (; index < dna.length; index +=1) {
    if (dna[index] === 'G') {
      result += 'C';
    }
    else if (dna[index] === 'C'){
      result += 'G';
    }
    else if (dna[index] === 'T'){
      result += 'A';
    }
    else if (dna[index] === 'A'){
      result += 'U';
    }
    else return null;
  } return result;
}

рони 18.03.2019 18:51

Allegro75,
если что - то повторяется(else if ), может попробовать, это сократить?
5 советов как лучше писать условные конструкции в JavaScript

Allegro75 18.03.2019 23:17

рони, спасибо, почитаю.

Allegro75 21.03.2019 15:34

Когда ты подступаешься к программированию, ничего изначально не зная - как я - то обилие языков программирования производит пугающее впечатление.
У тебя нет понимания, какой язык тебе нужен; непонятно, чем они отличаются; и вопрос о том, какой из них учить, кажется очень сложным. Внутри сидит представление об обычных человеческих языках общения. Кажется, что если вначале ошибёшься, и выучишь португальский; а потом окажется, что в жизни больше полезен китайский - то кошмар и ужас, черта с два потом переучишься.

Но когда подступаешься поближе, то шокирует уже похожесть этимх самых языков программирования.
Я сейчас одновременно штудирую JS и PHP - и такое чувство, что учу сразу и украинский, и белорусский) И проблема, соответственно, совсем не в том, что имеешь дело с двумя сложными предметами одновременно - а в том, что предметы очень похожи, и ты их путаешь.
Я ещё немного Python потрогал, и это тоже, пользуясь упомянутой метафорой, какой-то болгарский по ощущениям.

Nexus 21.03.2019 15:49

А можете пояснить в чем схожесть php и js?

Allegro75 21.03.2019 17:12

B чем схожесть?
Это неожиданный для меня вопрос. Хочется ответить "во всём".
Схожесть в общей структуре. И там, и там есть некие объекты - и список важнейших из этих объектов совпадает - числа, строки. Массивы.
И мы с этими объектами манипулируем. Одинаковым образом манипулируем - через арифметические, логические и строковые операции. Вводим переменные, конструируем функции. Имея при этом набор готовых уже, стандартных функций.
Важнейший, насколько я понимаю, оператор(?)
while(){}
практически полностью совпадает.

Естественней для меня выглядел бы вопрос о том, в чём различия языков.
И различия эти в мелкой орфографии, в лексике. Там "$", тут "var". Там str.length, тут strlen($str). Легко запутаться.

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

Nexus 21.03.2019 18:26

Цитата:

Сообщение от Allegro75
Важнейший, насколько я понимаю, оператор(?)
while(){}
практически полностью совпадает.

А что не дает сказать "полностью совпадает"?

Allegro75 21.03.2019 21:28

А что не дает сказать "полностью совпадает"?

Ну, просто неуверенность новичка - может, я чего ещё не знаю про эти операторы?..

Allegro75 21.03.2019 22:16

Новую задачку решил.
Горазды же эти математики на придумывание неких сущностей. Первый раз слышу про "совершенные" числа.

Создайте функцию isPerfect, которая принимает число и возвращает true, если оно совершенное, и false — в ином случае.

Совершенное число — это положительное целое число, равное сумме его положительных делителей (не считая само число). Например, 6 — идеальное число, потому что 6 = 1 + 2 + 3.


Список совершенных чисел:
6
28,
496,
8128,
33 550 336,..


Моё решение:
const isPerfect = (num) => {
  if (num === 1) {
    return false;
  }
  let sumOfDividers = 1;
  let divider = 2;
  const half = num / 2;
  while (divider <= half) {
    if ((num % divider) === 0) {
      sumOfDividers += divider;
    }
    divider += 1;
  }
    
  if (num === sumOfDividers) {
    return true;
  }
  return false;
}

Allegro75 22.03.2019 23:10

Ещё задачка.

Условие:

fizzBuzz.js
Реализуйте и экспортируйте по умолчанию функцию, которая выводит (console.log) в терминал числа в диапазоне от begin до end. При этом:

Если число делится без остатка на 3, то вместо него выводится слово Fizz
Если число делится без остатка на 5, то вместо него выводится слово Buzz
Если число делится без остатка и на 3, и на 5, то вместо числа выводится слово FizzBuzz
В остальных случаях выводится само число

Функция принимает два параметра (begin и end), определяющих начало и конец диапазона (включительно). Для простоты считаем, что эти параметры являются целыми числами больше нуля. Если диапазон пуст (в случае, когда begin > end), то функция просто ничего не печатает.
Пример

Вызов функции:

fizzBuzz(11, 20);

Вывод в терминале:

11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz

Это задание крайне часто задают на собеседованиях.



Решение:
const fizzBuzz = (begin, end) => {
  const word = (num) => {
    if (((num % 3) === 0) && ((num % 5) === 0)) {
      return 'FizzBuzz';
    }
    else if ((num % 3) === 0) {
      return 'Fizz';
    }
    else if ((num % 5) === 0) {
      return 'Buzz';
    }
    else return num;
  }
  let start = begin;
  for (; start <= end; start += 1) {
    console.log(word(start));
  }
}

Malleys 23.03.2019 09:03

function fizzBuzz(begin, end) {
	for(var i = begin; i <= end; i++) {
		var s = (i % 3 === 0 ? "Fizz" : "") +
		        (i % 5 === 0 ? "Buzz" : "");

		console.log(s === "" ? i : s);
    }
}

Allegro75 23.03.2019 20:46

Очень круто, Malleys!

Для меня отдельным удовольствием было то, что я всю эту запись понял)

Почему я не мог так сделать - потому, что у меня не было уверенного знания о том, что пустая строка и undefined(?) это одно и то же.
Я так понимаю, это достигается за счёт слабой типизации в JavaScript...

P.S.
Хотя нет, я понял, что тут слабая типизация, похоже, ни при чём.
Всё сделано просто и прямо...
Респект.

рони 23.03.2019 21:25

Allegro75,
https://javascript.ru/forum/misc/570...tml#post380310

Allegro75 26.03.2019 00:37

Ещё задачка.

"Напишите функцию diff, которая принимает два угла (integer), каждый от 0 до 360, и возвращает наименьшую разницу между ними.

Примеры:

diff(0, 45) === 45; // не 315, а 45, потому что 45 меньше
diff(0, 180) === 180;
diff(0, 190) === 170; // не 190, а 170, потому что 170 меньше
diff(120, 280) === 160;"



Решил так:
const diff = (firstAngle, secondAngle) => {
  let minAngle = firstAngle <= secondAngle ? firstAngle : secondAngle;
  let maxAngle = minAngle === firstAngle ? secondAngle : firstAngle;
  const firstDiff = minAngle + (360 - maxAngle);
  const secondDiff = (180 - minAngle) + (maxAngle - 180);
  return firstDiff <= secondDiff ? firstDiff : secondDiff;
}

Malleys 26.03.2019 09:07

const diff = (φ, θ) => 180 / Math.PI * Math.acos(Math.cos(Math.PI / 180 * Math.abs(φ - θ)));


UPD График этой функции: https://www.desmos.com/calculator/eh5mmuik2a

Allegro75 26.03.2019 20:45

Господа, тут при нажатии на ваших скриптах кнопки "Запустить!" вылезает диалог с предупреждениями.
Похоже, я случайно отжал там опцию типа "никогда не запускать".
В общем сейчас я тут запустить ничего не могу. Не подскажете, как это можно исправить?

Malleys 26.03.2019 20:52

Цитата:

Сообщение от Allegro75
Похоже, я случайно отжал там опцию типа "никогда не запускать".

А там было: Больше не показывать это сообщение при запуске javascript.

Если вы про мой пример, то он ничего сам по себе не показывает, это я поставил кнопку, что бы можно было нажать, а затем открыть консоль, выбрать контекст того iframe и запустить что-то типа diff(120, 280)

Allegro75 28.03.2019 01:29

Очередная задачка.

"Счастливым билетом называют такой билет с шестизначным номером, где сумма первых трех цифр равна сумме последних трех.
isHappyTicket.js
Напишите и экспортируйте по умолчанию функцию, проверяющую является ли номер счастливым (номер может быть как числового, так и строкового типа: см. примеры ниже). Функция должна возвращать true, если билет счастливый, или false, если нет.

Примеры использования:
isHappyTicket(385916); // true
isHappyTicket(231002); // false
isHappyTicket(128722); // true
isHappyTicket('054702'); // true

Подсказки
Преобразовать число в строку можно с помощью функции String...
Преобразовать строку в число можно с помощью функции Number...
Чтобы узнать длину строки, используйте свойство length..."


Моё решение:
const isHappyTicket = (num) => {
  let str = String(num);
  let firstSum = Number(str[0]) + Number(str[1]) + Number(str[2]);
  let secondSum = Number(str[3]) + Number(str[4]) + Number(str[5]);
  return firstSum === secondSum; 
}

SvenSven 28.03.2019 20:25

Цитата:

Сообщение от Nexus (Сообщение 505119)
А можете пояснить в чем схожесть php и js?

Мне тоже интересно!

Nexus 28.03.2019 23:00

Цитата:

Сообщение от Allegro75
isHappyTicket.js

(num=>{
	const sum=arr=>arr.reduce((t,n)=>+n+t,0);
	num=num.toString().split('');

	return sum(num.slice(0,3))===sum(num.slice(3));
})(385916);

laimas 28.03.2019 23:20

sum(num.slice(0,3))===sum(num.slice(3)) - что-то во всех примерах строгое сравнение, то есть предполагается, что будет подсунуто не то или перестраховка?

Nexus 29.03.2019 08:17

laimas, скорее перестраховка.
Честно говоря у меня просто IDE ругается на нестрогое сравнение, вот я и привык использовать везде где можно строгое сравнение, а можно почти везде.
Причина: нестрогое сравнение может привести к неожиданным приведениям типов, в итоге результат выражения может быть не тем, который ожидаешь.
Да, можно отключить предупреждения, но бывают ситуации, когда нестрогое сравнение действительно играет злую шутку.

laimas 29.03.2019 09:13

Цитата:

Сообщение от Nexus
нестрогое сравнение может привести к неожиданным приведениям типов, в итоге результат выражения может быть не тем, который ожидаешь.

А чего ожидается? Логика какая-то отпадная. :)

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

Nexus 29.03.2019 09:28

Цитата:

Сообщение от laimas
А чего ожидается? Логика какая-то отпадная.

конкретно в этом примере можно смело использовать нестрогое сравнение.
Цитируемый текст относится к причине того, почему лично я чаще использую строгое сравнение.

laimas 29.03.2019 09:48

Цитата:

Сообщение от Nexus
конкретно в этом примере можно смело использовать нестрогое сравнение

Так об этом и речь, а не о том, что бывают и обстоятельства когда требуется строгое сравнение. А здесь как не пример, то строгое сравнение, и при этом это учебные примеры. Вот и возникает вопрос - а чему же тогда они учат?

Signal 29.09.2019 09:04

вот хорошо, когда есть интернет, так и учить программировать не сложно, помню я еще в 93-м году поменял денди на спектрум, на бейские еще в школе учили работать, его освоил быстро и понял, что нужно ассемблер учить, не помню уже где взял или на базаре книжку купил или кто-то подарил (до сих пор лежит), но прочитав ее так вообще ничего и не понял. потом, думаю, надо делать что-то грандиозное, (если кто есть спектрумисты, то знают что есть такая программа ArtStudio) вот я решил сделать такую-же, но чтоб можно было делать анимированные спрайты, ну и там со своим блекжеком и т.п. и я за неделю вкурил что да как, а город небольшой даже спросить не у кого было! никто ассемблер и в глаза не видел. сейчас, конечно куда проще

Давид Пехней 21.05.2022 11:35

Я так решил
function isPerfect(number) {
    for (let i = 1; i<=number; i++) {
        let one = (i/2)*(i+1)
        if (one===number) return true;
        else false;
        if (one>number) return;
    }
}


Часовой пояс GMT +3, время: 10:18.