Це третя частина моєї серії загадок C / C ++; якщо ви пропустили перші 2, вони є тут: (1) головоломка програмування m3ph1st0s 1 (C ++) (2) головоломка програмування m3ph1st0s 2 (C ++): "Зателефонуйте важко!"
Треба сказати, що мої головоломки оригінальні на 100%. Якщо ні, то я завжди констатую це в тексті. Моя 3-та головоломка складається з двох частин:
Головоломка 3.1
Ця частина (3.1) не є моєю головоломкою, вона зібрана з якоїсь інтернет-сторінки, яку я читав деякий час тому. Я використовую це як вихідний пункт і розминку для вас. Розв’яжіть це, а потім перейдіть до другої частини.
Хтось намагався роздрукувати знак "+" 20 разів і придумав таку програму:
#include <stdio.h>
int main() {
int i;
int n = 20;
for( i = 0; i < n; i-- )
printf("+");
return 0;
}
Те, що у нього не було очікуваного результату, очевидно - програма ніколи не закінчується. Полагодьте це! Легко? Тепер виправте програму, змінивши ТОЛЬКО ОДИН ХАРАКТЕР - звичайно непробільний символ! Для цього завдання є 3 рішення. Знайдіть усі 3 з них. Просто для того, щоб зрозуміти: програма повинна виводити 20 "+" знаків і повинна швидко закінчуватися. Перш ніж критикувати мене за те, що означає "швидкий", я скажу, що це означає максимум пару секунд (що, до речі, занадто багато, але просто для того, щоб зробити його кришталево чистим).
Головоломка 3.2
ВЕДЕНО Мені раніше вказувалося, що рішення головоломки 3.2.2 може залежати від компілятора. Для того, щоб усунути будь-яку можливу дискусію з цього приводу, я видозмінюю ідею та вдосконалюю її в наступній загадці, коли буду дотримуватися додаткової обережності, щоб не породжувати суперечки. Однак для того, щоб ця головоломка не працювала, я вніс невелику модифікацію для 3.2.2 (рішення буде простішим, але більш чистим).
Коли я вперше побачив головоломку, я вважав її досить приголомшливою. Мені це вдалося вирішити, але не відразу, оскільки це вимагає уважної уваги. Якщо ви тут, це означає, що ви теж вирішили це. Якщо ви зробили це, написавши програму для заміни всіх можливих символів на всі можливі значення та перевірку кожного рішення, ви втрачаєтесь. Хоча працьовитий хлопець. Тепер виправивши програму, яка записує 20 знаків "+":
3.2.1: В коді вставляйте одну літеру і більше нічого, щоб результат був дійсним і виводив те саме в усі 3 виправлені програми. Потрібно сказати, що лист повинен бути перед додаванням} основного (я говорю, що тому, що я не хочу чути людей, які просто клали лист після програми, і їх компілятор якось був дуже привітним).
ЗРЕШЕНО (див. Нижче) - Для цих остаточних питань врахуйте, що лічильник i починається від -1 замість 0.
3.2.1.5: Повторіть усі попередні проблеми з умовою, що вихід має принаймні 19 "+" знаків (але все ж кінцевий вихід). Допускається зміна пробілів. Тепер ви, можливо, знайшли більше рішень, ніж у першому випадку. Деякі з них, безумовно, підійдуть для питання 3.2.2.
3.2.2: Виберіть інше значення для ініціалізації змінної n, щоб результат, що вийшов, залишився однаковим для щонайменше однієї виправленої програми в 3.2.1.5 (не обов'язково для всіх).
ОСТАНА EDIT1 : зміна програми, щоб вона виводила 21 "+" знаків, все ще є хорошим рішенням, оскільки в оригінальному тексті не було сказано "точно" 20 знаків. Однак нескінченний вихід заборонений. Очевидно, це не означає, що давайте всі почнемо виводити сотні знаків "+", оскільки це не заборонено. Але усунення прекрасного 21 результату не було б у дусі цього змагання.
ОСТАНА EDIT2 : з огляду на LAST EDIT1 та прийняття зміни простору, здається, що зараз у нас є 5 можливих рішень, чотири з яких уже вказано у відповідях. Останній виклик, однак, не торкнувся, і я повинен ще раз зрозуміти: n треба присвоїти інше значення , рішення, які присвоюють 20 до n деякими хитрощами, не зроблять це (наприклад, n = 20L). Також я вважаю за краще бачити 3-е рішення, яке не змінює пробіли.
ОСТАНА РЕДАКТ3 : Я редагував останні запитання, будь ласка, прочитайте!
Завдання полягає в тому, щоб вирішити обидві частини головоломки. Перший, хто це зробив, виграє.
Я сподіваюся, що все зрозуміло, якщо не будь-ласка, опублікуйте будь-які питання, і я редагую якнайшвидше. Ура. підкреслений текст