m3ph1st0sのプログラミングパズル3(C):「簡単なバグ」[終了]


11

これは私のシリーズのC / C ++パズルの3番目です。最初の2つを見逃した場合、それらはここにあります:(1)m3ph1st0sのプログラミングパズル1(C ++) (2)m3ph1st0sのプログラミングパズル2(C ++): "Call hard!"

私のパズルは100%オリジナルだと言わなければなりません。そうでない場合、私は常にテキストでそう述べます。私の3番目のパズルには、次の2つの部分があります。

パズル3.1

この部分(3.1)は私のオリジナルのパズルではなく、私が少し前に読んだインターネットのページから集められたものです。ここであなたの出発点とウォームアップとしてそれを使用します。これを解決してから、2番目の部分に進みます。

誰かが「+」記号を20回印刷しようとして、次のプログラムを思いつきました。

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

期待した結果が得られなかったという事実は明らかです-プログラムは終了しません。修理する!簡単?ここで、1文字のみを変更してプログラムを修正します-もちろんスペース以外の文字です!この課題には3つの解決策があります。3つすべてを見つけます。明確にするために、プログラムは20個の「+」記号を出力し、高速で終了する必要があります。「高速」が何を意味するかを批判する前に、それはせいぜい数秒であることを言います(ちなみにそれは多すぎますが、それを明確にするためだけです)。

パズル3.2

EDITED これは、以前の3.2.2パズルのためのソリューションは、コンパイラに依存かもしれないことを私に指摘しました。主題に関する考えられる議論を排除するために、論争を引き起こさないように特別な注意を払うときに、アイデアを修正し、次のパズルでそれを改善します。ただし、このパズルを継続するために、3.2.2を少し修正します(ソリューションは簡単ですが、よりクリーンになります)。

パズルを初めて見たとき、私はそれがかなりすごいと思いました。私は何とかそれを解決しましたが、すぐにではなく、注意を払う必要がありました。あなたがここにいるなら、あなたもそれを解決したことを意味します。すべての可能な文字をすべての可能な値に置き換えて、すべてのソリューションをテストするプログラムを作成してこれを行った場合、あなたは失われます。一生懸命働いています。20個の「+」記号を書き込むプログラムを修正しました。

3.2.1:結果が有効で、修正された3つのプログラムすべてで同じものが出力されるように、コードに1文字だけを挿入します。言うまでもなく、この文字はmainを囲む}の前にある必要があります(プログラムの後に文字を入れただけで、コンパイラが非常に友好的だったのは聞きたくないからです)。

編集(以下を参照)-これらの最後の質問では、カウンターiが0ではなく-1から始まることを考慮してください。

3.2.1.5:出力が少なくとも19個の「+」記号であるという条件で、以前のすべての問題を繰り返します(ただし、出力は有限です)。スペースの変更は許可されています。これで、最初のケースよりも多くの解決策が見つかりました。これらのいくつかは、3.2.2の質問に最も確実に適合します。

3.2.2:別の値を選択して変数nを初期化し、結果の出力が3.2.1.5の少なくとも1つの修正されたプログラムで同じになるようにします(すべてのプログラムである必要はありません)。

LAST EDIT1:元のテキストが「正確に」20個のサインを言わなかったため、21個の「+」サインを出力するようにプログラムを変更することは、依然として良い解決策です。ただし、無限出力は禁止されています。明らかに、これは禁止されていないため、すべてが何百もの「+」記号の出力を開始することを意味するものではありません。しかし、美しい21の出力を排除することは、この競争の精神ではありません。

LAST EDIT2:LAST EDIT1を検討し、スペースの変更受け入れると、5つの可能な解決策があり、そのうち4つが既に回答で指摘されているようです。ただし、最後の課題には触れておらず、もう一度明確にする必要があります。nに別の値を割り当てる必要があります。一部のトリックで20からnを割り当てるソリューションでは実行できません(n = 20Lなど)。また、スペースを変更しない3番目のソリューションを参照することを好みます。

LAST EDIT3:最後の質問を編集しました。読んでください!

課題は、パズルの両方の部分を解決することです。最初にそれが勝ちます。

それがすべて明確であり、質問を投稿しないでください。できるだけ早く編集することを願っています。乾杯。 強調されたテキスト


1つの文字を変更すると、スペースを非スペース文字に変更することを含むと思いますか?もしそうなら、パート1の3つのソリューションすべてを見つけたと思います
。– mellamokb

ああ..申し訳ありません。私はそれを明示的に否定するつもりでしたが、忘れました。今すぐ編集します。尋ねるためのTHX。
ボグダンアレクサンドル

ああ、いいね。現在の3つのソリューションのパート3.2.2の答えが見つからないため...もう1つ探す必要があると思います:)
mellamokb


1
@ardnew:OPが質問の元の意図をかつて変更したとは思わない。最後に大量のEditを追加するよりも、質問を修正するより良い方法があることに同意します...
mellamokb

回答:


8

3.1

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

これらの変更により、プログラムは20個の「+」記号を出力します。これは近いです:

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

21個の「+」記号を出力します。

3.2.1

この問題を解決して、1文字を挿入する方法を少なくとも112個見つけました。すべてがすべてのコンパイラで動作するわけではありません。

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+");

最後の2つについては、x104の可能な解決策を与えるために任意の文字を置き換えます。最後の2行のいずれかを使用すると出力が変更されますが、出力は修正された3つのプログラムすべてに対して同じままです。

3.2.2

私が思いついたのは、への割り当てで20番に戻るものですint

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

うん、あなたは私とまったく同じ答えを持っています(すべてを答えていないので、私は前にそれらを投稿しませんでした)。3.2.2への答えは、私たちのどちらも見つけられなかった(そしてスペースを変更することを許可しないという規則に従っている)3.1に対する3番目の解決策にあると思います。
mellamokb

3.2.1で、私はわからないんだけどfdのための接尾辞int(、うまくタイプdのための任意のそのことについてタイプ)、しかし、あなたがオフに残してきたいくつかの他がありますint n = 20lint n = 20Uint n = 20u。またuint、CまたはC ++の標準型識別子であるとは思わない。とにかくこれらのコンパイラを使用していますか?
ardnew

あなたはここでかなり良い仕事をしましたが、完全ではありません!まず第一に、〜iソリューションはまだ良いです!要件は20の「+」記号を出力することでしたので、21が依然として適切なソリューションです(唯一の悪いソリューションは無限の出力です)。これは、4つのソリューションが見つかったことを意味します!おもしろいことに、まだもう1つあります:) 3.2.2については、nのVALUEを変更する必要があり、20にするためのいくつかのトリックを実行するのではなく、具体的に20 :)
Bogdan Alexandru

1
また、-iと〜iの両方のソリューションはスペースを変更するため、「部分的な」ソリューションと見なします。3番目の完全なソリューションでは、クイズテキストで指定されているとおりにスペース以外の文字を変更する必要があります
Bogdan Alexandru

1
あなたは問題を理解していませんでした。修正により、対応する修正プログラムと同じ出力が生成されると述べました。つまり、修正されたプログラムC1、C2、C3があります。文字挿入後、P1、P2、P3があります。要件は次のとおりです。P1はC1と同じ出力を持ち、P2はC2と同じ出力を持ち、P3はC3と同じ出力を持ちます。同じ出力を持つP1、P2、P3ではない
ボグダンアレクサンドルー

2

3.1

さらに別のパズル。しかし、通常の解決策は退屈です、特別な何かはどうですか?

解決策1:

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

私は1つの文字、つまり--変更された以外の文字はありません。

解決策2:

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

これにより、1文字だけが変更int iされ=printf("++++++++++++++++++++");exit(0);ます-の後のセミコロン。

解決策3:

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

これにより、stdix.hシステムヘッダーがロードされます。システムのインクルードパスで、stdix.hと呼ばれる次のファイルを挿入します。次の内容が含まれている必要があります。

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

3.2

次に、1文字を挿入します。シンプルだまあ、交換してくださいint main()int main(a)。これは規格に従って無効ですが、誰が気にしますか?



0

3.1

  1. 変更i--n--
  2. i<n-i<n
  3. (残念ながら無効な回答は、他の回答が表示される前にコンパイラーで確認していなかったためです)

3.2.1

int n = 20 

uint n = 20

(コンパイラ依存...)

3.2.2

int n =-20L;

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

19 +記号を出力しint n = 20L;ます。しかし、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
プログラムの言語と文字数を回答に追加してください。
ティムテック14

1
@Timtechなぜキャラクターがカウントされるのですか?これはコードゴルフではありません
誇り高いhaskeller 14

1
@Timtechもなぜ言語を含めるのですか?これは言語固有の課題です。
誇りに思ってhaskeller 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.