가장 가까운 악마를 보여줘


42

악마 숫자는 소수 표현이 6으로 만 구성된 양의 정수입니다. 악마 숫자 목록은 6, 66, 666, 6666으로 시작합니다.

양의 정수가 주어지면 가장 가까운 악마 숫자를 출력하십시오. 두 개가 있으면 더 큰 것을 출력하십시오.

테스트 케이스 :

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
우리가 지원해야하는 최대 수는 얼마입니까?
Mr. Xcoder

1
@ Mr.Xcoder는 지원 가능한 한 크게합니다.
Leaky Nun

3
@LeakyNun, PPCG 인 경우 정규적이지는 않지만 규칙이 실제로 좋지 않다고 말할 수 있습니다. "가장 짧은 코드를 원했기 때문에 34까지만 지원할 수 있습니다"
Ferrybig

5
@Ferrybig 지원할 수있는 만큼 크게 , 기본적으로 언어가 제한하는만큼 큽니다.
Leaky Nun

3
가장 가까운 악마는 Jörg W Mittag 입니다.
user2357112

답변:


51

파이썬 2, 28 바이트

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

3
깔끔한 솔루션입니다.
Leaky Nun

와우 인상적입니다. 사소한 방법 rip을 사용하여 광산은 105 바이트였습니다. 좋은!
HyperNeutrino

4
매우 시원합니다. 이 알고리즘을 어떻게 생각 해냈습니까?
David Z

대단해. JS의 동등한 기능은 조금 더 길다 :x=>'6'.repeat((''+-~(x*3/11)).length)
Steve Bennett

8
@DavidZ 힌트 : 평균 666과 6666은 3666 3.6666... = 11/3입니다..
orlp

14

자바 스크립트 (ES6), 31 29 바이트

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

"그래서 나는 약점을 좋아한다. […] 내가 약할 때, 나는 강하다."


와우, 한 번 자바 스크립트의 유형 변환이 정확히 필요한 것입니다. :) 훌륭합니다.
Steve Bennett

"나는 약점 기뻐하는 이유입니다 [...] 내가 약할 때, 나는 강한 하노니."~~ 고후 12시 10분
존 드보락

@JohnDvorak "따라서 나는 약할 때 기뻐하며 [...] 약 해지면 강해집니다." 더 나은 소리.
MustacheMoses


5

자바 7, 96 93 66 바이트

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

@orlp 포트 놀라운 Python 2 답변 .

여기에서 시도하십시오.

66 바이트 수도 악마 라고 생각 합니다. ;)
(최단 Java 답변 btw는 아니지만 대신 @JollyJoker 의 답변을 참조하십시오 .


정수 산술을 사용하는 것이 더 짧아야합니다.
Leaky Nun

1
C'mon, 골프 하나만 더주세요! : p
Olivier Grégoire

1
테스트 사례 중 올바른 것은 없습니다.
Leaky Nun

1
@ OlivierGrégoire 어쨌든 버그 수정으로 r = ""가 필요하다. 그래서 당신은 당신의 소원을 얻는다 :)
JollyJoker

@LeakyNun 아차 .. 잘못된 코드를 복사 있습니다 ..이 "6"되어 있어야합니다 "".
케빈 크루이 센

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)

60 년대가 제한 내에서 패치는 동일한 알고리즘 실행을 만들기 위해 365366 TIO에가의 암시 vectorisation 방지하는 것입니다 Ẇa6Ḍ€ạÐṂ⁸Ṫ( 그 시도를 ) 그러나 이것은 현재의 입력에 대한 독방 감금 - 잘못 것, 999 ( 삼각형 (999)가 아니라 499,500 이지만 각각 정수 목록 으로, 적어도 파이썬에서는 메모리가 효율적이지 않은 총 Tetrahedral (999) = 166,666,500 정수를 만듭니다 ).


3

젤리 , 10 바이트

RD6ṁḌạÐṂ¹Ṫ

온라인으로 사용해보십시오!


포트가 더 짧지 않습니까?
Leaky Nun

나는 10도 시도했다.
데니스

아, 11과 6 사이에 공백을 삽입해야한다는 문제입니까?
Leaky Nun

116을 어떻게 서로 옆에 두 었는지 잘 모르겠습니다 . 어쩌면 뭔가 빠졌을 수도 있습니다. 정수에 ‘×3:11Ṿ”6ṁ대한 문자열 출력을 얻었습니다 ‘×3:11D6ṁḌ.
Dennis


3

자바 스크립트 (ES6), 41 바이트

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

테스트 사례


3

매스 매 티카, 36 바이트

순수한 기능 :

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

