数字の簡素化


15

どうして、テレビ画面に1秒間表示された6桁または7桁の電話番号を思い出せないのですか?!以下に説明する特別なテクニックを使用すると、ウォーキング電話帳になります!

明らかに、数字402110010010数字337377よりも覚えやすく、数字は数字よりも覚えやすい957472です。これは、記憶された番号は、一方ではできるだけ少ない数字を含む必要があることを意味し、他方では、できるだけ多くの繰り返し番号を含むことが望ましいことを意味します。

記憶の困難さの基準として、numberの桁数とnumberの異なる桁数の合計を取ります。記憶された番号は別の番号システムで書くことができ、おそらく覚えやすくなります。たとえば65535、16進表記の数字は次のようになりFFFFます。

仕事

複雑さの基準を最小限に抑えるために、数値システムのベースを選択するプログラムを作成する必要があります。番号体系の基数は2〜36の範囲で選択する必要があり、その後、数字0-9と英字A-Zを使用して数値を表すことができます。

入力

入力には、1〜999999999の10進整数が含まれます。

出力

出力には、番号体系の基数(2〜36)が含まれている必要があります。これにより、記憶の複雑さの基準と、選択した番号体系の番号が1つのスペースで区切られます。複数のベースが基準に同じ値を与える場合、それらの中から最小のものを選択します。

ノート

  • 文字は大文字でなければなりません(A-Z)。

テストケース

入出力

1              2 1

2              3 2

65535       16 FFFF

123          12 A3


16
大きな挑戦ですが、より多くのテストケースが必要です。
グリムミー

7
また、出力形式が少し厳しすぎます。たとえば、ベースと文字列の2つの要素の配列を許可したり、逆の順序で許可したり、別の文字で区切ったりできます。また、桁数に桁数の合計を追加すると仮定しますが、それを明確にすることもできます。
エリックアウトゴルファー

8
a-z代わりに使用できますA-Zか?
ニール

5
代わりに対応する番号を使用できますA-Zか?
-flawr

8
@VerNick次回同様のチャレンジを書くときは、これらのリクエストの両方を許可することをお勧めします。なぜなら、これらは単に不必要な複雑さであるためです。たとえば、こちらを参照してください。
flawr

回答:


5

Python 2150の 149 127 144バイト

lambda n:min((len(c(n,b))+len(set(c(n,b))),b,c(n,b))for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n/b,b,chr(n%b+48+7*(n%b>9))+s)or s or'0'

オンラインでお試しください!


Python 3、136バイト

lambda n:min((len((*c(n,b),*{*c(n,b)})),b,c(n,b))for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n//b,b,chr(n%b+48+7*(n%b>9))+s)or s

オンラインでお試しください!


Python 3.8(プレリリース)、131バイト

lambda n:min((len((*(x:=c(n,b)),*{*x})),b,x)for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n//b,b,chr(n%b+48+7*(n%b>9))+s)or s

オンラインでお試しください!


c 基数10の数値を任意の基数(2〜36)に変換し、最初の(匿名)関数が最小の結果を見つけます。


5

05AB1E 16 14バイト

-1バイト、Kevin Cruijssenに感謝

₆LBāøΣнDÙìg}1è

オンラインでお試しください!

または、最後にR)»を追加しますにして、指定された出力形式に正確に適合させますが、他のほとんどの答えは気にしませんでした。

説明:

₆L          # range 1..36
  B         # convert the input to each of those bases
   āø       # enumerate (pair each element with its 1-based index)
Σ     }     # sort by
     g      # length
 н          # of the first element
    ì       # concatenated to
  DÙ        # itself, uniquified
1è          # take the second entry (first will always be base 1)

1
-1バイトの₆L©B®ø代わりに使用して₆LεBy‚}
ケビンCruijssen

1
@KevinCruijssenありがとう!を使用して別の-1を使用するとā、常にそのことを忘れているように見えます。
グリムミー

笑、私は確かに..私はそれを覚えていない、この課題に、笑xDさん、それはどのような方法で役立っていないことを、今日は早く
ケビンCruijssen

@再帰あなたは答えを読んでいないようです。厳密な出力要件に準拠するバージョンをリンクし、なぜそれをメインバージョンにしないのかを説明します。
グリムミー

@Grimyは有罪です。お邪魔して申し訳ありません。
再帰的



4

JAPT v2.0a0 -gS24の 23バイト

きれいではありませんが、それは仕事をします。出力が大文字であるというまったく不要な要件のために+2バイト。

37o2@sX u ¸iXÃñÈÌiXÌâ)l

それを試してみてください

37o2@sX u ¸iXÃñÈÌiXÌâ)l     :Implicit input of integer
37o2                        :Range [2,37)
    @                       :Map each X
     sX                     :  Convert the input to a base-X string
        u                   :  Uppercase
          ¸                 :  Split on spaces (there are none, so this returns a singleton array)
           iX               :  Prepend X
             Ã              :End map
              ñ             :Sort by
               È            :Pass each X through the following function
                Ì           :  Last element of X
                 i          :  Prepend
                  XÌâ       :    Last element of X, deduplicated
                     )      :  End prepend
                      l     :  Length
                            :Implicit output of the first sub-array, joined with spaces

はい、うまくいきますが、文字は大文字でなければなりません。
Ver NickがReinstate Monicaによると、

1
@VerNick、なぜ?それは挑戦に絶対に何も追加しません。
シャギー

...次は「1つのスペースで区切られる」と思います。出力形式はこの課題に対して非常に厳格にされており、コメントからは変更されるようには見えません。
ジョナサンアラン

