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
fonte
Respostas:
3.1.
Qualquer uma dessas alterações fará com que o programa produza sinais 20 '+'. Este está próximo:
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.
Nos dois últimos, substitua qualquer letra por
x
para 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
.fonte
f
ed
sufixos paraint
tipos (bem,d
para qualquer tipo para que o assunto), mas há alguns outros que você deixou fora:int n = 20l
,int n = 20U
, eint n = 20u
. Também não acredito queuint
seja um identificador de tipo padrão em C ou C ++. Qual compilador você está usando para isso, afinal?3.1.
Mais um quebra-cabeça. Mas soluções normais são chatas, e algo especial?
Solução 1:
Eu decidi mudar APENAS UM PERSONAGEM, ou seja
-
,. Nenhum caractere diferente de-
foi alterado.Solução dois:
Isso muda exatamente um caractere - o ponto-e-vírgula depois
int i
para=printf("++++++++++++++++++++");exit(0);
.Solução três:
Isso carrega o
stdix.h
cabeçalho do sistema. No caminho de inclusão do sistema, insira o seguinte arquivo, chamado stdix.h. Ele deve conter o seguinte conteúdo.3.2.
Agora, para inserir uma letra. Bem, isso é simples, substitua
int main()
porint main(a)
. Isso não é válido de acordo com os padrões, mas quem se importa?fonte
Puzzle 3.1 Respostas
i--
paran--
(demo: http://ideone.com/l0Y10 )i < n
parai + n
(demo: http://ideone.com/CAqWO )[SPACE]i < n
para-i < n
. (demo: http://ideone.com/s5Z2r )Puzzle 3.2.1
Mude
int n = 20
paraint n = 20L
(adicione umL
no final).Quebra-cabeça 3.2.2
Ainda não encontrou uma resposta ...
fonte
3.1.
i--
paran--
i<n
para-i<n
3.2.1
para
(Dependente do compilador ...)
3.2.2.
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.1fonte
fonte