Как стать автором
Обновить
10
0.1

Пользователь

Отправить сообщение

Полно игр с повесткой нормально продалось кстати.
Имхо, с Конкордом главная проблема - игра по сути клон Овервотч, но похуже, подороже и позже на 8 лет.

Посмотрел цены на родине бренда в Румынии, где есть завод емнип. В Сербии примерно такие же цены.
Что за страна с такими дешевыми Логанами за 12.5к?

RT3200/E8450 OKD была только на снапшотах, стабильная версия работала нормально.
Про покупку соглашусь, RT3200 просто привел как пример, в РФ доступен Xiaomi AX3200 / Redmi AX6S на том же самом MT7622, стоит 4-5к рублей. Тут на хабре не так давно была статья про него: https://habr.com/ru/articles/820417/

Но устройства на 7622 появились сильно раньше 2023, у меня например Belkin RT3200, дата релиза - 2020 год.

Вот изначальный комментарий по деминифицированному коду до "Rewrite it in human-readable javascript with verbose variable names":

This code appears to be an implementation of a chess game in JavaScript. Let's break it down:

<script>
// Board initialization
for(B=i=y=u=b=i=5-5,x=10,I=[],l=[];B++<304;I[B-1]=B%x?B/x%x<2|B%x<2?7:B/x&4?0:l
[i++]="ECDFBDCEAAAAAAAAIIIIIIIIMKLNJLKM@G@TSb~?A6J57IKJT576,+-48HLSUmgukgg OJNMLK  IDHGFE"
.charCodeAt(y++)-64:7);
// Main game function
function X(c,h,e,s){  c^=8;  for(var o,S,C,A,R,T,G,d=e&&X(c,0)>1e4,n,N=-1e8,O=20,K=78-h<<9;++O<99;)    if((o=I[T=O])&&(G=o^c)<7){      A=G--&2?8:4;      C=o-9?l[61+G]:49;      do if(!(R=I[T+=l[C]])&&!!G|A<3||(R+1^c)>9&&G|A>2){        if(!(R-2&7))return K;        n=G|(c?T>29:T<91)?o:6^c;        S=(R&&l[R&7|32]*2-h-G)+(n-o?110:!G&&(A<2)+1);        if(e>h||1<e&e==h&&S>2|d){          I[T]=n;I[O]=0;          S-=X(c,h+1,e,S-N);          if(!(h||e-1|B-O|T-b|S<-1e4))return W(),c&&setTimeout("X(8,0,2),X(8,0,1)",75);          I[O]=o;I[T]=R        }        if(S>N||!h&S==N&&Math.random()<.5)          if(N=S,e>1)            if(h?s-S<0:(B=O,b=T,0))break      }while(!R&G>2||(T=O,(G||A>2|(c?O>78:O<41)&!R)&&++C*--A))    }  return-K+768<N|d&&N
}
// Function to update the HTML board
function W(){  i="<table>";  for(u=18;u<99;document.body.innerHTML=i+=++u%x-9?    "<th width=60 height=60 onclick='I[b="+u+"]>8?W():X(0,0,1)'style='font-size:50px'bgcolor=#"+    (u-B?u*.9&1||9:"d")+"0f0e0>&#"+(I[u]?9808+l[67+I[u]]:160):u++&&"<tr>")    B=b
}
// Initialize the game
W()
</script>

This code implements a chess game using JavaScript. Here's a breakdown of its main components:

  1. Board Initialization:

    • The first part of the code initializes the chess board using arrays and string manipulation.

    • It sets up the initial position of the pieces on the board.

  2. Main Game Function (X):

    • This function handles the game logic, including move generation and evaluation.

    • It uses a minimax algorithm with alpha-beta pruning for AI move selection.

    • The function recursively evaluates possible moves to determine the best one.

  3. Board Update Function (W):

    • This function updates the HTML representation of the chess board.

    • It creates a table with clickable cells representing the chess squares.

    • Each cell has an onclick event that triggers a move when clicked.

  4. Game Initialization:

    • The W() function is called at the end to set up the initial board state.

The code is highly minified and uses various optimizations to reduce its size, making it somewhat difficult to read. It uses bitwise operations and character code manipulations for efficiency.

Some notable features:

  • The board is represented as a 1D array (I) instead of a 2D array.

  • Piece movements are encoded in the 'l' array.

  • The code uses Unicode chess symbols to display pieces on the board.

