Покажіть мені найближчого демона


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
Яку максимальну кількість ми маємо підтримувати?
Містер Xcoder

1
@ Mr.Xcoder настільки великі, як ви можете підтримувати.
Лина монашка

3
@LeakyNun, хоча я не є звичайним, якщо PPCG, я б сказав, що це правило не дуже добре, тому що я можу просто сказати: "Я можу підтримувати до 34 лише цифри, тому що я хотів мати найкоротший код"
Феррібіг

5
@Ferrybig настільки великий, скільки ви можете підтримувати, настільки ж великий, наскільки мова вас обмежує.
Лина монашка

3
Мабуть, найближчий демон - Йорг W Міттаг .
користувач2357112

Відповіді:


51

Python 2, 28 байт

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

3
Це акуратне рішення.
Лина монашка

Нічого не вражаюче Шахта склала 105 байт, використовуючи тривіальний метод rip. Приємно!
HyperNeutrino

4
Дуже круто. Як ви придумали цей алгоритм?
David 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 "Тому я насолоджуюся немочками [...], бо коли я слабкий, то я сильний". звучить краще.
MustacheMoses


5

Java 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 відповідь До речі, см @JollyJoker відповідь «s для цього замість.


Використання цілочисельної арифметики повинно бути коротшим.
Лина монашка

1
Давай, гольф, ще один байт, будь ласка! : p
Олів'є Грегоар

1
Жодна з ваших тестів не є правильною.
Лина монашка

1
@ OlivierGrégoire все-таки потребує r = "" як виправлення, тому ви отримаєте своє бажання :)
JollyJoker

@LeakyNun На жаль .. Скопіював неправильний код .. "6"повинен був бути "".
Кевін Круїссен

4

Желе , 9 байт

Ẇa6ḌạÐṂ⁸Ṫ

Монадійне посилання.

Спробуйте в Інтернеті! - Майже немає сенсу в цьому посиланні (див. Нижче)!

Як?

У справжньому стилі гольфіста це справді неефективно - він потрапляє до 60-х років у TIO для тестового випадку 365 ! Місцево це закінчується в 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-х років для 365 і 366 на TIO, це уникати неявної векторизації з Ẇa6Ḍ€ạÐṂ⁸Ṫ( спробуйте це ), однак тепер це буде seg-помилка для введення 999 ( Трикутник (999) лише 499 500, але кожне - це список цілих чисел, що складає загалом тетраедра (999) = 166 666 500 цілих чисел, неефективна пам'ять, принаймні, в Python).


3

Желе , 10 байт

RD6ṁḌạÐṂ¹Ṫ

Спробуйте в Інтернеті!


Хіба порт не буде коротшим?
Лина монашка

Я також спробував і отримав 10.
Денніс

о, чи проблема в тому, що простір потрібно вставити між 11 і 6?
Лина монашка

Не знаєте, як би ви поставили 11 та 6 поруч; можливо, мені чогось не вистачає. Я отримав ‘×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

Математика, 36 байт

Чиста функція:

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

Пояснення:

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

Ітеративне створення списку довжини, рівного вводу, використовуючи NestListнаступний зразок, 6+10x(previous_value)починаючи зі значення 6.

                        ~Nearest~#

Потім знайдіть значення в цьому списку, найближче до вхідного.

Max[                              ]

Нарешті, взяти максимальне значення зі списку найближчих значень.

Хоча довжина списку дуже неефективна, оскільки математика може працювати з довільними числами точності довжини, ця програма обмежена лише фізичною пам'яттю.



3

05AB1E , 10 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

Так, але тоді в останній тесті були проблеми з роботою. Максимуму 60 секунд у TIO було недостатньо для його запуску):
kalsowerus

@Riley дякую, я оновив свою відповідь :)
kalsowerus

2

Математика, 76 байт

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

2

Нейм , 12 10 байт (неконкуренто)

-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. (але це досить велике значення, і воно повинно бути добре)

Спробуй це


Звичайно, ви зможете зробити цю відповідь змагальною ....
Лина монашка

наприклад , вона буде працювати , якщо замінити Γ6Θℝ)з ΓΘ𝐈Γ6)𝐣)?
Лина монашка

@LeakyNun Я погляну на це.
Оккс

@LeakyNun Ні, я не думаю, що існує спосіб змусити його змагатися, оскільки виникла помилка (зараз виправлена) із вбудованими петлями.
Оккс

Хто виступав і чому?
Okx

2

Java 8, 37 байт

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

Перехід за прикладом Кевіна Круїссена і просто повернення рядка.

Виконайте трюк * 3/11, щоб отримати правильну довжину, а потім замініть всі на шість.


@LeakyNun Звичайно, довелося додати те, -~що я повинен був бачити десять разів на цій сторінці, якби я звернув увагу ...
JollyJoker

2
Я рахую 36 байт. У вашому коді непотрібна крапка з комою та пробілом.
Esolanging Fruit

1

QBIC , 37 27 байт

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

Замість використання Maths ™ тепер використовується стрипова маніпуляція для пошуку перерв у доменах Demonic (36, 366, ...). Натхненний JS-відповіддю @ eush77.

Пояснення

≈         |  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

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 може заощадити багато байтів.
Лина монашка

добре, ви можете перетворити число в рядок в c #, просто додавши до нього рядок, оскільки він має перевантажений + оператор, як показано у моїй відповіді на 102 байти .. Я також не думаю, що вам потрібно розбирати його назад до int, оскільки запитання просто попросило нас "вивести найближче демонічне число"
lee


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

Дратівливо ОП хоче, щоб 36 було ближче до 66, ніж 6. Пояснення: 11/3 = 3.666 ..., тому ділення за цією шкалою діапазонів 7..36, 37..366 і т.д. на діапазони 1..9.9, 10 ..99.9 і т. Д. Це можна вирішити чисто числом, взявши на 2/3 один менший, ніж наступний більший показник на 10, хоча гольфіст урізати, перетворити на рядок, а потім змінити всі символи на цифру 6. (Хоча все-таки не настільки гофрований, як справді хитра рекурсивна відповідь.)


1

CJam, 25 байт

Не так повільно, як подача Джонатана Алана на желе, але вимагає пам'яті 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 і пояснив:

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 - довжина вводу. Якщо воно менше, ніж це число, воно виводить число на 6s на менше довжини. Якщо воно більше або дорівнює цьому числу, число шістдесят - це поточна довжина.

Дуже хотів би допомогти гольфу!


0

Хакс, 70 байт

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

Введення має бути передано як тип, Floatнезважаючи на ціле число, інакше Haxe поскаржиться на спробу поділити ціле число (так, haxe відмовиться від компіляції, якщо ви поділите ціле число на що-небудь)

Те саме, що і всі інші відповіді. Помножте на 3, розділіть на 11, надрукуйте 1 6на кожну цифру.


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

Нібито розчарований у тривалості цього, міг зробити точно так само, як і коротша відповідь на Java, але я не дуже цього зрозумів, бо я ледачий, дурний розробник .NET :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.