4つの距離


13

この挑戦はこのビデオに基づいています。この挑戦を試みる前にそれを見ることをお勧めします。

最初に関数を定義します。この関数(OEIS)は、整数nを入力として受け取り、nの英語表現(スペースまたはハイフンなし)で文字数を出力します。たとえば、「3」は5文字なので、3は5にマップされます。

このプロセスを繰り返す任意の数で始まるビデオで示されているように、最終的には4になり、それは永久にマップされます。

以下は、16より小さい数の軌道を示す大まかな有向グラフです。

  12 11
    \|      
15 2 6 1 10 14 13
  \ \|/ /  /  /
   7 3-/  8--/
    \|   /
 9 0 5--/
  \ \|
   \-4

あなたの課題は、4に達する前に数値がとるステップの数(またはこの関数を数値に適用する必要がある回数)を決定することです(つまり、グラフの有向グラフのレベル)。

英語の数字の形成

このチャレンジのために英語の単語をどのように形成するかについての簡単な説明を次に示します。

1から19までの数字は次のとおりです。

1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19

19を超える数の場合、プロセスは次のとおりです。

数が数百位の場合、数百位の数字の名前で始まり、「百」。

例えば

100 -> "onehundred"

剰余が20未満の場合、剰余の英語表記を追加します。

例えば

714 -> "sevenhundredfourteen"

それ以外の場合、10桁がゼロでない場合は、適切な表現を追加します。

2-> twenty
3-> thirty
4-> forty
5-> fifty
6-> sixty
7-> seventy
8-> eighty
9-> ninety

例えば

470 -> "fourhundredseventy"

最後に、数字がある場合、その表現を追加します

例えば

681 -> "sixhundredeightyone"

さらなる規定

  • 100を超える数については、文字数を数えるときに「and」を省く必要があります。たとえば、577は23文字の「fivehundredseventyseven」です。

  • プログラムは、標準メソッドを介した入力として、0より大きく1,000より小さい整数をすべて受け入れる必要があります。

  • プログラムは、標準出力メソッドに必要なステップ数を出力する必要があります。

  • これはcodegolfであるため、バイト数が最も少ないソリューションが優先されます。

テストケース

1 -> 3
4 -> 0
7 -> 2
23 -> 5
577 -> 6
600 -> 4 

1
関連これはだましだと思ったが、見つけられない。
ジェームズ

「and」はどうなりましたか?むしろ、なぜ除外するのですか?!
ジョナサンアラン

@JonathanAllan cuz 'Murica
LegionMammal978

回答:


5

JavaScript(ES6)、106バイト

f=(n,a="03354435543668877998")=>n-4&&1+f(7*(n>99)-(-a[n/100|0]-(a[n%=100]||a[n%10])-"0066555766"[n/10|0]))

数値変換のオーバーヘッドにもかかわらず、文字列は長さをエンコードする最適な方法のようです。


まあ、それはほぼ正確に私の(ほぼ投稿された)回答が11バイト短くなったように見えたものです。
ETHproductions

@ETHproductions良いことは、それを投稿する前に16バイトのゴルフをしたことです!
ニール

2

Python、num2words、97 113 115 94 93 92バイト