This implementation allows for player vs. AI gameplay, where the AI uses the minimax algorithm to determine its moves. The game is rendered in HTML and updated dynamically as moves are made.

Would you like me to explain any specific part of the code in more detail?

Ответ Claude 3.5:

// Chess game implementation in JavaScript

// Constants
const BOARD_SIZE = 10; // 8x8 board with 2 extra ranks/files for edge detection
const TOTAL_SQUARES = 120; // 10x12 board representation

// Piece representations
const EMPTY = 0;
const WALL = 7; // Used for the edge of the board
const WHITE_PAWN = 1, WHITE_KNIGHT = 2, WHITE_BISHOP = 3, WHITE_ROOK = 4, WHITE_QUEEN = 5, WHITE_KING = 6;
const BLACK_PAWN = 9, BLACK_KNIGHT = 10, BLACK_BISHOP = 11, BLACK_ROOK = 12, BLACK_QUEEN = 13, BLACK_KING = 14;

// Game state
let currentPosition = 0;
let bestMoveStart = 0;
let bestMoveEnd = 0;

// Board representation
let board = new Array(TOTAL_SQUARES);

// Piece movement directions
let pieceMovements = [];

// Initialize the board
function initializeBoard() {
    let index = 0;
    let charIndex = 0;
    const initialSetup = "RNBQKBNRPPPPPPPP                                pppppppprnbqkbnr";

    for (let square = 0; square < TOTAL_SQUARES; square++) {
        if (square % BOARD_SIZE === 0 || square % BOARD_SIZE === 9 || square < BOARD_SIZE || square >= 110) {
            board[square] = WALL;
        } else {
            let piece = initialSetup.charAt(charIndex++);
            board[square] = getPieceValue(piece);
        }
    }

    // Initialize piece movements
    pieceMovements = [-1, 1, -BOARD_SIZE, BOARD_SIZE, -BOARD_SIZE-1, -BOARD_SIZE+1, BOARD_SIZE-1, BOARD_SIZE+1];
}

function getPieceValue(char) {
    const pieceValues = {
        'P': WHITE_PAWN, 'N': WHITE_KNIGHT, 'B': WHITE_BISHOP, 'R': WHITE_ROOK, 'Q': WHITE_QUEEN, 'K': WHITE_KING,
        'p': BLACK_PAWN, 'n': BLACK_KNIGHT, 'b': BLACK_BISHOP, 'r': BLACK_ROOK, 'q': BLACK_QUEEN, 'k': BLACK_KING,
        ' ': EMPTY
    };
    return pieceValues[char] || EMPTY;
}

// Main game function
function makeMove(color, depth, evalFlag, score) {
    color ^= 8; // Switch color (8 is the difference between white and black pieces)
    let bestScore = -Infinity;
    let startSquare, endSquare, piece, capturedPiece, moveDirection, pieceType;

    for (startSquare = 20; startSquare < 100; startSquare++) {
        piece = board[startSquare];
        if (piece && (pieceType = piece ^ color) < 7) {
            let isSlidingPiece = (pieceType & 2) ? 8 : 4;
            let movementIndex = (piece - 9) ? pieceMovements[60 + pieceType] : 49;

            do {
                endSquare = startSquare;
                do {
                    endSquare += pieceMovements[movementIndex];
                    capturedPiece = board[endSquare];

                    if (!capturedPiece && pieceType || isSlidingPiece < 3 || (capturedPiece + 1 ^ color) > 9 && pieceType || isSlidingPiece > 2) {
                        if (!(capturedPiece - 2 & 7)) return 78 - depth << 9;

                        // Make move
                        board[endSquare] = piece;
                        board[startSquare] = EMPTY;

                        // Recursively evaluate position
                        let evaluation = -makeMove(color, depth + 1, evalFlag, -score);

                        // Unmake move
                        board[startSquare] = piece;
                        board[endSquare] = capturedPiece;

                        if (evaluation > bestScore) {
                            bestScore = evaluation;
                            if (depth === 0) {
                                bestMoveStart = startSquare;
                                bestMoveEnd = endSquare;
                            }
                        }
                    }
                } while (!capturedPiece && pieceType > 2);
                movementIndex++;
            } while (((piece - 9) || isSlidingPiece > 2 || (color ? startSquare > 78 : startSquare < 41) && !capturedPiece) && movementIndex & 7);
        }
    }
    return bestScore;
}

