Wpis z mikrobloga

Trzecie zadanie Advent of Code. Trzeba znaleźć 2 cyfry, aby wyszła największa liczba. Nie wolno zmieniać kolejności cyfr.

987654321111111 - 98
811111111111119 - 89
234234234234278 - 78
818181911112111 - 92

Niżej jest rozwiązanie w JavaScript, ale system nie przyjmuje odpowiedzi, więc gdzieś jest błąd. Znajdziecie?

Czy to zadanie można zrobić w Excelu? ChatGPT wykazał, że da się.

1. Kopiujemy dane wejściowe do Excela w kolumnie A.

2. W kolumnie B piszemy formułę:

=MAX(ARRAYFORMULA(VALUE(MID(A1; SEQUENCE(LEN(A1)-1); 2))))

=MAX(ARRAYFORMULA(WARTOŚĆ(FRAGMENT.TEKSTU(A1; SEQUENCE(DŁ(A1)-1); 2))))

Sam jestem ciekawy, co te poszczególne funkcje robią, więc rozbijmy to:

DŁ(A1) - ilość znaków
SEQUENCE(99) - liczby od 1 do 99
FRAGMENT.TEKSTU(A1; SEQUENCE(DŁ(A1)-1); 2) - wyodrębnia 2 znaki
ARRAYFORMULA - używanie tablic w funkcjach niezwiązanych z tablicami
MAX - wartość maksymalna

Oczywiście jest to błędne rozwiązanie, bo bierze pod uwagę 2 kolejne cyfry, a mogą być w różnej odległości.

Chat to poprawił tak:

=JEŻELI(DŁ(A1)<=1; 0;
LET(
s; A1;
n; DŁ(s);
d; WARTOŚĆ(FRAGMENT.TEKSTU(s; SEQUENCE(n); 1));
MAX(
MAP(
SEQUENCE(n-1);
LAMBDA(i;
10 * INDEKS(d; i; 1) +
MAX( INDEKS(d; SEQUENCE(n-i) + i; 1) )
)
)
)
)
)

ale wywala BŁĄD

w każdym razie rozwiązanie będzie w JavaScripcie

const fs = require('fs');
const path = require('path');

// Ścieżka do pliku
const filePath = path.join(__dirname, '3.txt');
let data;

try {
data = fs.readFileSync(filePath, 'utf-8');
} catch (err) {
console.error('Błąd przy wczytywaniu pliku:', err);
return;
}

const lines = data.split(/\r?\n/);

let sum = 0;
let processedLines = 0;

for (const line of lines) {
let first = 0;
let second = 0;
let digits = line.split('').map(x => parseInt(x));
let length = digits.length - 1;
for (let i = 0; i < length; ++i) {
if (digits[i] > first) {
first = digits[i];
second = digits[i+1];
} else if (digits[i] > second) {
second = digits[i];
}
}
const numberToAdd = 10 * first + second;
sum += numberToAdd;
console.log(line, first, second, numberToAdd, sum);
++processedLines;
}

console.log('Result: ', sum);
console.log('Processed lines:', processedLines);

Niestety system nie akceptuje odpowiedzi. Podobno wynik jest za niski.

Czy moja logika jest OK?

Dla każdej linijki:
1. Ustaw obie cyfry na 0.
2. Jedź znak po znaku od 1 do n-1:
2.1. Jeśli napotkana cyfra jest większa od tej, którą mamy zapisaną jako first, to:
2.1.1. Ustaw first na tę cyfrę.
2.1.2. Ustaw second na kolejną cyfrę.
2.2. Inaczej, jeśli napotkana cyfra jest większa od tej, którą mamy zapisaną jako second, to:
2.2.1. Ustaw second na tę cyfrę

#adventofcode #programista15k #programowanie
  • 2
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach