一番近い悪魔を見せて


42

悪魔の数は、10進表現が6のみで構成される正の整数です。悪魔の数のリストは、6、66、666、6666で始まります。

正の整数を指定すると、最も近い悪魔の数が出力されます。2つある場合は、大きい方を出力します。

テストケース:

n   output
1   6
2   6
3   6
6   6
35  6
36  66
37  66
100 66
365 66
366 666
666 666
999 666

これはです。バイト単位の最短回答が優先されます。


1
サポートする必要がある最大数はいくつですか?
ミスターXcoder

1
サポート可能な最大の@ Mr.Xcoder。
リーキー修道女

3
@LeakyNun、PPCGが、私はちょうど「私は最短のコードを持っていると思ったので、私は唯一の34に番号をサポートできます」と言うことができるので、そのルールは、本当に素晴らしいではないと言うならば、私は規則的ではないんだながら
Ferrybig

5
@Ferrybig サポートできる限り大きいので、基本的に言語の制限と同じ大きさです。
リーキー修道女

3
どうやら最も近い悪魔はJörgW Mittagです。
user2357112

回答:


51

Python 2、28バイト

lambda n:'6'*len(`-~n*3/11`)

3
それはきちんとしたソリューションです。
リーキー修道女

すごいですね。私は単純な方法ripを使用して105バイトでした。いいね!
-HyperNeutrino

4
とてもかっこいい。このアルゴリズムをどのようにして思いついたのですか?
デビッドZ

すごい。JSの等価は少し長いです:x=>'6'.repeat((''+-~(x*3/11)).length)
スティーブ・ベネット

8
@DavidZヒント:666と6666の平均は3666 3.6666... = 11/3です。
orlp

14

JavaScript(ES6)、31 29バイト

f=(x,s='6')=>x<3+s?s:f(x,s+6)

「だからこそ、私は弱さを喜んでいる[…]私が弱いとき、それから私は強い。」


うわー、かつてはJavascriptの型変換がまさにあなたが必要とするものです:)それは素晴らしいです。
スティーブベネット

「私は弱さに喜ぶ理由です[...]私が弱いときにこそ、私は強いよについて。」~~ 2本のコリント午前12時10分
ジョン・ドヴォルザーク

@JohnDvorak「だから私は病気に喜びを感じる[...]私が弱いとき、それから私は強い。」より良い音。
口ひげ


5

Java 7、96 93 66バイト

String c(int n){String r="";for(n*=11/3;n>1;r+=6,n/=10);return r;}

Port of @orlp amazing Python 2 answer

ここで試してみてください。

私の66バイトカウントも悪魔だと思います。;)
(Javaの最短の答えではありません。代わりに@JollyJokerの答えを参照してください。


整数演算の使用は短くする必要があります。
リーキー修道女

1
さあ、もう1バイトだけゴルフしてください!:p
オリビエグレゴワール

1
どのテストケースも正しくありません。
リーキー修道女

1
とにかくバグ修正として@OlivierGrégoireがr = ""を必要とするので、あなたはあなたの願いを叶えます:)
JollyJoker

@LeakyNunおっと.. ..不正なコードをコピーし"6"ていたはずです""
ケビンCruijssen

4

ゼリー、9 バイト

Ẇa6ḌạÐṂ⁸Ṫ

モナドリンク。

オンラインでお試しください!-このリンクにはほとんど意味がありません(以下を参照)!

どうやって?

真のゴルファーのスタイルでは、これは非常に非効率的です。365テストケースのTIOで60秒間のタイムアウトになります。ローカルでは、これは37秒で終了します。

