Тест розуму chatGPT і інших. Задача 13.448

24 січня 2025.

Задача 13.448. Два електропоїзди виїжджають зі станції з інтервалом у 12 хвилин, рухаючись із однаковою швидкістю 50 км/г. Обчислити швидкість зустрічного поїзда, якщо він зустрічає ці електропоїзди з різницею в 5 хвилин.

Розвязую я

Знайти відстань між першими поїздами. Коли 2 виїхав, перший уже проїхав 12 хвилин з швидкісю 50 км/год
12 хв = 12/60 годин = 0,2 години.

v= s/t
s = v*t
t = s / v

s = 50 * 0.2 = 10 км.
Отже перші два їдуть з інтервалом 10 км.
Коли зустрічний зустрів першого, до зустрічі з 2м йому залишається 10 км, але обидва потяга мають зустрічну швидкість.

Оскільки вони долають відстань разом, їхня швидкість сумується

v = v2 + v3 = 50 + v3
s = 10
t = 5/60 = 0.083333333333

s = vt 10 = (50+v3)0.083
10= 4.1666666666 + 0.083333333333v3
5.833333333333 = 0.08333333333333v3
v3 = 70.000000000001

Відповідь правильна. (70 км/год зустрічний)

chatGPT не зміг вирішити цю задачу. Дав відповідь 120 км/год. Він “думав”, що зустрічний проходить відстань 10 км за 5 хв. Не врахував, що потяги рухаються.

Gemini 1.5 Flash не зміг вирішити цю задачу. Дав відповідь 35.71 км/год. Він “думав”, що pecnhsxybq(зустрічний) поїзд проїзжає відстань, яку перший проїде за 5хв за 12-5=7хв. І до того ж він чомусь переводить швидкість у метри/година.

Claude 3.5 Sonnet не зміг вирішити цю задачу. Дав відповідь 120 км/год. Він “думав”, що швидкість зустрічного поїзда 50+х, а першого 50. Потім він відняв відстані, які пройшли ці потяги і розрахував швидкість на 12 хв.

DeepSeek R1 зміг вирішити цю задачу. Швидкість зустрічного поїзда — 70 км/год. Він думав, що Відносна швидкість дорівнює V + 50, а потім розрахував Час подолання 10 км з різницею 5 хв

**Claude 3.5 Sonnet видав непоганий код, для вирішення задачі методом програмної симуляії.
**Gemini 1.5 Flash видав лише каркас коду, без симуляції.

Друкуємо на екран MTC-16201X з Atmega8

Вирішив спробувати підключити екран, після того, як дізнався, що використання МК без кварцевого резонатора даж похибку внутрішньої частоти на 1-10%, що багато, а от із кварцем 0,005%.

В інтернеті не знайшов коду для Atmega8 по підключенні екранів, тому змусив chatGPT написати код.

Спочатку код не працював, тому що я для зручності пайки сплутав виходи МК і входи MTC-16201X. Ось як :

#define D4 PD3
#define D5 PD4

А chatGPT це не врахував, і використовував зсуви регістрів для передачі команд.

Я осцилографом помітив, що по проводу PD3 взагалі не йдуть сигнали. Після тестів, я змусив “розумний чат” переписати код без використання зсувів бітів у байтах – і після цього сталося диво і екран запрацював як треба.

Викладаю код тут, щоб він був в інтернеті. Може ще хтось використовує стародавні дідівські мікроконтроллери Atmega8. Код з форматуванням можна переглянути тут https://ideone.com/JKSykc

#define F_CPU 8000000UL 
#include <avr/io.h>
#include <util/delay.h>


// Макроси для роботи з LCD
#define LCD_PORT PORTD
#define LCD_DDR  DDRD
#define RS PD0
#define E  PD2
#define D4 PD3
#define D5 PD4
#define D6 PD6
#define D7 PD7


// Функції
void lcd_pulse_enable() {
    LCD_PORT |= (1 << E); // Підняти E
    _delay_us(1);
    LCD_PORT &= ~(1 << E); // Опустити E
    _delay_us(100);
}

