単線電卓、アート、またはその逆?

入門



仕事を探しているときによくあることですが、面接を次々と受けます。 どこかであなたが選ばれ、どこかであなたが。 そして、おそらく、私たち一人一人の生活の中で興味深いインタビューがありましたが、それを喜んで一般に伝えることができます。 感情、パニック、思考の流れ、ひらめきの場所があるような、そのような物語についてお話したいと思います。 この記事では、応募者の内部的な経験、インタビュアーとの対決、興味深い脳の爆発的なJavaコード、および「珍しいコードは芸術ですか、それとも悪ですか?」という質問への回答に焦点を当てます。 。 あなたは過去に飛び込み、あなたの脳を伸ばすことができます。 興味をそそられたら、行きましょう。



一人の男Xの物語



2008年に、Xという名前の男がプログラマーとしての仕事を探していました。 彼は発達の経験がありましたが、彼らが腕と足で引き裂くときはそうではありませんでした。 したがって、彼はすべての空席に気を取られ、すべての電話に答えました。 それで、X'aは真面目な会社に招待され、2回のインタビューを受けただけでした。 1つは、いつものように、人事部の女の子と一緒ですが、それは邪魔になりませんでした。2つ目は、技術的、刺激的、不安、未知の心です。 時が来ましたX-インタビュー。 受け入れられた握手の後、Yという名前の若い男性、インタビュアー、真のプログラマー-横向きの髪型、ジーンズは横たわり、彼は今とても忙しいと言いました。 まあ、あなたが来たので、それで、私はあなたにかわいいラップトップとパズルを与えます- '私に電卓を書いて​​ください。 カウントが必要な記号「+」、「-」、「*」、「/」で区切られた2つの数字で構成される式がプログラムに入力されると、単純な計算機がプログラムに入力されます。 1時間半あります。」 。 そしてその瞬間、何か重要なことが起こりました- 「私を驚かせてください!」 彼はadded慢に加えて去った。 この秒で、男Xはネガティブな感情の突風に圧倒されました- 'うん、schA。 AKS 74、5.45を受け取り、レジンカを踊らせてナデジダバブキナを歌わせます-「Am I Blame」。 不思議なことに、好きなだけ踊ってください...」



しかし、常識に道を譲るための感情と感情。 無礼は議論ではありません。 プロセスが始まり、考えが沸騰し始めました:calc.exeが発生したり、OOPがねじ込まれたり、すばらしい式パーサーを作成したりする可能性があります。 しかし、ありません。 わずか1時間半。 それだけでタスクを実行できますか? どうする パスが選択されました- 'できる限りセミコロンを使用します。 ああ、そして生産、ああ、そしてインタビュー。 約20分後、Xの顔に笑顔が現れました。 彼は夜明けした! しかし、コードに1行しか含まれない計算機を作成した場合、つまり パッケージとインポートをカウントしないセミコロンは1つだけですか? すぐに言ってやった。 2時間目の終わりには、決定の準備が整いました。 2時間 疲れて少し混乱していたYが来ました。 彼はX'aに尋ねた。 「完了!」 -彼は答えた。



興味深い、ブレインストーミングのJavaコード



読者の皆さん、時が来ました。あなたと私は、Xの問題を解決しようとします。 より正確なタスクのステートメントを次に示します。正確に1行のコードを含み、2つの数値を加算、減算、乗算、除算できる単純な式の計算機を作成する必要があります。 1行-パッケージとインポートの宣言を除く、正確に1つのセミコロンを意味します。 ソリューションに使用できるのはjdkのクラスのみです。 式「7 + 4」、「-12.0 * 14.12」の例で、括弧やトリックはありません。 ソリューションは、結果をコンソールに表示する1つの静的メソッドで発行する必要があります。 メイン関数に触れないでください-結果を確認するために関数が呼び出されます。 制限付きで、おそらくすべて。 どんなトリックでも大歓迎です。 独創性も。



オプション



Java 7では、これは非常に簡単に行われ、天才である必要はありません。 精度とセキュリティを少し犠牲にします。 クラスを完全に行います。 ネタバレを押す必要はないと考えたいなら。



オプション番号1
package com.calculator; import javax.script.ScriptEngineManager; import java.io.PrintStream; public class Calculator1 { /** *  ,    .   ? * @param expression    */ private static void calc(String expression) { try { System.out.println(new ScriptEngineManager().getEngineByName("JavaScript").eval(expression)); } catch (Exception ex) { try (PrintStream stream = (System.out.append("Nan"))) {} } } public static void main(String[] args) { calc("+5 + -12"); calc("+5 * -12"); calc("+5 - -12"); calc("+5 / -12"); } }
      
      