Ẇa6ḌạÐṂ⁸Ṫ - Main link: n
Ẇ         - all sublists - this has an implicit make_range on it's input
          -   so, for example, an input of 3 yields [[1],[2],[3],[1,2],[2,3],[1,2,3]]
          -   the important things are: that it contains both a list of the length of the
          -   decimal number, and a list 1 shorter; and that it's lists only contain
          -   non-zero numbers and are monotonically increasing in length.
  6       - literal 6
 a        - and (vectorises), this changes all the values to 6s
          -    so, the example above becomes [[6],[6],[6],[6,6],[6,6],[6,6,6]]
   Ḍ      - convert to decimal (vectorises)  [ 6,  6,, 6,  66,   66,   666   ]
       ⁸  - link's right argument, n
     ÐṂ   - filter keep those with minimal:
    ạ     -   absolute difference (for 366 this keeps 66 AND 666; same goes for 3666; etc.)
        Ṫ - tail - get the rightmost result (for 366 keeps 666, since it's longer)

TIO で365および366の 60 秒間の制限内で同じアルゴリズムを実行するためのパッチは、with の暗黙的なベクトル化を回避することですẆa6Ḍ€ạÐṂ⁸Ṫ試してください)が、これは999の入力に対してseg-faultになります(Triangle(999)499,500ですが、それぞれが整数のリストであり、合計でTetrahedral(999)= 166,666,500整数になります。少なくともPythonでは、メモリ効率がよくありません)。


3

ゼリー、10バイト

RD6ṁḌạÐṂ¹Ṫ

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


ポートは短くなりませんか?
リーキー修道女

私も10を試しました。
デニス

ああ、11と6の間にスペースを挿入する必要があるという問題はありますか?
リーキー修道女

116をどのように隣り合わせに配置するかわかりません。たぶん私は何かが欠けています。整数の‘×3:11Ṿ”6ṁ文字列出力を取得しました‘×3:11D6ṁḌ
デニス


3

JavaScript(ES6)、41バイト

f=(n,i=0,j=6)=>n*2<j?i||6:f(n-j,i+j,j*10)

テストケース


3

Mathematica、36バイト

純粋な機能:

Max[NestList[6+10#&,6,#]~Nearest~#]&

説明:

    NestList[6+10#&,6,#]

反復は、の値から始まるNestListパターンに従うことを使用して、入力に等しい長さのリストを作成します。6+10x(previous_value)6

                        ~Nearest~#

次に、このリストで入力に最も近い値を見つけます。

Max[                              ]

最後に、最も近い値のリストから最大値を取得します。

数学は任意の精度の長さの数値を処理できるため、リストの長さは非常に非効率的ですが、このプログラムは物理メモリによってのみ制限されます。



3

05AB1E10 9バイト

-ライリーのおかげで1バイト

6׌ΣI-Ä}¬

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

上記のコードにはパフォーマンスの問題がある可能性があります。10バイトのわずかに効率的なバージョンを次に示します。TIOの代替

説明

6׌ΣI-Ä}¬   Main link. Argument n
6×          Push string containing '6' n times
  Π        Push substrings
   Σ   }    Sort by result of code
    I-Ä     Absolute difference between n
        ¬   Head, implicit output

ええ、しかし最後のテストケースではパフォーマンスの問題がありました。TIOの60秒の最大値では、それを実行するには不十分でした):
kalsowerus

@Rileyありがとう、私の答えを更新しました:)
kalsowerus

2

Mathematica、76バイト

Max[Take[LinearRecurrence[{11,-10},{0,6},IntegerLength[#]+1],-2]~Nearest~#]&

2

Neim12 10バイト(非競合)

steenberghのおかげで-1バイト

𝐥𝐈Γ6Θℝ)₁>𝕔

説明:

               Implicit input: [366]
𝐥               Push the length of the input
                [3]
  𝐈             Inclusive range
                [[1, 2, 3]]
   Γ            For each
       ℝ         Repeat
    6            6
     Θ           currently looped value times
                 [[6, 66, 666]]
          )     End for each
             𝕔  Get the closest value to
           ₁    The first line of input...
            >   ...incremented by one
                [666]
                Implicitly print entire stack

残念ながら、 𝕔 2つの数値の差が同じ場合、リストの低い値が返されるため、そのために2バイトを追加する必要がありました。

などの非競合><およびこの質問は頼まれた(そして後に追加された𝐥数字だけでなく、リストで動作するように修正されました)

注:長さが19以上の数値では機能しません。Javaの長さが大きすぎて処理できないためです。(ただし、これは非常に大きな値であり、問​​題ないはずです)

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


きっとあなたは、競合するこの答え....行うことができます
漏れ修道女

たとえば、に置き換えても機能Γ6Θℝ)ΓΘ𝐈Γ6)𝐣)ますか?
リーキー修道女

@LeakyNunそれを見てみましょう。
Okx