설명:

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

의 값부터 시작 하여 NestList다음 패턴을 사용하여 입력과 동일한 길이 목록을 반복 작성하십시오 .6+10x(previous_value)6

                        ~Nearest~#

그런 다음이 목록에서 입력에 가장 가까운 값을 찾으십시오.

Max[                              ]

마지막으로 가장 가까운 값 목록에서 최대 값을 가져옵니다.

수학이 임의의 정밀 길이 숫자로 작업 할 수 있기 때문에 목록 길이는 매우 비효율적이지만이 프로그램은 물리적 메모리에 의해서만 제한됩니다.



3

05AB1E , 10 9 바이트

-Riley 덕분에 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

수학, 76 바이트

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

2

Neim , 12 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 바이트를 추가해야했습니다.

비는-경쟁 >, <그리고 이 질문은 질문 후 추가 된 (및 𝐥숫자 작업에 고정 아니라 목록)

참고 : 길이가 19 이상인 숫자는 Java의 long이 처리하기에는 너무 커지기 때문에 작동하지 않습니다. (그러나 이것은 상당히 큰 값이므로 괜찮을 것입니다)

시도 해봐


확실히이 답변을 경쟁적으로 만들 수 있습니다 ....
Leaky Nun

바꿀 경우 예를 들어, 그것은 작동합니다 Γ6Θℝ)함께 ΓΘ𝐈Γ6)𝐣)?
Leaky Nun

@LeakyNun 살펴 보겠습니다.
Okx

@LeakyNun 아니요, 임베디드 루프에 버그 (현재 수정)가 있었기 때문에 경쟁 할 수있는 방법이 없다고 생각합니다.
Okx

누가 downvoted하고 왜?
Okx

2

자바 8, 37 바이트

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

Kevin Cruijssen의 예제로 가서 String을 반환합니다.

올바른 길이를 얻으려면 * 3 / 11 트릭을 수행 한 다음 모두 6으로 바꾸십시오.


@LeakyNun 물론, -~내가주의를 기울 였다면이 페이지에서 열 번 보았어야한다고
덧붙였다

2
나는 36 바이트를 센다. 코드에 불필요한 세미콜론과 선행 공백이 있습니다.
Esolanging 과일

1

QBIC , 37 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 대신 정수 산술을 사용하면 많은 바이트를 절약 할 수 있다고 생각합니다.
Leaky Nun

글쎄, 당신은 내 102 바이트 답변에 표시된 것처럼 오버로드 된 + 연산자가 있기 때문에 문자열을 추가하여 C #에서 문자열로 변환 할 수 있습니다. 질문이 방금 우리에게 "가장 가까운 악마 숫자를 출력"하도록 요청한 것처럼
lee

1

braingasm , 15 바이트

;3*11/z+[6:10/]

orlp의 Python 솔루션 에서 산술 사용하기 :

;                   Read an integer from stdin
 3*11/              Multiply by 3 and divide by 11
      z+            If result is zero, add one
        [6:10/]     While not zero, print '6' and divide by 10

1

피드에서이 질문을 보지 못했고 우연히 우연히 만났습니다. 어쨌든 내 대답은 다음과 같습니다.

자바 스크립트 (ES6), 34 바이트

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

숫자 형 답변에 1 바이트를 추가합니다. 원래이 ungolfed 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 등. 이것은 10의 다음 거듭 제곱보다 1의 2/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)>""정규식 솔루션 !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

아직도 와우. 여기 당신을위한 의사 자바 스크립 톤이 있습니다.

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은 입력 길이입니다. 이 숫자보다 작은 경우 6보다 긴 숫자보다 1을 적게 인쇄합니다. 해당 숫자보다 크거나 같은 경우 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을 선택하십시오.이 기능을 사용하려면 동적 (무한) 메모리를 켜야합니다. 테이프가 왼쪽으로 확장 될 수 있습니다. 정수를 입력하려면\366n = 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 바이트 , 더 향상 될 수 있음
Jo King

@JoKing 더 큰 테스트 사례를 지원하려면 랩핑되지 않는 알고리즘을 사용해야하므로 솔루션이 실제로 작동하지 않습니다. TIO를 사용하지 않은 이유가 있습니다.
mbomb007

랩핑 부분을 제거하겠습니다. 숫자 만있었습니다. 140 바이트 (코드를 제공하기 쉽기 때문에 TIO) (EOF = 0)
Jo King



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);

Kinda는이 길이에 실망했으며 Java의 짧은 대답과 정확히 동일 할 수는 있지만 게으르고 바보 같은 .NET 개발자이기 때문에 실제로 이해하지 못했습니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.