2008年には、このようなトリックは通過しなかったため、男Xはこの問題を独自の方法で解決しました。 注:コードはまだJava 7に適合していますが、すみません。



オプション番号2
 package com.calculator; import java.io.PrintStream; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Calculator2 { /** * ,          * @param expression    * @param args ,     */ private static void calc(String expression, Object ... args) { try { // 1.   System.out.println( // 2.      BigDecimal.class.getMethod( Arrays.asList("multiply", "add", "subtract", "divide").get( ((args = new Matcher[] { Pattern.compile( // 3.    . ,     <b>  </b>,      . "[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?\\s*([+-\\\\*/])\\s*[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$") .matcher(expression)})) != null && ((Matcher) args[0]).find() ? // 4.     42: '*', 43: '+', 45: '-', 47: '/' -     0, 1, 2, 3 ((int) ((Matcher) args[0]).group(1).charAt(0) - 41) / 2 : -1), // 5.   BigDecimal.class, MathContext.class).invoke( // 6.    new BigDecimal(((args = new Matcher[] { Pattern.compile("([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)").matcher(expression)})) != null && ((Matcher) args[0]).find() ? ((Matcher) args[0]).group(0) : ""), // 7.    new BigDecimal(((args = new Matcher[] { Pattern.compile("[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?\\s*[+-\\\\*/]\\s*([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)$") .matcher(expression)})) != null && ((Matcher) args[0]) .find() ? ((Matcher) args[0]).group(1) : ""), new MathContext(10, RoundingMode.HALF_EVEN))); } catch (Exception ex) { /**        */ try (PrintStream stream = (System.out.append("Nan"))) {} } } public static void main(String[] args) { calc("+5 + -12"); calc("+5 * -12"); calc("+5 - -12"); calc("+5 / -12"); } }
      
      







有名な歌のように:まあ、私が言うことができる、私が言うことができる、それはそのようなjavaに配置され、知りたい、知りたい、何が起こるか知りたい...



しかし、このコードはかさばりすぎて、繰り返しがあります。 しかし、 制限を強化し、三項演算子をまったく使用しないことを要求したらどうなるでしょうか? すぐにではなく、それでも解決策が見つかりました。



オプション番号3
 package com.calculator; import java.io.PrintStream; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Calculator3 { /** * ,   ,    . * @param expression    * @param args ,     */ private static void calc(String expression, Object ... args) { try { // 1.   System.out.println( // 2.      BigDecimal.class.getMethod( Arrays.asList("multiply", "add", "subtract", "divide").get( // 3.      args     (Integer) (args = new Object[] {args = new Object[] { Pattern.compile("([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)\\s*([+-\\\\*/])\\s*([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)$"). matcher(expression)}, args[0], ((Matcher) args[0]).find(), ((Matcher) args[0]).group(1), ((int) ((Matcher) args[0]).group(2).charAt(0) -41) / 2, ((Matcher) args[0]).group(3)})[4]), // 4.   BigDecimal.class, MathContext.class).invoke( // 5.    new BigDecimal(args[3].toString()), // 6.    new BigDecimal(args[5].toString()), new MathContext(10, RoundingMode.HALF_EVEN))); } catch (Exception ex) { /**        */ try (PrintStream stream = (System.out.append("Nan"))) {} } } public static void main(String[] args) { calc("+5 + -12"); calc("+5 * -12"); calc("+5 - -12"); calc("+5 / -12"); } }
      
      







非常に短く、繰り返しはありませんが、脳は爆発しようとしています。 さらにいくつかの解決策があると思います。



おもしろいのですが、scala、kotlin、c#または...で自分の考えを表現している人たちは、これらの制限が、仮にあるとしても適切であるとしたらどう思いますか?



おわりに



親愛なる読者、あなたの注意と忍耐に感謝します。 約束どおり、 「変わったコードは芸術ですか、それとも悪ですか?」という質問に答えます。「実験者の目を通して-芸術、生産の目を通して-悪 」。 しかし、このようなコードをどのように呼び出しても、試してみてください。 また、何か問題が発生した場合は、選択したプレゼンテーションスタイルについてhabrahabrの居住者に謝罪したいと思います。 これは私の側の実験的なアプローチです。理解してくれてありがとう。



All Articles