@LeakyNunいいえ、埋め込みループのバグ(現在修正済み)があったため、競合させる方法はないと思います。
Okx

誰が投票したのか、そしてその理由は?
Okx

2

Java 8、37バイト

 n->(""+-~n*3/11).replaceAll(".","6");

行くケビンCruijssenの例と単なる文字列を返します。

* 3/11トリックを実行して適切な長さを取得し、すべてを6で置き換えます。


もちろん@LeakyNun、追加する必要がありました-~...私は注意を払ったい場合、私はこのページで10回を見ている必要があること
JollyJoker

2
36バイトをカウントします。コードには、不要な末尾のセミコロンと先頭のスペースがあります。
エソランジングフルーツ

1

QBIC37 27バイト

≈!@36`!<=:|A=A+!6$]?_sA,2,a

Maths™を使用する代わりに、文字列操作を使用して、Demonic Domains(36、366、...)内のブレークを見つけるようになりました。@ eush77のJS回答に触発されました。

説明

≈         |  WHILE <condition> 
 !    !        a numerical cast of
  @  `         the string literal A$
   36          starting out as "36"
       <=    is smaller than or equal to
         :   cmd line argument 'a'
A=A+ 6       Add a 6 to the end of A$ (36 ==> 366 ==> 3666)
    ! $         as a string-cast
]            WEND (ends the WHIOLE loop body)
?_sA         PRINT a substring of A$            n=37, A$ = 366
  ,2           starting at index 2                          ^
  ,a           running well past the end of the string      66

1

dc、46バイト

dsxZ1-10r^d11*2-3/dsylx[0r-]s.<.3*ly+d[6]s.0=.

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

dsxZ1-10r^d11*2-3/dsylx[0r-]s.<.3*ly+d[6]s.0=.
   Z1-10r^                                      Nearest power of 10
           11*2-3/                              The number in between 6ⁿ and 6ⁿ6
          d          lx[0r-]s.<.                Check which side we're on
                                3*ly+           Get the answer for x≥3
                                     d[6]s.0=.  Return 6 for x<3

1

C#、142バイト

a=>{var c=(a+"").Length;return int.Parse(a<int.Parse(3+new string('6',c==1?2:(c==10?1:c)))?new string('6',c-1):new string('6',c==10?c-1:c));};

36666ごとに次のデーモン番号にジャンプする必要があるという事実を使用しています...より読みやすい形式で:

var c = (a + "").Length; 
    return int.Parse(a < int.Parse(3 + new string('6', 
        c == 1 ? 2 : (c == 10 ? 1 : c))) 
        ? new string('6', c - 1) 
        : new string('6', c == 10 ? c - 1 : c));

2
Stringの代わりに整数演算を使用すると、多くのバイトを節約できると思います。
リーキー修道女

私の102バイトの回答に示されているように、オーバーロードされた+演算子があるため、文字列を追加するだけで、c#で数値を文字列に変換できます。また、解析して戻す必要はないと思いますint質問が「最も近い悪魔の数を出力する」ように私たちに尋ねたように
リー


1

フィードにはこの質問は表示されず、偶然につまずいただけです。とにかく私の答えは次のとおりです。

JavaScript(ES6)、34バイト

n=>`${-~n*3/11|0}`.replace(/./g,6)

数値の回答用に1バイトを追加します。もともとこのES7の未回答の回答(37バイト、すでに数値)に基づいています:

n=>(10**(Math.log10(-~n*3/11)|0)*2-2)/3

迷惑なことに、OPは36を6より66に近づけたいと考えています。説明:11/3 = 3.666...。したがって、これで除算すると、範囲7..36、37..366などが範囲1..9.9、10にスケーリングされます。 ..99.9など。これは、切り捨てて文字列に変換し、すべての文字を数字6に変更するのがゴルファーではありますが、次の10のべき乗よりも1/3少ない2/3を取ることで純粋に数値的に解決できます。本当に賢い再帰的な答えほどゴルフ好きではありません。)


1

CJam、25バイト

Jonathan AlanのJelly提出ほど遅くはありませんが、O(n²)メモリが必要ですnは入力番号)。うん。

ri)__{)'6*i}%f-_:z_:e<#=-

これは、次のPythonと同等です。