+16バイト(num2wordsが適用するハイフネーションを忘れており、実際には各テストケースの結果を変更しませんが23577それぞれにハイフン
が含まれます)+2バイト(f=再帰的であるにもかかわらず含めるのを忘れました)
-20バイト(使用re
-8バイト@Wheatウィザードのおかげで(使用~、置き換えn!=4n-4、そして... 1行のインポート> _ <)
-1 @Cyoceにバイトのおかげで(宇宙から4 and

import re,num2words as w
f=lambda n:n-4and-~f(len(re.sub('\W|and','',w.num2words(n))))

ステップ数をカウントアップするだけです。巨大で負の整数にも機能します(\W num2wordsの結果でスペース、コンマ、ハイフンを見つけます):

>>> for test in (1,4,7,23,577,600,-1*2**96,3**96):
...     print('test: {0}  ->  {1}'.format(test, f(test)))
...
test: 1  ->  3
test: 4  ->  0
test: 7  ->  2
test: 23  ->  5
test: 577  ->  6
test: 600  ->  4
test: -79228162514264337593543950336  ->  4
test: 6362685441135942358474828762538534230890216321  ->  5

最後のケースは次のとおりです。

sixquattuordecillionthreehundredsixtytwotredecillionsixhundredeightyfiveduodecillionfourhundredfortyoneundecilliononehundredthirtyfivedecillionninehundredfortytwononillionthreehundredfiftyeightoctillionfourhundredseventyfourseptillioneighthundredtwentyeightsextillionsevenhundredsixtytwoquintillionfivehundredthirtyeightquadrillionfivehundredthirtyfourtrilliontwohundredthirtybillioneighthundredninetymilliontwohundredsixteenthousthreehundredtwentyone
fourhundredfiftyone
nineteen
eight
five

1
f=ラムダ関数の前に必要はありません
ポストロックガーフハンター

1
import re,num2words as r2つの異なるステートメントの代わりに試してください。
ポストロックガーフハンター

1
n-4と同じことですn!=4
ポストロックガーフハンター

1
@WheatWizard num2wordswreまだですre-モジュールと関数の両方が呼び出されることに注意してくださいnum2words
ジョナサンアラン

1
最後の1つは、1バイトを節約するためにand 1+置き換えることができand-~ます
ポストロックガーフハンター


1

Mathematica、89バイト

Length@FixedPointList[StringLength@StringReplace[IntegerName@#,{" "->"","-"->""}]&,#]-2&

典型的なMathematica:組み込み関数は良いが、長い関数名は悪い。 FixedPointList答えが変わらない限り、最初の引数(関数)を2番目の引数に繰り返し適用し、すべての結果をリストします。結果には、元の入力と繰り返し出力の2つのコピーが含まれるため-2、最後になります。Mathematicaの組み込みIntegerNameはスペースとハイフンが含まれているので、それらを手動で取り除く必要があります。

面倒なことに、IntegerNameの出力には通常のハイフンではなく文字「-」(Unicode#8208)が含まれています。そのため、この送信は88バイトではなく89バイトです(そして、上記のコードの前に4つのスペース置き、Unicode文字を受け入れることはできませんでした。 )


1

Python 2.7、344 216 208バイト:

x=`input()`;c=0;y=lambda v:dict(zip(range(0,10),[0]+v));l=[3,3,5,4,4,3,5,5,4];d=y(l);e=y([3,6,6,6,5,5,7,7,6]);f=y([i+7for i in l])
while x!='4':x=`sum([q[int(r)]for q,r in zip([d,e,f],x[::-1])])`;c+=1
print c

他のPython回答とは異なり、外部ライブラリを使用しません。入力をstdin受け取り、に出力しstdoutます。

すべてのテストケースでRepl.it!

説明

最初に、3つの辞書を作成します。各辞書は、それぞれの数字の英語の単語表現の長さを、それぞれ1、10、100桁の閉区間[1,9]で表す数字とペアにします。例えば、辞書の最初のエントリがdされる1:3ように1綴られているone英語とあり3手紙を。

次に、文字列入力の各数字の場所がx対応する辞書に割り当てられ、その後、各場所の各数字が対応する辞書の値と照合されます。たとえば、入力番号がであったとします2320十の位では、辞書とペアになりe、それがと一致している、63一の位では、辞書とペアになりd、それがと一致しています、5。これらの一致した数字はx、文字列として割り当てられている数値の英語表現の長さを表すために合計されx!='4'、さらに、whileループが続く増分c1毎回、これまでに実行されたステップの数を表します。したがって、23に対応する総工程。11、これは順番に対応し、6どちら35なり、最後に4になります。5

最後に、ループが終了cするstdoutと、「4からの距離」を表すために出力されます5。この場合、これはになります。


1

Java、 556 295バイト

261バイトを節約してくれた@KevinCruijssenに感謝

  void int(n) {int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,9,8,6,9,9,11,10,6,6,5,5,7,7,6};int c=0,t=(int)Math.pow(10,(int)Math.log10(n)),v=1;while(n>0){if(n/100>0)c+=(s[n/100]+7);else {if(n>0&n<25){c+=s[n];break;}else{c+=s[(n/10)+22];}}n=n%t;t=t/10;}while(c!=4){v++;c=s[c];}System.out.print(v);}


ゴルフをしていない:

  void int(n) {

    int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,9,8,6,9,9,11,10,6,6,5,5,7,7,6};
     int c=0,t=(int)Math.pow(10,(int)Math.log10(n)),v=1;
         while(n>0){
            if(n/100>0)
                c+=(s[n/100]+7);
            else {if(n>0&n<25){
                c+=s[n];
            break;
            }
            else{
                c+=s[(n/10)+22];

            }
            }
            n=n%t;
            t=t/10;
        }

        while(c!=4)
        {
            v++;
        c=s[c];
        }
System.out.print(v);
}

ので、私は、あなたがあなたのコードに誤りがあると思うs++文字列のアレイ上不可能です..:S
ケビンCruijssen

@KevinCruijssen S(counter)をINTとして宣言し、STRINGも... javaが自動的にINTであると判断します。
ナンバーノット

まあ、私はideoneでコードや私のEclipse IDEを実行する場合は2を持っているので、それが失敗したs...ところで、あなたはこのような非常に大きい量によってゴルフあなたのコードをすることができます:int c(int n){int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8,6,9,9,11,10,6,5,5,5,7,6,6},c=0,t=(int)Math.pow(10,(int)Math.log10(n)),x=1;while(n>0)if(n/100>0)c+=s[n/100]+7;else{if(n>0&n<25){c+=s[n];break;}else c+=s[(n/10)+22];}n%=t;t/=10;}for(;c!=4;x++,c=s[c]);return x;}
ケビンCruijssen

私はショックを受けています...私のコードに何が起こるのか、@ KevinCruijssenに感謝します。そして私はそれを修正しています...ありがとう
ナンバーノット

Np :) if-elseを使わずに何らかの形でゴルフをするかもしれないと思います(しかし、私はそれを他の人に任せます)私から。
ケビンCruijssen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.