1. ホーム
  2. language-agnostic

[解決済み] コードゴルフ:フォー・イズ・マジック

2023-04-22 16:59:34

質問

パズル

高校時代に聞いた小さなパズルは、こんな感じでした...。

  • 質問者が「番号を教えてください」と言うのです。
  • 数字を聞くと、質問者はその数字に何かしらの変換を繰り返し行う(たとえば 10は3である と言うかもしれません)、最終的に4という数字にたどり着きます。 4 はマジック ).
  • どんな数でも、最終的には4に変換できるようです。

目標は、変換関数を解明し、このパズルを自分で確実にプロトタイプ化できるようにすることでした。

解答

任意のステップにおける変換関数は

  • 問題の数字を取る。
  • ハイフンやスペース、"and" を無視して、その英語の単語表現の文字数を数えます (たとえば、"ten" には 3 文字、"therfour" には 10 文字、"one hundred fourthree" には 20 文字が入っています)。
  • その文字数を返します。

私がこれまでテストしようとしたすべての数について、これは4に収束します。 4は4文字でもあるので、ここで無限ループが発生することになりますが、代わりに単に マジック と呼ばれるだけです。

課題

あなたの課題は、ユーザーから数字を読み取り、quot;4 is magic" が到達するまで繰り返し適用される変換関数を示す行を印刷するコードの一部を作成することです。

具体的には

  1. 解答は、それ自体が完全なプログラムでなければなりません。単に数字を入力する関数であってはならない。
  2. 入力は標準入力から読み込まなければなりません。("echo" からのパイピングや入力リダイレクトの使用は、それも標準入力からなので問題ありません)
  3. 入力は数値形式であること。
  4. 変換関数を適用するごとに、一行が出力されなければならない。 a is b. ここで、a と b は変換の数値の形式です。
  5. フルストップ(ピリオド)は必須です。
  6. 最後の行は当然こう言うべきです。 4 is magic. .
  7. のすべての数字に対して正しい出力を生成する必要があります。 0 から 99 .

例です。

> 4
4 is magic.

> 12
12 is 6.
6 is 3.
3 is 5.
5 is 4.
4 is magic.

> 42
42 is 8.
8 is 5.
5 is 4.
4 is magic.

> 0
0 is 4.
4 is magic.

> 99
99 is 10.
10 is 3.
3 is 5.
5 is 4.
4 is magic.

優勝は ソースコードの文字数で最も短い投稿 で、これも 正しい .

ボーナス

変換関数を適用するたびに、数値の ENGLISH NAME を出力するバージョンのコードを書いてみることもできます。元の入力はまだ数値ですが、出力行は数値の単語形式を持つはずです。

(あなたのコードで図形を描画するためのダブルボーナス)

(編集) いくつかの明確化。

  1. 私は単語がすべての適用可能なケースで両面に表示されることを望みます、例えば Nine is four. Four is magic.
  2. 大文字と小文字は関係ない。あと、単語トークンの区切り方は気にしない、区切るべきだけどね。 ninety-nine は大丈夫です。 ninety nine は大丈夫です。 ninetynine は大丈夫ではありません。

チャレンジに関して、これらはボーナスコンペの別カテゴリーとして考えていますので、これを狙うなら、コードが数字バージョンより長くなっても気にしないでください。

各バージョンの解答を1つずつ自由に投稿してください。

どのように解決するのですか?

ゴルフスクリプト 101 96 93 92 91 90 94 86バイト

90 → 94 : 10の倍数の出力を修正しました。

94 → 86 : コードの再構築。base 100 を使用して、印字不可能な文字を削除しています。

86 → 85 : 文字列へのキャストを短縮。

{n+~."+#,#6$DWOXB79Bd")base`1/10/~{~2${~1$+}%(;+~}%++=" is "\".
"1$4$4-}do;;;"magic."