Quebra-cabeça de programação 3 (C) do m3ph1st0s: “Easy bug” [fechado]


11

Este é o terceiro da minha série de quebra-cabeças C / C ++; caso você tenha perdido os dois primeiros, eles estão aqui: (1) quebra-cabeça de programação do m3ph1st0s 1 (C ++) (2) quebra-cabeça de programação do m3ph1st0s 2 (C ++): "Call hard!"

Devo dizer que meus quebra-cabeças são 100% originais. Caso contrário, sempre o declararei no texto. Meu terceiro quebra-cabeça tem 2 partes, da seguinte maneira:

Puzzle 3.1

Esta parte (3.1) não é um quebra-cabeça original, é coletada em alguma página da Internet que li há algum tempo. Eu o uso aqui como ponto de partida e um aquecimento para você. Resolva este e depois passe para a 2ª parte.

Alguém tentou imprimir o sinal "+" 20 vezes e criou o seguinte programa:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

O fato de não ter o resultado esperado é óbvio - o programa nunca termina. Consertá-lo! Fácil? Agora corrija o programa alterando SOMENTE UM CARÁTER - é claro que não é um espaço! Para este desafio, existem 3 soluções. Encontre todos os 3 deles. Apenas para esclarecer: o programa deve emitir sinais de 20 "+" e deve terminar rapidamente. Antes de me criticar sobre o que significa "rápido", direi que isso significa no máximo alguns segundos (que, a propósito, é demais, mas apenas para deixar claro).

Puzzle 3.2

EDITADO Mencionou -me anteriormente que a solução para o quebra-cabeça 3.2.2 pode ser dependente do compilador. Para eliminar qualquer possível discussão sobre o assunto, modificarei a idéia e a melhorarei em um próximo quebra-cabeça, quando tomarei cuidado extra para não gerar controvérsia. No entanto, para manter esse quebra-cabeça, farei uma pequena modificação no 3.2.2 (a solução será mais fácil, mas mais limpa).

Quando vi o quebra-cabeça pela primeira vez, achei incrível. Consegui resolvê-lo, mas não imediatamente, pois requer atenção cuidadosa. Se você está aqui, significa que você também resolveu. Se você fez isso escrevendo um programa para substituir todos os caracteres possíveis por todos os valores possíveis e testar todas as soluções, estará perdido. Cara que trabalha duro embora. Agora, tendo corrigido o programa que escreve sinais de 20 "+":

3.2.1: Insira uma única letra e nada mais no código para que o resultado seja válido e produza a mesma coisa nos 3 programas corrigidos. Escusado será dizer que a carta deve estar antes do anexo} do main (digo isso porque não quero ouvir pessoas que acabaram de escrever uma carta após o programa e de alguma forma o compilador foi muito amigável).

EDITADO (veja abaixo) - Para estas questões finais, considere que o contador i começa em -1 em vez de 0.

3.2.1.5: Repita todos os problemas anteriores com a condição de que a saída tenha pelo menos 19 "+" sinais (mas ainda seja uma saída finita). Mudar de espaço é permitido. Agora você pode ter encontrado mais soluções do que no primeiro caso. Alguns deles definitivamente se encaixam na pergunta 3.2.2.

3.2.2: Escolha outro valor para inicializar a variável n, para que a saída resultante permaneça a mesma para pelo menos um programa corrigido no 3.2.1.5 (não necessariamente para todos eles).

ÚLTIMA EDIÇÃO1 : alterar o programa para gerar 21 sinais "+" ainda é uma boa solução, pois o texto original não dizia "exatamente" 20 sinais. No entanto, a saída infinita é proibida. Obviamente, isso não significa que vamos começar a emitir centenas de sinais "+", pois não é proibido. Mas eliminar uma bela produção de 21 não estaria no espírito dessa competição.

ÚLTIMA EDIÇÃO2 : considerando a ÚLTIMA EDIÇÃO1 e aceitando a mudança de espaço , parece que agora temos 5 soluções possíveis, quatro das quais já foram apontadas nas respostas. O último desafio, no entanto, não foi abordado e devo deixar claro mais uma vez: n deve receber outro valor , soluções que atribuem 20 a n por alguns truques não o farão (como n = 20L). Também prefiro ver a terceira solução que não altera os espaços.

ÚLTIMA EDIÇÃO3 : Editei as últimas perguntas, por favor leia!

O desafio é resolver as duas partes do quebra-cabeça. O primeiro a fazê-lo vence.

Espero que esteja claro, se não, por favor, poste alguma dúvida e editarei o mais rápido possível. Felicidades. texto enfatizado


Presumo que a alteração de um caractere inclua a alteração de espaços para caracteres não espaciais? Se assim for, eu acho que encontrei todos os 3 soluções para parte 1.
mellamokb

oh .. desculpe .. eu tinha em mente negar isso explicitamente, mas eu esqueci. Vou editar agora. Thx por perguntar.
Bogdan Alexandru

Oh bom. Porque eu não consigo encontrar nenhuma resposta para parte 3.2.2 para meus atuais 3 soluções ... Acho que isso significa que eu preciso olhar para aquele mais :)
mellamokb

sim :) boa sorte nisso #
Bogdan Alexandru

