To trzecia część mojej serii łamigłówek C / C ++; jeśli przegapiłeś pierwsze 2, są tutaj: (1) Programowanie puzzli m3ph1st0s 1 (C ++) (2) Programowanie puzzli m3ph1st0s 2 (C ++): „Zadzwoń mocno!”
Muszę powiedzieć, że moje puzzle są w 100% oryginalne. Jeśli nie, zawsze to stwierdzę w tekście. Moja trzecia łamigłówka składa się z 2 części:
Puzzle 3.1
Ta część (3.1) nie jest moją oryginalną łamigłówką, została zebrana z jakiejś strony internetowej, którą czytałem jakiś czas temu. Używam go tutaj jako punktu wyjścia i rozgrzewki dla ciebie. Rozwiąż ten problem, a następnie przejdź do drugiej części.
Ktoś próbował wydrukować znak „+” 20 razy i wymyślił następujący program:
#include <stdio.h>
int main() {
int i;
int n = 20;
for( i = 0; i < n; i-- )
printf("+");
return 0;
}
Fakt, że nie przyniósł oczekiwanego rezultatu, jest oczywisty - program nigdy się nie kończy. Napraw to! Łatwy? Teraz napraw program, zmieniając TYLKO JEDEN ZNAK - oczywiście spacja! Dla tego wyzwania istnieją 3 rozwiązania. Znajdź wszystkie 3 z nich. Żeby było jasne: program musi wygenerować 20 znaków „+” i musi zakończyć się szybko. Zanim skrytykuję mnie, co oznacza „szybki”, powiem, że oznacza to najwyżej kilka sekund (co, nawiasem mówiąc, to za dużo, ale po prostu, żeby było jasne).
Puzzle 3.2
ZMIENIONO Wskazano mi wcześniej, że rozwiązanie łamigłówki 3.2.2 może zależeć od kompilatora. Aby wyeliminować wszelkie możliwe dyskusje na ten temat, zmodyfikuję ten pomysł i poprawię go na następnej łamigłówce, kiedy dołożę wszelkich starań, aby nie wywoływać kontrowersji. Jednak, aby utrzymać tę łamigłówkę, zrobię małą modyfikację do 3.2.2 (rozwiązanie będzie łatwiejsze, ale czystsze).
Kiedy po raz pierwszy zobaczyłem układankę, okazało się, że jest całkiem niesamowita. Udało mi się go rozwiązać, ale nie od razu, ponieważ wymaga to starannej uwagi. Jeśli tu jesteś, oznacza to, że ty też go rozwiązałeś. Jeśli to zrobiłeś, pisząc program, który zastąpi wszystkie możliwe znaki wszystkimi możliwymi wartościami i przetestujesz każde rozwiązanie, jesteś zgubiony. Ale ciężko pracujący facet. Po poprawieniu programu, który zapisuje 20 znaków „+”:
3.2.1: Wstaw jedną pojedynczą literę i nic więcej do kodu, aby wynik był prawidłowy i wyświetlał to samo we wszystkich 3 poprawionych programach. Nie trzeba dodawać, że list musi znajdować się przed załącznikiem} main (mówię to, ponieważ nie chcę słyszeć ludzi, którzy po prostu napisali list po programie i jakoś ich kompilator był bardzo przyjazny).
EDYTOWANE (patrz poniżej) - w przypadku tych ostatnich pytań należy wziąć pod uwagę, że licznik i zaczyna się od -1 zamiast 0.
3.2.1.5: Powtórz wszystkie poprzednie problemy z warunkiem, że wyjście ma co najmniej 19 znaków „+” (ale nadal jest wyjściem skończonym). Zmiana spacji jest dozwolona. Teraz mogłeś znaleźć więcej rozwiązań niż w pierwszym przypadku. Niektóre z nich z pewnością będą pasować do pytania 3.2.2.
3.2.2: Wybierz inną wartość, aby zainicjować zmienną n, tak aby wynikowy wynik pozostał taki sam dla co najmniej jednego poprawionego programu w 3.2.1.5 (niekoniecznie dla wszystkich).
OSTATNIA EDYCJA 1 : zmiana programu tak, aby wyświetlał 21 znaków „+”, jest nadal dobrym rozwiązaniem, ponieważ oryginalny tekst nie zawierał „dokładnie” 20 znaków. Jednak nieskończona moc wyjściowa jest zabroniona. Oczywiście nie oznacza to, że zacznijmy wypisywać setki znaków „+”, ponieważ nie jest to zabronione. Ale wyeliminowanie pięknego wyniku 21 nie byłoby w duchu tej konkurencji.
LAST EDIT2 : biorąc pod uwagę LAST EDIT1 i zaakceptowanie zmiany przestrzeni wydaje się, że teraz mamy 5 możliwych rozwiązań, z których cztery zostały już wskazane w odpowiedziach. Ostatnie wyzwanie nie zostało jednak dotknięte i muszę jeszcze raz wyjaśnić: n należy przypisać inną wartość , rozwiązania, które przypisują 20 do n przez niektóre lewy, nie zrobią tego (np. N = 20L). Wolę też zobaczyć trzecie rozwiązanie, które nie zmienia spacji.
LAST EDIT3 : Zredagowałem ostatnie pytania, proszę przeczytać!
Wyzwanie polega na rozwiązaniu obu części układanki. Wygrywa ten, kto pierwszy to zrobi.
Mam nadzieję, że wszystko będzie jasne, jeśli nie, proszę o zadawanie pytań, a ja dokonam edycji tak szybko, jak to możliwe. Twoje zdrowie. podkreślony tekst
źródło
Odpowiedzi:
3.1
Każda z tych zmian spowoduje, że program wyświetli znaki 20 '+'. Ten jest blisko:
Wyprowadza znaki 21 '+'.
3.2.1
Znalazłem co najmniej 112 sposobów rozwiązania tego problemu, wstawiając jedną literę. Nie wszystkie z nich mogą działać na wszystkich kompilatorach.
W przypadku dwóch ostatnich podstaw dowolną literę,
x
aby uzyskać 104 możliwe rozwiązania. Użycie jednego z dwóch ostatnich wierszy zmieni dane wyjściowe, ale dane wyjściowe pozostaną takie same dla wszystkich 3 poprawionych programów.3.2.2
Wymyśliłem tylko kilka rzeczy, które wracają do liczby 20 po przypisaniu do
int
.źródło
f
id
przyrostków dlaint
typów (dobrze,d
dla dowolnego typu dla tej sprawy), ale istnieje kilka innych już zostało przerwane:int n = 20l
,int n = 20U
, iint n = 20u
. Również nie wierzę, żeuint
jest standardowym identyfikatorem typu w C lub C ++. Jakiego kompilatora i tak używasz?3.1
Jeszcze jedna łamigłówka. Ale normalne rozwiązania są nudne, a może coś wyjątkowego?
Rozwiązanie pierwsze:
Postanowiłem zmienić TYLKO JEDEN CHARAKTER, czyli
-
. Żadne postacie inne niż-
zostały zmienione.Rozwiązanie drugie:
Zmienia to dokładnie jeden znak - średnik po
int i
na=printf("++++++++++++++++++++");exit(0);
.Rozwiązanie trzecie:
Spowoduje to załadowanie
stdix.h
nagłówka systemu. W systemie dołącz ścieżkę wstaw następujący plik o nazwie stdix.h. Musi zawierać następującą zawartość.3.2
Teraz wstaw jedną literę. Dobrze, że to proste, wymienić
int main()
zint main(a)
. Nie jest to zgodne ze standardami, ale kogo to obchodzi?źródło
Puzzle 3.1 Odpowiedzi
i--
nan--
(demo: http://ideone.com/l0Y10 )i < n
nai + n
(demo: http://ideone.com/CAqWO )[SPACE]i < n
na-i < n
. (demo: http://ideone.com/s5Z2r )Puzzle 3.2.1
Zmień
int n = 20
naint n = 20L
(dodajL
do końca).Puzzle 3.2.2
Nie znalazłem jeszcze odpowiedzi ...
źródło
3.1
i--
nan--
i<n
do-i<n
3.2.1
do
(Zależny od kompilatora ...)
3.2.2
drukuje 19 + znaków, tak samo jak z
int n = 20L;
. Jednak nie wymyśliłbym tego, gdybym nie widział innych odpowiedzi do 3.2.1źródło
źródło