Это трехзначное число, заканчивающееся на одно?


27

Если задано неотрицательное целое число, укажите, является ли оно трехзначным числом, оканчивающимся на единицу, в любой согласованной целочисленной базе. Другими словами, число должно быть представлено в base-N, где N является целым числом больше нуля.

правила

  • Это , поэтому выигрывает самый короткий ответ.
  • Поскольку унарный ведет себя странно, поведение с вводом 3 10 не определено.
  • Стандартные лазейки запрещены.

Примеры

Правда:

5   
73  
101 
1073
17
22
36
55
99  

Ложь:

8
18
23
27
98
90
88
72
68

Горстка больших чисел:

46656 true
46657 true
46658 true
46659 true
46660 true
46661 false
46662 false
46663 true
46664 false
46665 true
46666 true
46667 false
46668 false
46669 false
46670 true
46671 true

1
Так как одинарный ведет себя причудливо нет, он не ведет себя странно, одинарное представление целого неотрицательного nтолько n 1с, например 0 = ()₁, 3 = (111)₁, 10 = (1111111111)₁и т.д.
Эрик Outgolfer

6
@EriktheOutgolfer Это ведет себя совсем по-другому; например, вы не можете разделить на 1 к n-ithift.
wizzwizz4

3
Что означает согласованная целочисленная база? (Кроме того, вместо исключения унарных в правилах вы можете просто указать N ≥ 2.)
Линн

1
@Lynn Позиционное обозначение с одним основанием, например, основанием десять, в отличие от зависимого от положения основа, как вы видите с имперскими единицами или временем
HAEM

1
@ Линн как дополнение, я также пытался исключить рациональные, негативные, сложные и т. Д. Основания. Что касается вашего второго пункта, правило об унарных не предназначено ни включать, ни исключать унарные. Если мое понимание языковой адвокатуры еще слабее, чем я думал, «неопределенное поведение» означает «все, что хочет исполняющая сторона», к чему я стремился.
HAEM

Ответы:


10

Желе , 7 байт

bRṫ€3ċJ

Возвращает количество базисов (отличное от нуля истинное, ложное ноль), в котором вход представляет собой трехзначное число, заканчивающееся на единицу.

Попробуйте онлайн!

Как это работает

bRṫ€3ċJ  Main link. Argument: n

 R       Range; yield [1, ..., n].
b        Base; convert n to bases 1, ..., n.
  ṫ€3    Tail each 3; remove the first two elements of each digit array.
      J  Indices of [n]; yield [1].
     ċ   Count the number of times [1] appears in the result to the left.

10

JavaScript (ES7), 43 40 39 байт

f=(n,b)=>n<b*b?0:n%b==1&n<b**3|f(n,-~b)

Контрольные примеры

комментарии

f = (n,           // given n = input
        b) =>     // and using b = base, initially undefined
  n < b * b ?     // if n is less than b²:
    0             //   n has less than 3 digits in base b or above -> failure
  :               // else:
    n % b == 1 &  //   return a truthy value if n is congruent to 1 modulo b
    n < b**3 |    //   and n is less than b³ (i.e. has less than 4 digits in base b)
    f(n, -~b)     //   or the above conditions are true for some greater value of b




4

05AB1E , 11 8 байт

Сохранено 3 байта благодаря Аднану .

Lв3ù€θ1å

Попробуйте онлайн!

объяснение

Lв            # convert input to bases [1 ... input]
  ʒg3Q}       # keep only elements of length 3
       €θ     # get the last item of each
         1å   # is there any 1?


3

Mathematica, 43 байта