@JonathanAllan、幸運なことに、フラグを変更することでその1つを「修正」できます。
シャギー

3

PHP124 119バイト

for($i=36;$b=strtoupper(base_convert($argn,10,--$i));$o[strlen($b.count_chars($b,3))]="$i $b");krsort($o);echo end($o);

オンラインでお試しください!

出力を大文字にするためのPHP の+12バイトについての残念...しかし...とにかく。


3

Zsh、85バイト

for b ({36..2})x=$[[#$b]$1]&&x=${x#*\#}&&a[$#x+${#${(us::)x}}]=$b\ $x
a=($a)
<<<$a[1]

forループ内のこの数のステートメントでは、using ...&&...&&...はより短いです{...;...;...;}

for b ({36..2})                   # order decreasing: smaller bases overwrite larger ones
    x=$[[#$b]$1] && \             # set x to [base]#[num] 
    x=${x#*\#} && \               # strip leading [base]#
    a[$#x+${#${(us::)x}}]=$b\ $x  # use score as index to store "[base] [number]"
#            ${(us::) }           # (s::)plit into characters, take (u)nique
a=($a)                            # remove empty elements from array
<<<$a[1]                          # print out the first element (smallest score)

オンラインでお試しください!

[base]#[num]代わりにフォームで印刷する81バイトのソリューションを次に示します。

for b ({36..2})x=$[[#$b]$1]&&y=${x#*\#}&&a[$#y+${#${(us::)y}}]=$x
a=($a)
<<<$a[1]

オンラインでお試しください!



2

、38バイト

Nθ≔EE³⁴↨θ⁺²ιL⁺ιΦι⁼λ⌕ικη≔⁺²⌕η⌊ηηIη ↥⍘θη

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Nθ

整数を入力します。

≔EE³⁴↨θ⁺²ι

基数2から基数36に変換します...

L⁺ιΦι⁼λ⌕ικη

...重複排除、連結、および長さの取得。

≔⁺²⌕η⌊ηη

最小の複雑さのインデックスを取得し、2を追加してベースを取得します。

Iη ↥⍘θη

ベースとそのベースに変換された整数を大文字で出力します。



2

ゼリー、25バイト

bⱮ36µQL+LN)Mḟ1Ḣ,ị‘ịØBʋ¥⁸K

オンラインでお試しください!

引数として整数を取り、目的の形式のJelly文字列を返すモナドリンク。2項目のリストが許容可能な出力である場合(ほとんどの課題により)、2バイトを節約できます。入力として1のエッジケースで基数1が許容される場合、さらに2バイトを節約できます。






1

Wolfram言語(Mathematica)109111バイト

Print[a=OrderingBy[#~IntegerDigits~Range@36,Tr[1^#]+Tr[1^Union@#]&,1][[1]]," ",ToUpperCase[#~IntegerString~a]]&

+2:修正されました。キャッチ@Romanをありがとう

OrderingBy Mathematica 12.0で導入されましたが、TIOはまだ更新されていないようです。


「複数のベースが基準に同じ値を与える場合、それらの中から最小のものを選択します。」:OrderingByこの要件に適合しません。
ローマン

たぶんMinimalByこのような
ローマの

@ローマはそうではありませんか?私が知る限り、同じ値を持つ2つのインデックスの相対的な順序を保持します
。– attinat

2
引数を使用すると、必要な123ソリューションの36 3F代わりにソリューションが印刷され12 A3ます。OrderingBy[123~IntegerDigits~Range@36, Tr[1^#] + Tr[1^Union@#] &]私は答えを得る{36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 6, 5, 11, 10, 9, 8, 7, 4, 3, 2, 1}、ようなし再発注同等のエントリの通常の仮定はここでは無視しているようです。私$Versionは「12.0.0 for Mac OS X x86(64-bit)(April 7、2019)」です。
ローマの

ああ、あなたは正しい。それに気付かないのは悪い。
-attinat

1

C(clang)、165バイト

n,i=2,j,p=99,r,m,x;char*g,*_,b[74][37];t(n){for(;g=b[i],i<37;r=j<p?_=g,p=j,i:r,++i)for(j=0,m=n;m;m/=i,*--g=x+=x>9?87:48)j+=b[i+36][x=m%i]++?1:2;printf("%i,%s",r,_);}

オンラインでお試しください!

n //入力

、i = 2 //基数2から36までの反復子

、j //現在の複雑さ

、p = 99 //最高の複雑さ

、r // result =イテレータ

、m // nの一時コピー

、x; // m%i

char * g //現在の文字列ptr

、* _ //ベストstr ptr

、b [74] [37]; // buffer

/ * [37 + 37] = [取得された文字列+使用されている文字のテスト] * /

t(n){

for(; g = b [i]、// ptrを移動

   i<37 ; 
   r=j<p?_=g,p=j,i:r, // save best solution

   ++i){//for every base

for(j = 0、m = n; m; m / = i、//数字を抽出

   *--g=x+=x>9?87:48)
   // move ptr backward for printf use and transform to ascii value

j + = b [i + 36] [x = m%i] ++?1:2; //文字に対してバイトをインクリメントします

//そして、0だった場合、jを2ずつインクリメントします:使用される新しい文字に対して1、桁数に1

//それ以外の場合は、桁数のみ増加+ポインターを移動

// printf( "%s-"、g); //テスト

// printf( "r%ip%ij%i \ n"、r、p、j); //テスト

}

printf( "%i、%s"、r、_); // output

}


1
163バイトは複数回呼び出すことができます。
ceilingcat

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.