num = int(input()) + 1                                      # CJam: ri)__
demondiffs = [int("6" * (i + 1)) - num for i in range(num)] # CJam: {)'6*i}%f-
absdiffs = [abs(i) for i in demondiffs]                     # CJam: _:z
mindex = absdiffs.index(min(absdiffs))                      # CJam: _:e<#
print(num - demondiffs[mindex])                             # CJam: =-

代替ソリューション、12バイト

ri)3*B/s,'6*

これは、orlpのアルゴリズムをCJamに変換したものです。

説明:

ri           e# Read integer:       | 36
  )          e# Increment:          | 37
   3*        e# Multiply by 3:      | 111
     B/      e# Divide by 0xB (11): | 10
       s     e# Convert to string:  | "10"
        ,    e# String length:      | 2
         '6  e# Push character '6': | 2 '6
           * e# Repeat character:   | "66"
e# Implicit output: 66

1

PHP、49バイト

キャラクター6をトリミングする

for(;trim($x=$argn+$i,6)>"";)$i=($i<1)-$i;echo$x;

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

代わりにtrim($x=$argn+$i,6)>""、Regexソリューション!preg_match("#^6+$#",$x=$argn+$i)+11バイトまたはカウント6比較strlen($x=$argn+$i)-strspn($x,6)+10バイトに等しい文字列長を使用できます。


1

LOLCODE 1.4、471バイト

HAI 1.4
CAN HAS STRING?
I HAS A i
GIMMEH i
I HAS A l ITZ I IZ STRING'Z LEN YR i MKAY
I HAS A s ITZ "3"
IM IN YR a
BOTH SAEM I IZ STRING'Z LEN YR s MKAY AN l
O RLY?
YA RLY
GTFO
OIC
s R SMOOSH s AN 6
IM OUTTA YR l
I HAS A o
DIFFRINT i AN BIGGR of i AN 4
O RLY?
YA RLY
VISIBLE 6
NO WAI
BOTH SAEM i AN SMALLR of i AN s
O RLY?
YA RLY
o R DIFF OF l AN 1
NO WAI
o R l
OIC
I HAS A f
IM IN YR b UPPIN YR k TIL BOTH SAEM k AN o
f R SMOOSH f AN 6
IM OUTTA YR b
VISIBLE f
OIC
KTHXBYE

ワオ。ここに、UngolfedとExplainedがあります:

HAI 1.4
CAN HAS STRING?
I HAS A input
GIMMEH input
I HAS A length ITZ I IZ STRING'Z LEN YR input MKAY BTW this is using the length function of the STRING library.
I HAS A sixes ITZ "3" BTW the average of for example [6...] and 6[6...] is 3[6...].
IM IN YR foreverloop BTW this loop fills the sixes variable.
    BOTH SAEM I IZ STRING'Z LEN YR sixes MKAY AN length # In LOLCODE, a statement containing only an expression assigns the implicit variable IT.
    O RLY? # Tests the current value in IT.
      YA RLY
        GTFO
    OIC
    sixes R SMOOSH sixes AN 6 BTW SMOOSH automatically casts things to YARN. It also does not need a MKAY unless there's something after it on the line.
IM OUTTA YR foreverloop
I HAS A outputlength
DIFFRINT input AN BIGGR of input AN 4 BTW LOLCODE doesn't have a built-in inequality operator. This just means input < 4
O RLY?
  YA RLY
    VISIBLE 6 BTW If it's less than 4, the algorithm of comparing to the nearest 3.6*10^n.
  NO WAI
    BOTH SAEM input AN SMALLR of input AN sixes BTW input<=sixes
    O RLY? BTW This if statement makes sure that if the input is less than 3.6*10^length, it goes to the previous place value's demon number.
      YA RLY
        outputlength R DIFF OF length AN 1
      NO WAI
        outputlength R length
    OIC
    I HAS A final
    IM IN YR forloop UPPIN YR iterator TIL BOTH SAEM iterator and outputlength
        final R SMOOSH final AN 6
    IM OUTTA YR forloop
    VISIBLE final
OIC
KTHXBYE

まだすごい。擬似javascrythonをいくつか紹介します。

hello()
import string
var i
i=input()
var l=string.len(i)
var s="3"
while True:
  if(string.len(s)==l):
    break
  s=s+6
