Покажи мне ближайшего демона


42

Демоническое число - это положительное целое число, десятичное представление которого состоит только из 6. Список демонических чисел начинается с 6, 66, 666, 6666.

Учитывая положительное целое число, выведите ближайшее демоническое число. Если их два, выведите большее.

Testcases:

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
Какое максимальное количество мы должны поддержать?
Мистер Кскодер

1
@ Mr.Xcoder настолько большой, насколько вы можете поддержать.
Утренняя монахиня

3
@LeakyNun, хотя я не постоянный PPCG, я бы сказал, что правило не очень хорошее, потому что я могу просто сказать: «Я могу поддерживать только числа до 34, потому что я хотел получить самый короткий код»
Ferrybig

5
@Ferrybig настолько большой, насколько вы можете поддерживать, поэтому в основном настолько большой, насколько язык ограничивает вас.
Утренняя монахиня

3
По-видимому, ближайший демон - Йорг Миттаг .
user2357112 поддерживает Monica

Ответы:


51

Python 2, 28 байт

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

3
Это аккуратное решение.
Утренняя монахиня

Вау, это впечатляет. Мой был 105 байтов, используя тривиальный метод RIP. Ницца!
HyperNeutrino

4
Очень круто. Как вы пришли к этому алгоритму?
Дэвид З,

Это потрясающе. Эквивалент в 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 «Поэтому я получаю удовольствие от немощей [...], потому что когда я слаб, тогда я силен». звучит лучше.
УсыMoses


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 за это .


Использование целочисленной арифметики должно быть короче.
Утренняя монахиня

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

1
Ни один из ваших тестов не является правильным.
Утренняя монахиня

1
В любом случае @ OlivierGrégoire нуждается в исправлении ошибки r = "", так что вы получите свое желание :)
JollyJoker

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

4

Желе , 9 байт

Ẇa6ḌạÐṂ⁸Ṫ

Монадическая ссылка.

Попробуйте онлайн! - Почти нет смысла в этой ссылке (см. Ниже)!

Как?

В стиле настоящего игрока в гольф это действительно неэффективно - в TIO время 365 для тестового примера 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 состоит в том, чтобы избежать неявной векторизации with Ẇa6Ḍ€ạÐṂ⁸Ṫ( попробуйте это ), однако теперь это вызовет ошибку сегмента для входа 999 ( Triangle (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

Mathematica, 36 байт

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

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

Объяснение:

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

Итеративно создайте список длины, равной вводу, используя NestListследующую последовательность, 6+10x(previous_value)начиная со значения 6.

                        ~Nearest~#

Затем найдите значение в этом списке ближе всего к входу.

Max[                              ]

Наконец, возьмите максимальное значение из списка ближайших значений.

Хотя длина списка супер неэффективна, так как mathematica может работать с произвольными значениями длины точности, эта программа ограничена только физической памятью.



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

Mathematica, 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. (но это довольно большое значение, и должно быть в порядке)

Попытайся


Конечно, вы можете сделать этот ответ, соревнуясь ....
Leaky Nun

например , она будет работать , если заменить Γ6Θℝ)с ΓΘ𝐈Γ6)𝐣)?
Утренняя монахиня

@ LeakyNun Я посмотрю на это.
Okx

@LeakyNun Нет, я не думаю, что есть способ заставить его конкурировать, поскольку была ошибка (теперь исправленная) со встроенными циклами.
Okx

Кто проголосовал и почему?
Okx

2

Java 8, 37 байт

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

Судя по примеру Кевина Cruijssen в и просто возвращает строку.

Сделайте трюк * 3/11, чтобы получить правильную длину, затем замените все шестерками.


@LeakyNun Конечно, нужно было добавить то, -~что я должен был бы увидеть десять раз на этой странице, если бы я обратил внимание ...
JollyJoker

2
Я считаю 36 байтов. В вашем коде есть лишняя точка с запятой и пробел.
Esolanging Fruit

1

QBIC , 37 27 байт

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

Вместо использования Maths ™ теперь используется манипулирование строками для поиска разрывов в доменах демонов (36, 366, ...). Вдохновлен ответом @ eush77's 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

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, поскольку вопрос только что попросил нас «вывести ближайшее демоническое число»
ли

1

Braingasm , 15 байт

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

Используя арифметику из решения Python от orlp :

;                   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

Я не видел этот вопрос в ленте, а случайно наткнулся на него. Вот мой ответ в любом случае:

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 было ближе к 66, чем к 6. Объяснение: 11/3 = 3,666 ..., поэтому делим с помощью этого шкалы диапазонов 7,36, 37,3666 и т. Д. До диапазонов 1,9,9,10. ..99.9 и т. Д. Эту проблему можно решить чисто численно, взяв на 2/3 единицу меньше, чем следующая более высокая степень 10, хотя усечь ее лучше, преобразовать в строку, а затем заменить все символы на цифру 6. (Хотя все же не такой гольф, как этот действительно умный рекурсивный ответ.)


1

CJam, 25 байтов

Не так медленно, как Jonathan Alan's 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 + 11 !preg_match("#^6+$#",$x=$argn+$i)байт или длину строки, равную счету 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 - длина входного сигнала. Если оно меньше этого числа, оно печатает число на 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, выведите 1 6для каждой цифры.


0

Brainfuck, 315 байт

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

Запустите это здесь . Выберите размер ячейки, который может обрабатывать значения 3 * (n + 1), поэтому для работы всех тестовых случаев выберите 16. Динамическая (бесконечная) память должна быть включена, чтобы это работало. Это позволяет ленте расширяться влево. Чтобы ввести целое число, введите ввод как\366 для n = 366.

Ungolfed:

Использует тот же алгоритм, что и это решение . Алгоритмы, используемые для каждого отдельного шага, взяты из этой страницы . Все используемые алгоритмы не являются переносами, поэтому программа не будет работать при больших входах.

,+ # 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 :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.