AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78994528
Accepted
HareSurf
HareSurf
Asked: 2024-09-17 22:26:23 +0800 CST2024-09-17 22:26:23 +0800 CST 2024-09-17 22:26:23 +0800 CST

Como calcular o número de colunas de modo que cada linha tenha todos os números pares ou ímpares de itens, da forma mais compacta possível?

  • 772

Gostaria de dispor glifos unicode semelhantes a este :

Pode haver de 13 a 100 itens na coleção exibida (alfabetos, abjads, abugidas, silabários, etc.), então pode haver um conjunto com 99 itens, ou um com 16 itens, etc.

Como você pode dispor os elementos de forma mais bonita (e automática) (para que também fique bonito quando responsivo)? Aqui está o que eu tenho por padrão com o flexbox:

insira a descrição da imagem aqui

Cada item tem uma altura fixa e a largura é responsiva (mas a mesma para cada elemento).

O objetivo é que cada linha tenha um número par ou ímpar de itens. Dessa forma, todas as colunas verticais ficarão alinhadas (e não fará o que meu gif animado está fazendo, onde linhas pares/ímpares são intercaladas).

  1. É possível fazer alguma fórmula matemática para calcular algo como "você precisa de 5 itens por linha, exceto que a última linha terá 3 (ou 1)"? Dada alguma contagem total como 99?

Como você faria isso?

Eu tenho um componente React que faz o layout do Flexbox como <Grid minWidth={96} gap={8} maxColumns={5} breakpoints={[5, 3, 1]} />, onde breakpointsestão o número de itens permitidos por linha, e maxColumnssão as colunas máximas (breakpoints/maxColumn é meio redundante, você pode definir qualquer um ou, talvez eu limpe isso mais tarde) . Todas essas informações podem ser irrelevantes, mas apenas apontando para o caso, é meu componente de grade responsivo.

Como posso dividir meu total por x para descobrir se deve haver linhas pares ou ímpares e, então, definir o maxColumnsou breakpointspara o que for "mais compacto"? Então, por exemplo:

  • Se forem 26 elementos , ficaria melhor com 6 linhas de 4, seguidas de 1 linha de 2. - Se forem 27 elementos ,

A "beleza" disso pode ser subjetiva, e não há uma regra clara para o que é mais bonito. Apenas procurando por qualquer coisa que não deixe facilmente um nó único órfão no final e então tenha 7 itens em todas as outras linhas. Idealmente, temos:

  • Entre 3 e 7 colunas.
  • A última linha deve ter o mesmo número de itens em todas as linhas anteriores, ou não menos que isso maxRowCount - 2(portanto, se todas as linhas tiverem 7, a última linha poderá ter 5 ou apenas 7, ou se todas as linhas tiverem 5, a última linha poderá ter apenas 3 ou 5, etc.).
  • O item de linha tem um minWidth: 96px, e cresce para preencher o espaço. Posso descobrir como tornar as coisas responsivas quando tivermos o básico disso funcionando, mas suponha que a containerWidthexista.

Então, na minha cabeça, digamos que temos containerWidth === 700px. Então, 700/96 == 7+, então talvez 7 por linha. Se tivermos 99 itens (por exemplo), então 99 % 7 == 1, então 7não vai funcionar porque teremos 1 na última linha. 6não vai funcionar porque 99é par, então tente 5? 99 % 5 == 4, isso não vai funcionar porque 4é par. Então tente 3, 99 % 3 == 0, então isso funcionaria como está, use isso!

Como você implementaria algo assim?

javascript
  • 2 2 respostas
  • 31 Views