!FreeQ[IntegerDigits[#,2~Range~#],{_,_,1}]&

Попробуйте онлайн!

или попробуйте онлайн! (большое количество)

Мартин Эндер сэкономил 3 байта


!FreeQ[#~IntegerDigits~Range@#,{_,_,1}]&немного короче, если вы не против увидеть IntegerDigits::ibase: Base 1 is not an integer greater than 1.предупреждение. (Он все еще возвращает правильные ответы.)
Миша Лавров




2

APL (Dyalog Unicode) , 21 20 14 байтов SBCS

-5 благодаря @ngn.

Чисто арифметическое решение (на самом деле не выполняет никаких базовых преобразований) и, следовательно, очень быстрое.

3∊⊢(|×∘⌈⍟)⍨1↓⍳

Попробуйте онлайн!

⊢()⍨1↓⍳ На один пропущенный из аргумента 1ndice 1… и аргумент, примените:

| остатки деления

×∘⌈ раз округлил

 log N Аргумент

3∊ три члена этого?


Вы можете сохранить 1 со стандартным приемом обмена аргументами:⊢(∨/(3=∘⌈⍟)∧1=|)⍨1↓⍳
ngn

@ngn Спасибо. В следующий раз, не стесняйтесь просто редактировать такие (если вам это нравится).
Адам

хорошо. Вот более сложное улучшение, которое я оставляю вам, чтобы справиться с ним - оно настолько же короткое, как и ваше другое решение:(⊂1 3)∊⊢(⌈|,¨⍟)⍨1↓⍳
ngn

1
3∊⊢(|×|×∘⌈⍟)⍨1↓⍳
18.15

2
@ngn 1=⌈a⍟b, a≤ba=b0=a|b0=b|b
адам


1

Шелуха , 15 байт

V§&o=1→o=3LṠMBḣ

Попробуйте онлайн!

объяснение

V§&(=1→)(=3L)ṠMBḣ  -- implicit input, for example: 5
             ṠMB   -- map "convert 5 to base" over..
                ḣ  --   range [1..5]
                   -- [[1,1,1,1,1],[1,0,1],[1,2],[1,1],[1,0]]
V                  -- does any of the elements satisfy the following
 §&( 1 )( 2 )      --   apply functions 1,2 and join with & (logical and)
         =3L       --     is length equals to 3?
    =1→            --     is last digit 1?

1

PHP, 48 + 1 байт

while(++$b**2<$n=$argn)$n%$b-1|$n>$b**3||die(1);

выходы с 0фальшивкой (или вводом 3), 1для правдивости.
Запустите как трубу с -nRили попробуйте онлайн .


1

C, 60 байтов

Функция, которая возвращает ненулевое значение, если аргумент может быть представлен в виде трехзначного числа, оканчивающегося на 1:

i,j;f(n){for(j=0,i=sqrt(n);i>cbrt(n);)j+=n%i--==1;return j;}

Примечание: это работает с GCC, где функции являются встроенными. Для других компиляторов вам, вероятно, нужно убедиться, что аргументы и возвращаемые типы известны:

#include<math.h>

объяснение

Наименьшее основание n, представленное 3 цифрами ⌊∛n⌋, и наименьшее основание n, представленное 2 цифрами ⌊√n⌋, поэтому мы просто проверяем, совпадает ли число с 1 по модулю любых оснований в 3-значном диапазоне. Мы возвращаем счетчик числа базисов, удовлетворяющих условию, давая ненулевое (истинное) или нулевое (ложное) значение в зависимости от ситуации.

Тестовая программа

Передайте любое количество входов в качестве позиционных параметров:

#include<stdio.h>
int main(int c,char**v)
{
    while(*++v)
        printf("%s => %d\n", *v, f(atoi(*v)));
}



0

Пыть , 35 33 байта

←ĐĐ3=?∧∧:ŕĐ2⇹Ř⇹Ľ⅟⌊⁺3=⇹Đ2⇹Ř%*ž1⇹∈;

Объяснение:

←ĐĐ                                             Push input onto stack 3 times
   3=?  :                       ;               If input equals 3, execute code after the question mark;otherwise, execute code after the colon. In either case, afterwards, execute the code after the semicolon
      ∧∧                                        Get 'True'
        :                                       Input not equal to 3
         ŕ                                      Remove 'False'
          Đ2⇹Ř                                  Push [2,3,...,n]
              ⇹Ľ⅟⌊⁺                             Push [floor(log_2(n))+1,floor(log_3(n))+1,...,floor(log_n(n))+1]
                   3=                           Is each element equal to 3
                     ⇹                          Swap the top two elements on the stack (putting n back on top)
                      Đ2⇹Ř                      Push [2,3,...,n]
                          %                     Push [n%2,n%3,...,n%n]
                           *                    Multiply [n%x] by the other array (i.e. is floor(log_x(n))+1=3?)
                            ž                   Remove all zeroes from the array
                             1⇹∈                Is 1 in the array?
                                ;               End conditional
                                                Implicit print

Попробуйте онлайн!


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