Problema lógico

Boa noite, rapaziada. Eu estou estudando lógica de programação e queria saber se resolver problemas que envolvam lógica matemática é uma boa, ou eu devo focar em algo diferente? Eu vejo alguns programadores experientes que não conseguem resolver problemas que envolvam “lógica matemática”, e aí eu fico meio na dúvida de estar perdendo tempo resolvendo eles. Eu sou mediano em “lógica pura”, mas quando envolve matemática eu fico meio confuso (não sei porquê). Principalmente com essa coisa de “N números”…
Eis um dos exercícios;

Problema dos casais

Em um bar, os homens recebem cartão de identificação com números ímpares e as mulheres cartões com números pares.
Um animador contratado para animar a programação do dia deseja saber se existe uma proporção de um-para-um entre homens e mulheres.
Você deve fazer um programa para fazer esta verificação.
O programa receberá um número N (1<=N<=1000) com o número de cartões distribuídos e uma lista com N números inteiros positivos (todos maior ou igual a 1 e menor ou igual a 500) cada um representando o número de um cartão. A saída deverá ser uma única linha com o caractere S caso exista a proporção ou com o caractere N caso contrário.

1 curtida

Sim é uma boa e não é perda de tempo, resolver esses problemas é basicamente musculação cerebral, eles te obrigam a desenvolver técnicas para abstrair o problema


Quanto ao desafio, um jeito intuitivo de fazer é:

local n = cartoes_recebidos
local lista = cartoes_distribuidos

-- Caso especial, recebemos uma 
-- quantidade ímpar de cartões

if n%2 ~= 0 then
  print("N")
  os.exit()
end

-- Precisamos da lista ordenada:

table.sort(lista)

-- Nessa parte atenção porque
-- Lua é base 1 e não base 0, a 
-- ideia é simples:
--
--    Para i, começando do 2 até n
--    de 2 em dois

for i=2,n,2 do
  -- O cartão par é o item
  -- do índice atual
  local cartao_par      = lista[i]

  -- O cartão impar é o item
  -- do índice atual-1
  local cartao_impar = lista[i-1]

  -- Essa relação é possível porque 
  -- ordenamos os cartões e fizemos
  -- o for de 2 em dois

  -- Se tirar 1 do cartão par e ele não for 
  -- igual ao cartão impar
  if cartao_par-1 ~= cartao_impar then
    -- Imprimirmos N e saímos 
    print("N")
    os.exit()
  end
end

-- Saímos com S

print("S")

Dessa forma a gente só precisa trabalhar em casos de falha diminuindo a complexidade do código

2 curtidas

Caramba, então eu vou ter que treinar muuuito lógica, porque nesse problema abaixo eu tive que ler várias vezes só para entender que o primeiro N é que vai determinar quantos números serão lidos pelo programa. Mas ainda sim, quanto mais eu leio esse problema, mais confuso eu fico porque eu não consigo ver muita lógica nessa questão. Me parece que ela foi mal redigida, sei lá…

Faça um programa capaz de solicitar um número N (1<N<1000) do usuário e ler N números inteiros. Após a leitura do último número deve-se informar:

Depois de um tempo eu entendi mas… Olha como eu pensei da primeira vez;

EX:
O usuário entra com um número: 3
O programa ler N números.

Mesmo o número 3 satisfazendo a condição (1<n<1000)
Eu imaginei como que uma pessoa entenderia , de primeira, que o número inserido deverá ser o número máximo lido pelo programa??

Eu não sei se o fato de está no singular (1 número N) e depois no plural (ler N números) me confunde, sei lá, não vejo lógica nessa questão.

Quando as questões são mais detalhadas eu me saio melhor, mas essas envolvendo matemático eu sou horrível.

Então muito bem, cidadão @rodrigob0k2, como lhe disse, foi analisando o prompt desse problema de lógica, que percebi a solução em mim mesmo,e não do suposto erro do mesmo,o tal do: "problema dos N №s.

E como tal,aqui está a implementação do “Problema dos casais” em JavaScript para um ambiente Node.js:

const readline = require('readline');

// Função principal para verificar a proporção de um-para-um entre homens e mulheres
function verificarProporcao(cartoes) {
    let homens = 0;
    let mulheres = 0;

    for (let cartao of cartoes) {
        if (cartao % 2 === 0) {
            mulheres++;
        } else {
            homens++;
        }
    }

    return homens === mulheres ? 'S' : 'N';
}

// Configuração para ler a entrada do usuário
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

// Leitura dos dados
let entrada = [];
rl.on('line', (input) => {
    entrada.push(input);
    if (entrada.length === 2) {
        const N = parseInt(entrada[0]);
        const cartoes = entrada[1].split(' ').map(Number);

        if (N >= 1 && N <= 1000 && cartoes.every(num => num >= 1 && num <= 500)) {
            const resultado = verificarProporcao(cartoes);
            console.log(resultado);
        } else {
            console.log('Dados inválidos');
        }
        rl.close();
    }
});