2 respostas

  • Voted
  1. HareSurf
    2024-09-17T22:26:23+08:002024-09-17T22:26:23+08:00

    Algo assim parece correto, mas será que resolvi corretamente?

    console.log(
      99,
      calculateColumns({ totalCount: 99, itemWidth: 96, containerWidth: 700 })
    );
    console.log(
      98,
      calculateColumns({ totalCount: 98, itemWidth: 96, containerWidth: 700 })
    );
    console.log(
      97,
      calculateColumns({ totalCount: 97, itemWidth: 96, containerWidth: 700 })
    );
    console.log(
      96,
      calculateColumns({ totalCount: 96, itemWidth: 96, containerWidth: 700 })
    );
    console.log(
      95,
      calculateColumns({ totalCount: 95, itemWidth: 96, containerWidth: 700 })
    );
    console.log(
      94,
      calculateColumns({ totalCount: 94, itemWidth: 96, containerWidth: 700 })
    );
    console.log(
      93,
      calculateColumns({ totalCount: 93, itemWidth: 96, containerWidth: 700 })
    );
    console.log(
      91,
      calculateColumns({ totalCount: 91, itemWidth: 96, containerWidth: 700 })
    );
    
    function calculateColumns({ totalCount, itemWidth, containerWidth }) {
      let max = Math.min(Math.floor(containerWidth / itemWidth), 7)
      while (max > 3) {
        const maxIsEven = isEven(max)
        const remainder = totalCount % max
        const remainderIsEven = isEven(remainder)
        if (maxIsEven && remainderIsEven) {
          const diff = max - remainder
          if (diff <= 2) {
            return max
          }
        } else if (!maxIsEven && (!remainderIsEven || !remainder)) {
          const diff = max - remainder
          if (diff <= 2) {
            return max;
          }
        } else {
          // one is even, one is odd
        }
        max--
      }
      return max
    }
    
    function isEven(n) {
      return n % 2 === 0
    }

    • -1
  2. Best Answer
    mplungjan
    2024-09-17T22:58:48+08:002024-09-17T22:58:48+08:00

    Aqui está um exemplo que testa repetidamente se o número de colunas corresponde aos seus critérios

    const ranges = [ 
      [0x2600, 0x26FF], // Symbols
      [0x2700, 0x27BF], // Dingbats
      [0x1F300, 0x1F5FF] // Symbols and Pictographs
    ];
    
    const randomUnicodeGlyph = () => {
      const range = ranges[Math.floor(Math.random() * ranges.length)];
      const codePoint = Math.floor(range[0] + Math.random() * (range[1] - range[0] + 1));
      return String.fromCodePoint(codePoint);
    };
    
    // Generate a set of random Unicode glyphs
    const generateGlyphSet = (length) => Array.from({ length }, randomUnicodeGlyph);
    
    // Calculate the best number of columns per row
    const calculateColumns = (totalItems, minItemWidth, containerWidth) => {
      const minColumns = 3;
      const maxColumns = 7;
      let possibleColumns = Math.min(Math.floor(containerWidth / minItemWidth), maxColumns);
    
      for (let columns = possibleColumns; columns >= minColumns; columns--) {
        let rows = Math.floor(totalItems / columns);
        let lastRowItems = totalItems % columns;
    
        if (lastRowItems === 0 || lastRowItems >= (columns - 2)) {
          return columns;
        }
      }
      return minColumns; // fallback
    };
    
    // HTML table for the glyph set
    const createTable = (glyphSet, containerWidth, minItemWidth) => {
      const columns = calculateColumns(glyphSet.length, minItemWidth, containerWidth);
      return `
          <table class="glyph-table">
            <tr>${glyphSet.map((glyph, index) => 
              `<td>${glyph}</td>${(index + 1) % columns === 0 && (index + 1 !== glyphSet.length) ? '</tr><tr>' : ''}`
            ).join('')}
            </tr>
          </table><hr/>`;
    };
    
    // Generate three sets of glyphs with random lengths between 13 and 100
    const sets = [
      generateGlyphSet(16),
      generateGlyphSet(26),
      generateGlyphSet(99)
    ];
    
    const containerWidth = 700;
    const minItemWidth = 96;
    document.body.innerHTML = sets.map(set => createTable(set, containerWidth, minItemWidth)).join('');
    .glyph-table {
      width: 100%;
      border-collapse: collapse;
      margin-bottom: 20px;
    }
    
    .glyph-table td {
      height: 96px;
      text-align: center;
      font-size: 24px;
      padding: 3px;
    }

    • -1

relate perguntas

  • classificação de mesclagem não está funcionando - código Javascript: não é possível encontrar o erro mesmo após a depuração

  • método select.remove() funciona estranho [fechado]

  • Sempre um 401 res em useOpenWeather () - react-open-weather lib [duplicado]

  • O elemento de entrada não possui atributo somente leitura, mas os campos ainda não podem ser editados [fechado]

  • Como editar o raio do primeiro nó de um RadialTree D3.js?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve