パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

ループ、再帰、gotoを使わずに1から100までを印字するC++プログラムは書けますか?」記事へのコメント

  • by Anonymous Coward on 2019年06月18日 13時18分 (#3635528)

    上級がおかしい
    (1-x)^2→(1-x)^-2
    999^-2/1000→1000/999^2
    前者は写し間違いで後者は元が間違ってる。
    ちなみに「そうすると…」の段で1000で割ってる。(1/1000)^0=1だからね。

    上級がやっぱり一番エレガントだとは思う
    C#勢としては初級〜中級と中級〜上級が分かり辛いが、まぁだいたいわかるし常識的な発想だな。
    上級も1/81を知ってれば思いつくかもしれんが、少なくとも自分が問われた時には思い浮かばない答えだ。
    決して難しくはないだけに悔しい感はあるな。こういう答えを思いつきたい。

    • by quaternion (18655) on 2019年06月18日 14時28分 (#3635559) 日記
      ありがとうございます.
      親コメント
    • by Anonymous Coward

      追記:
      他にC++でできそうで中級~上級っぽいもの。

      • インラインアセンブラ(普通だけどぱっと見上級感ある)
      • インラインアセンブラだけど半端な場所にジャンプさせて一見全く別のコードに見せかける(難読化ではたまに見るテクニック。逆アセンブルすれば割と簡単?)
      • コンパイル結果を定数で持っておいてジャンプする(できるの?)。
      • zlibかなんかで圧縮する。libpngとか画像圧縮を介するのも面白いかも。
      • telnetとかで拾う。
      • ちょっとしたインタープリターを作る(ループなしでどうやって?)

      ついでにジャンプは明示的に禁止した方が良いと思う。
      std::make_integer_sequence{}
      とかも便利過ぎてちょっとな。Enumerable.Range()使うようなもんでしょ。
      できて当然。

      • by Anonymous Coward

        追記:もしかして関数ポインタへの加算とか使えばアセンブラなしでループやジャンプを隠蔽できる?と思ったけど関数ポインタへの算術演算は流石に禁止されてた。
        コンパイラによってはオプションで可能らしい。
        エレガントにやれば超上級だと思うな。

    • by Anonymous Coward

      初級がおかしい。

      cout << "1\n"
              "2\n"
              ...
              "100" << endl;

      こうしない理由がないだろ。

    • by Anonymous Coward

      (初級を除けば)上級以外は、結局のところ表現が違うだけで本質的にはループや再起、ジャンプを使用している。
      そういう意味でも上級はポイントが高いと思う。
      大学の教養レベルの数学知識で解けるのもいい。

ソースを見ろ -- ある4桁UID

処理中...