var o
if(i!=max(i,4)): # Basically if(i<4)
  print 6
else:
  if(i==min(i,s)): # Basically if(i<=s)
    o=l-1
  else:
    o=l
  var f
  for(var k=0;k<o;k++):
    f=f+6
  print(f)
exit()

まだわからない?このプログラムは基本的に(入力1〜3を除く)入力を3.6 * 10 ^ nと比較します。nは入力の長さです。その数よりも小さい場合は、長さより1少ない6の数を出力します。その数以上の場合、6の数が現在の長さです。

ゴルフの手助けをしてください!


0

Haxe、70バイト

function(x){x*=3;x/=11;do{Sys.print('6');}while((x=Std.int(x/10))>0);}

入力はFloat整数であるにもかかわらず型として渡される必要があります。そうでないと、Haxeは整数を除算しようと文句を言います(整数を何かで除算すると、haxeはコンパイルを拒否します)

他のすべての回答と同じです。3で乗算し、11で除算して、6数字ごとに1を出力します。


0

Brainfuck、315バイト

,+>+++[>>+<<-]>>[<<<[>+>+<<-]>>[<<+>>-]>-]<+++++++++++<[>>+<<-]>>[<[>>+>+<<<-]>>>[<<<+>>>-]<[>+<<-[>>[-]>+<<<-]>>>[<<<+>>>-]<[<-[<<<->>>[-]]+>-]<-]<<<+>>]<[-]+<[>-]>[<+>->]++++++[<+++++++++>-]<<<[-]++++++++++>[>.<[<<+>>-]<<[>[<<+<+>>>-]<<<[>>>+<<<-]>[<+>>-[<<[-]<+>>>-]<<<[>>>+<<<-]>[>-[>>>-<<<[-]]+<-]>-]>>>+<<]>>]

ここで実行します。3 *(n + 1)の値を処理できるセルサイズを選択します。したがって、すべてのテストケースが機能するには、16を選択します。これを機能させるには、動的(無限)メモリをオンにする必要があります。これにより、テープを左に拡張できます。整数を入力するには\366、n = 366のように入力します。

ゴルフをしていない:

このソリューションと同じアルゴリズムを使用します。各ステップで使用されるアルゴリズムは、このページから取得されます。使用されるアルゴリズムはすべて非ラッピングであるため、入力が大きくなってもプログラムが中断することはありません。

,+ # n = n plus 1
>+++ # 3
[>>+<<-]>>[<<<[>+>+<<-]>>[<<+>>-]>-] # n = n*3
<+++++++++++ # 10
<[>>+<<-]>>[<[>>+>+<<<-]>>>[<<<+>>>-]<[>+<<-[>>[-]>+<<<-]>>>[<<<+>>>-]<[<-[<<<->>>[-]]+>-]<-]<<<+>>] # n = n/10
<[-]+<[>-]>[<+>->] # if (n == 0) { n = n plus 1 }
++++++[<+++++++++>-] # '6' (54)
<<<[-]++++++++++> # 10
[ # while (n above 0)
  >.< # print '6'
  [<<+>>-]<<[>[<<+<+>>>-]<<<[>>>+<<<-]>[<+>>-[<<[-]<+>>>-]<<<[>>>+<<<-]>[>-[>>>-<<<[-]]+<-]>-]>>>+<<]>> # n = n/10
]

確かにのn=n*3ようなものにゴルフすることができます[->+++<]か?そして、divmodアルゴリズムは10で除算しますか?
ジョーキング

134バイト、これはさらに改善される可能性があります
ジョーキング

@JoKingより大きなテストケースをサポートするには、非ラッピングアルゴリズムを使用する必要があるため、ソリューションは実際には機能しません。TIOを使用しなかった理由があります。
mbomb007

おっと、ラッピング部分を削除します。これは数字だけでした。140バイト(コードを与える方が簡単だからTIO)(EOF = 0)
ジョーキング



0

C#、102バイト

string a(int j,int k=0)=>(j+"|"+(k=k==0?j:k)).Split('|').Where(s=>s.All(c=>c=='6')).Max()??a(j+1,k-1);

この長さに失望し、Javaの短い答えとまったく同じことができましたが、私は怠け者で愚かな.NET開発者であるため、それを本当に理解していませんでした:)

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