void lcd_send_nibble(unsigned char nibble) {
    if (nibble & 0x01) LCD_PORT |= (1 << D4); else LCD_PORT &= ~(1 << D4);
    if (nibble & 0x02) LCD_PORT |= (1 << D5); else LCD_PORT &= ~(1 << D5);
    if (nibble & 0x04) LCD_PORT |= (1 << D6); else LCD_PORT &= ~(1 << D6);
    if (nibble & 0x08) LCD_PORT |= (1 << D7); else LCD_PORT &= ~(1 << D7);
    lcd_pulse_enable();
}

void lcd_command(unsigned char cmd) {
    LCD_PORT &= ~(1 << RS); // RS = 0 (команда)
    lcd_send_nibble(cmd >> 4); // Старші 4 біти
    lcd_send_nibble(cmd & 0x0F); // Молодші 4 біти
    _delay_ms(2);
}

void lcd_data(unsigned char data) {
    LCD_PORT |= (1 << RS); // RS = 1 (дані)
    lcd_send_nibble(data >> 4); // Старші 4 біти
    lcd_send_nibble(data & 0x0F); // Молодші 4 біти
    _delay_ms(2);
}

void lcd_init() {
    LCD_DDR |= (1 << RS) | (1 << E) | (1 << D4) | (1 << D5) | (1 << D6) | (1 << D7); // Налаштування необхідних пінів як вихід
    _delay_ms(20); // Затримка після увімкнення

    lcd_command(0x02); // Перехід у 4-бітний режим
    lcd_command(0x28); // 4 біти, 2 лінії, 5x8 шрифт
    lcd_command(0x0C); // Увімкнути дисплей, без курсора
    lcd_command(0x06); // Автозсув курсора праворуч
    lcd_command(0x01); // Очистити дисплей
    _delay_ms(2);
}

void lcd_print(char *str) {
    while (*str) {
        lcd_data(*str++);
    }
}

void lcd_set_cursor(unsigned char row, unsigned char col) {
    unsigned char address = (row == 0) ? col : (0x40 + col);
    lcd_command(0x80 | address);
}


// Основна програма
int main(void) {
	_delay_ms(500);
    lcd_init(); // Ініціалізація LCD
	_delay_ms(10);
	lcd_set_cursor(0, 0); // Перехід на початок першого рядка
    lcd_print("Hello my chatGPT.");
    lcd_set_cursor(1, 0); // Перехід на початок другого рядка
    lcd_print("Row 2 Test!_>>*"); // Вивести текст на другому рядку
    while (1) {
		_delay_ms(200);
    }
}

Це написав блоггер з новим логіном Rylexmoon (раніше відомий як Salomoon).

Як знайти частоту по осцилографу?

Для того, щоб знайти частоту сигналу, потрібно виконати такі кроки:

  1. Визначити період сигналу. Період коливань — це найменший проміжок часу, за який сигнал здійснює одне повне коливання (тобто повертається в початкове положення).
  2. Визначити, скільки поділок на шкалі осцилографа займає період сигналу.
  3. Подивитися на ручку осцилографа час/поділка — тобто дізнатися, скільки часу припадає на 1 поділку.
  4. Використати формулу:

де

v – частота (Гц)

nD – кількість поділок (штуки)

tD – ціна поділки (сек)

Щоб знайти ціну поділки в секундах, треба глянути на ручку осцилографа, наприклад (ВРЕМЯ/ДЕЛ.) і поділити на значення на кнопці осциллографа, наприклад [us/ms]. us – ділити на мільйон, ms – ділити на тисячу.

Практичні приклади:

Сигнал від тестера DT-832:

Тут видно, що період займає 4 поділки. Кнопка осцилографа на мілісекундах (ділити на 1000), ручка часу на поділці 5. Розраховуємо частоту = 1/(4*5/1000) = 50 Гц. Так, як і написано в інструкції.

Сигнал від генератора на мікросхемі К155ЛА3, схема якого була надана колишнім військовослужбовцем сержантом.

Тут видно, що період займає 2,2 поділки. Кнопка осцилографа на мілісекундах (ділити на 1000), ручка часу на поділці 0,5. Розраховуємо частоту = 1/(2,2*0,5/1000) = 909 Гц.

Обидва сигнали виявилися амплітудою по 2 вольти.

Більш простого способу обчислювати частоту немає. Переконався сам під час пошуку.