Executando o programa:

Para executar este código, salve-o em um arquivo, por exemplo, casais.js, e execute-o usando Node.js com o comando: node casais.js.

Então o Sr. inserindo as entradas do como solicita o programa,esse código deve funcionar corretamente para resolver o problema dos casais conforme descrito pelo esboço/prompt.

Para retomar a proporção de um-para-um entre homens no caso dos cartões ímpares e das mulheres cartões pares, você precisa garantir que a quantidade de números ímpares seja igual à quantidade de números pares.

Aqui estão alguns exemplos de combinações que você poderia digitar, testei cinco maneiras e deu certo, espero que funcione para você:

Exemplo 1:

Entrada:

6
1 2 3 4 5 6

Explicando:

• N = 6 (6 cartões distribuídos)

• Cartões: 1, 2, 3, 4, 5, 6

•Cartões ímpares (homens): 1, 3, 5 (total 3)

• Cartões pares (mulheres): 2, 4, 6 (total 3)

• Saída: S (proporção de um-para-um)

Exemplo 2:

Entrada:

4
1 2 3 4

Explicando:

• N = 4 (4 cartões distribuídos)

• Cartões: 1, 2, 3, 4

• Cartões ímpares (homens): 1, 3 (total 2)

• Cartões pares (mulheres): 2, 4 (total 2)

• Saída: S (proporção de um-para-um)

Exemplo 3:

Entrada:

2
1 2 

Explicando:

• N = 2 (2 cartões distribuídos)

• Cartões: 1, 2 Cartões ímpares (homens): 1 (total 1)

• Cartões pares (mulheres): 2 (total 1)

• Saída: S (proporção de um-para-um)

Exemplo 4:

Entrada:

8
2 4 6 8 1 3 5 7

Explicando:

• N = 8 (8 cartões distribuídos)

• Cartões: 2, 4, 6, 8, 1, 3, 5, 7

• Cartões ímpares (homens): 1, 3, 5, 7 (total 4)

• Cartões pares (mulheres): 2, 4, 6, 8 (total 4)

• Saída: S (proporção de um-para-um)

Exemplo 5 (sem proporção):

Entrada:

5
1 2 3 4 5

Explicando:

• N = 5 (5 cartões distribuídos)

• Cartões: 1, 2, 3, 4, 5

• Cartões ímpares (homens): 1, 3, 5 (total 3)

• Cartões pares (mulheres): 2, 4 (total 2)

• Saída: N (sem proporção de um-para-um)

Então para o Sr. entender do como usar o software,vou explicar o exemplo um, note bem você que testei tanto no meu celular :iphone: via terminal Termux, quanto na plataforma Replit. No Replit é melhor, pois ao abrir o programa,surge o sinal > , já via Node.js no Termux é o Black total.

Obs: “Para você usar o script .JS dos jogos, caso use o Node.js, você precisa salvar o script no editor Vim ou no editor nano pelo terminal. No meu caso que gosto mais do Vim , é só digitar no terminal: vim casais.js, logo dá um ENTER e com o Vim aberto, digite i depois disso, bem antes de você ter copiado o script.js do software, você cola dentro do editor, clica em ESC, depois em : depois, w para salvar, dando um ENTER, depois em q e finalmente,ENTER para sair do editor, depois é só chamar o script com: node casais.js, o software será iniciado no terminal do seu sistema,SO.”

Se você optar em rodar o código via plataforma Replit com a tecnologia Node.js ,então ao abrir,no primeiro momento= >, você digita o № 6 em seguida digite ENTER, no segundo momento= > você digita: 1 2 3 4 5 6 tudo com espaço entre eles,sem vírgulas, logo dê ENTER e a saída será: S.

Obs: se você digitar: 1,2,3,4,5,6 com vírgulas, o software encerra com a mensagem: Dados inválidos

E se tú também digitar: 6 logo no primeiro momento,e no segundo momento digitar: 1 der espaço e logo digitar: 5 e der ENTER a saída será: N. Note bem o Sr. que isso é um atalho,ok?

Caso digite no primeiro momento: 5 der ENTER e no segundo momento: 5 e der ENTER a saída será: N. É a condição de não proporção. E não esqueça: Para que o programa retorne ‘S’, você precisa sempre garantir que o número de cartões ímpares seja igual ao número de cartões pares.

Bom, é isso, espero ter contribuído, clareado sua lógica. Muito bom dia ao Sr. and always grateful, sucesso sempre. :penguin: :snowflake: :coffee:

1 curtida

Wow! Isso foi bem útil. Tenho estudado lógica e essa sua implementação vai me ajudar nos estudos. Até aqui consegui entender cada linha do código (passei um tempo estudando a documentação), agora estou na fase de implementação de problemas simples, para treinar a lógica e seguindo em frente… :slight_smile:

1 curtida

Este tópico foi fechado automaticamente 3 dias depois da última resposta. Novas respostas não são mais permitidas.