// Function to update the HTML board
function updateBoard() {
    let boardHTML = "<table>";
    for (let rank = 9; rank >= 2; rank--) {
        boardHTML += "<tr>";
        for (let file = 1; file <= 8; file++) {
            let square = rank * 10 + file;
            let piece = board[square];
            let pieceChar = getPieceChar(piece);
            let color = (rank + file) % 2 === 0 ? "white" : "lightgray";
            boardHTML += `<td style="width:60px;height:60px;text-align:center;font-size:40px;background-color:${color}" onclick="handleClick(${square})">${pieceChar}</td>`;
        }
        boardHTML += "</tr>";
    }
    boardHTML += "</table>";
    document.body.innerHTML = boardHTML;
}

function getPieceChar(piece) {
    const pieceChars = {
        [WHITE_PAWN]: "♙", [WHITE_KNIGHT]: "♘", [WHITE_BISHOP]: "♗", [WHITE_ROOK]: "♖", [WHITE_QUEEN]: "♕", [WHITE_KING]: "♔",
        [BLACK_PAWN]: "♟", [BLACK_KNIGHT]: "♞", [BLACK_BISHOP]: "♝", [BLACK_ROOK]: "♜", [BLACK_QUEEN]: "♛", [BLACK_KING]: "♚"
    };
    return pieceChars[piece] || "";
}

function handleClick(square) {
    if (board[square] >= BLACK_PAWN) {
        updateBoard();
    } else {
        makeMove(0, 0, 1, 0);
        board[bestMoveEnd] = board[bestMoveStart];
        board[bestMoveStart] = EMPTY;
        updateBoard();
        setTimeout(() => {
            makeMove(8, 0, 2, 0);
            makeMove(8, 0, 1, 0);
            board[bestMoveEnd] = board[bestMoveStart];
            board[bestMoveStart] = EMPTY;
            updateBoard();
        }, 250);
    }
}

// Initialize the game
initializeBoard();
updateBoard();

Странно, открыл страницу ютуб в плеймаркете порофлить с отзывов и таких почти нет, даже с фильтром на одну звезду.

Владею версией 2021, все так.

Еще раз сравниваем с маками, кину мешок камней в сторону реализации переключения встроенного GPU на отдельный. В винде это реализовано отвратительно сразу на нескольких уровнях:
- Настройка профилей приложений в нескольких разных местах и работает криво, часто бывает что ноут продолжает использовать дискретный GPU при работе от батареи из-за какого-нибудь одного неизвестного приложения которое все еще его использует(амд контрол центр привет)
- Многие приложения зависают/падают/отображают мусор, отваливается аппаратное ускорение в браузерах и тд при смене GPU (=подключил ноут к внешнему монитору, т.к. дисплейпорт работает только с включенной GPU Nvidia).
- Из-за бага в драйверах АМД, Стим запускается несколько минут, т.к. при сканировании видеоадаптеров происходит очень долгое ожидание. баг зарепорчен уж несколько лет, ничего не фиксится

Проблемы становятся менее заметными, если снести безумно кривой, навязчивый и тяжёлый асусовский мусор и поставить набор опенсорсных костылей в виде G-Helper.

Люди сообщают что программный оффлоадинг помогает даже на довольно древних платфомах:
>ar71xx/ath79: with software flow offload, a TP-Link Archer C7 goes from 250 Mbps to 700 Mbps

По поводу снижения безопасности сомнительно, это мейнлайн фича ядра с 4.16.

Как @oleg5d75 справедливо заметил ниже, Hardware offload тут работать не будет, так что последнюю галку не нужно ставить.

Да, точно, там драйвер не mt76, хардварный оффлоад работать не будет.
Но софтверный должен.

Рекомендую попробовать OpenWrt SNAPSHOT, можно сгенерить тут:
https://firmware-selector.openwrt.org/
Там пофиксили несколько неприятных багов в драйвере mt76.

Еще обязательно включите вот это в разделе Firewall:

Это должно значительно улучшить скорость разгрузив слабый одноядерный CPU роутера

  В современных реалиях скорее всего копирование в/из DSP будет занимать времени

Но есди dsp имеет доступ к памяти, то и копировать не надо.

Статья - копирайтерский мусор из 2015 года.

А в чем она противоположная? 10% населения рф - это 15млн человек, условно на 10 приложений у юзера каждое нужно обновить всего 10 раз - и получится 1.5 млрд

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

официально признали за лекарство

это категории Full, Emergency, Travel-only

Информация

В рейтинге
3 059-й
Откуда
Россия
Зарегистрирован
Активность