1
@ardnew: Não acredito que o OP tenha mudado a intenção original da pergunta. Eu concordo que existem maneiras melhores de corrigir a questão do que colocar um monte de Edit no final ... mas ainda está no centro a mesma pergunta, com algumas coisas esclarecidas.
Mckamokb # 1/12

Respostas:


8

3.1.

for( i = 0;-i < n; i-- )
for( i = 0; i < n; n-- )
for( i = 0; i + n; i-- )

Qualquer uma dessas alterações fará com que o programa produza sinais 20 '+'. Este está próximo:

for( i = 0;~i < n; i-- )

Emite 21 '+' sinais.

3.2.1

Encontrei pelo menos 112 maneiras de resolver esse problema inserindo uma letra. Nem todos eles podem funcionar em todos os compiladores.

int n = 20L;
int n = 20f;
int n = 20d;
uint n = 20;

for( i = 0L; ... )
for( i = 0f; ... )
for( i = 0d; ... )

iprintf("+");
printf("+x");
printf("x+");

Nos dois últimos, substitua qualquer letra por xpara fornecer 104 soluções possíveis. O uso de uma das duas últimas linhas alterará a saída, mas a saída ainda será a mesma para todos os três programas corrigidos.

3.2.2.

Tudo o que eu inventei são algumas coisas que são lançadas de volta ao número 20 na missão de int.

int n = 20L;
int n = 20.001;
int n = 20.999;
int n = 20 + 0x100000000L;

Sim, você tem exatamente as mesmas respostas que eu (não as publiquei antes porque não tinha tudo respondido). Penso que a resposta para 3.2.2 está na terceira solução para 3.1 que nenhum de nós encontrou (e obedece à regra de não permitir que o espaço seja alterado).
Mclamokb

Em 3.2.1, não tenho certeza sobre o fe dsufixos para inttipos (bem, dpara qualquer tipo para que o assunto), mas há alguns outros que você deixou fora: int n = 20l, int n = 20U, e int n = 20u. Também não acredito que uintseja um identificador de tipo padrão em C ou C ++. Qual compilador você está usando para isso, afinal?
ardnew

Você fez um bom trabalho aqui, mas não está completo! Primeiro de tudo, a solução ~ i ainda é boa! O requisito era emitir sinais de 20 "+" para que 21 ainda seja uma boa solução (a única solução ruim é a saída infinita). Isso significa que agora você encontrou 4 soluções! E o engraçado é que ainda tenho mais um :) Sobre o 3.2.2, é ruim, pois exigi especificamente alterar o VALOR de n, não fazer alguns truques para torná-lo 20 :)
Bogdan Alexandru

1
e também, as soluções -i e ~ i mudam de espaço, então eu as considerarei soluções "parciais". a terceira solução completa deve alterar um caractere não espacial, conforme especificado no texto do questionário
Bogdan Alexandru

1
você não entendeu o problema. Eu disse que a modificação produzirá a mesma saída que o programa modificado correspondente. isto é, eu tenho os programas corrigidos C1, C2, C3. após a inserção do caractere, tenho P1, P2, P3. o requisito é: P1 tem a mesma saída que C1, P2 tem a mesma saída que C2, P3 tem a mesma saída que C3. NÃO é P1, P2, P3 ter a mesma saída
Bogdan Alexandru

2

3.1.

Mais um quebra-cabeça. Mas soluções normais são chatas, e algo especial?

Solução 1:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++ )
      printf("+");
   return 0;
}

Eu decidi mudar APENAS UM PERSONAGEM, ou seja -,. Nenhum caractere diferente de -foi alterado.

Solução dois:

#include <stdio.h>
int main() {
   int i=printf("++++++++++++++++++++");exit(0);
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Isso muda exatamente um caractere - o ponto-e-vírgula depois int ipara =printf("++++++++++++++++++++");exit(0);.

Solução três:

#include <stdix.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Isso carrega o stdix.hcabeçalho do sistema. No caminho de inclusão do sistema, insira o seguinte arquivo, chamado stdix.h. Ele deve conter o seguinte conteúdo.

static inline void printf(const char *string) {
    int i;
    for(i = 0; i < 20; i--)
        putchar('+');
    exit(0);
}

3.2.

Agora, para inserir uma letra. Bem, isso é simples, substitua int main()por int main(a). Isso não é válido de acordo com os padrões, mas quem se importa?



0

3.1.

  1. Mude i--paran--
  2. i<n para -i<n
  3. (Infelizmente resposta inválida porque não estava consultando o compilador antes de ver outras respostas)

3.2.1

int n = 20 

para

uint n = 20

(Dependente do compilador ...)

3.2.2.

int n =-20L;

for(i = -1; i%n; i--)

imprime 19 sinais +, o mesmo que com int n = 20L;. No entanto, eu não teria sugerido se não tivesse visto outras respostas para o 3.2.1


0
#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++  )
      printf("+");
        printf("\n");
   return 0;
}

1
Certifique-se de adicionar o idioma do programa e a contagem de caracteres em sua resposta.
Timtech 25/09

1
@Timtech por que contar caracteres? isto não é código-golfe
proud haskeller

1
@ Timtech também por que incluir o idioma? este é um desafio específico da linguagem.
proud haskeller
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.