Это число - двухбитное число ™ ️?

Sep 30 2020

Начнем с определения двухбитового числа ™ ️:

  • Это положительное целое число
  • При выражении в виде двоичной строки он имеет ровно 2 истинных бита ИЛИ
  • При выражении в виде десятичного числа оно имеет ровно 2 цифры, а все остальные цифры равны нулю.

Или как предложение

Двухбитовое число ™ ️ - это число, которое содержит ровно две цифры из числа 1 и никаких других цифр, кроме 0, когда оно выражено в виде десятичной строки или двоичного числа.

Итак, здесь расположены все двухбитовые числа ™ ️ от 0 до 256.

Dec  Bin       Type
3    00000011  Binary
5    00000101  Binary
6    00000110  Binary
9    00001001  Binary
10   00001010  Binary
11   00001011  Decimal
12   00001100  Binary
17   00010001  Binary
18   00010010  Binary
20   00010100  Binary
24   00011000  Binary
33   00100001  Binary
34   00100010  Binary
36   00100100  Binary
40   00101000  Binary
48   00110000  Binary
65   01000001  Binary
66   01000010  Binary
68   01000100  Binary
72   01001000  Binary
80   01010000  Binary
96   01100000  Binary
101  01100101  Decimal
110  01101110  Decimal
129  10000001  Binary
130  10000010  Binary
132  10000100  Binary
136  10001000  Binary
144  10010000  Binary
160  10100000  Binary
192  11000000  Binary

Соревнование:

  • Напишите некоторый код, который принимает число и выводит истину или ложь (или какой-либо индикатор истинности или ложности), если это двухбитное число ™ ️.
  • Ввод всегда будет целым числом, но не всегда положительным.
  • Это может быть на любом языке, который вам нравится.
  • Это кодовый гольф, поэтому побеждает наименьшее количество байтов.
  • Включите ссылки на онлайн-интерпретатор вашего кода (например, tio.run).

Тестовые кейсы

Двоичные двухбитовые числа ™ ️:

  • 3
  • 9
  • 18
  • 192
  • 288
  • 520
  • 524304

Десятичные двухбитовые числа ™ ️:

  • 11
  • 101
  • 1001
  • 1010
  • 1100
  • 1000001
  • 1100000000
  • 1000000010

Не двухбитовые числа ™ ️:

  • 0
  • 1
  • 112 (любые цифры больше 1 не позволяют ему быть двоичным
  • 200
  • 649
  • -1
  • -3

Забавный факт: мне не удалось найти никаких десятичных двоичных двухбитовых чисел ™ ️, проверяющих около 14 миллиардов, и у меня есть гипотеза о том, что такого числа не существует, но у меня нет математического доказательства. Мне было бы интересно услышать, сможете ли вы придумать такое.

Ответы

17 ovs Sep 30 2020 at 20:20

Python 3 , 68 62 48 байт

-6 байт благодаря xnor !
-14 байт благодаря Джитсе !

lambda n:' 11 'in f' {n:b} {n} '.replace('0','')

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

10 Arnauld Sep 30 2020 at 20:23

JavaScript (ES6), 38 байт

Возвращает 0 для истины или ненулевое целое число для false .

n=>(g=n=>!(n&=n-1)|n&n-1)(n)*g('0b'+n)

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

Как?

Вспомогательная функция g удаляет два установленных младших бита nпутем n & (n - 1)двукратного вычисления . Если мы получаем 0 в первый раз, это означает, что у nнего установлено не более одного бита, чего недостаточно. Если мы не получим 0 во второй раз, это означает, что nустановлено более 2 битов, что слишком много.

Для десятичного теста мы вызываем g с помощью, '0b' + nчтобы проанализировать его как двоичное значение. Если nотрицательно, это дает что-то вроде '0b-10100', что является NaN'ish и терпит неудачу, как ожидалось.


JavaScript (ES6),  40  39 байт

Возвращает логическое значение, указывающее, не является ли ввод двухбитным числом.

n=>[n,'0b'+n].every(n=>!(n&=n-1)|n&n-1)

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

10 Lynn Sep 30 2020 at 22:13

Haskell , 50 байт

f n=or[b^x+b^y==n|b<-[2,10],x<-[0..n],y<-[x+1..n]]

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

Поиск грубой силы.

Альтернативный 50 байт

b!0=0
b!x=rem x b^3+b!quot x b
f n=2!n==2||10!n==2

b!xвычисляет базовую b«сумму цифр в кубе» x. Например, 10!123= \$1^3+2^3+3^3\$ = 36.

Мы проверяем, равно ли одно из двух 2!nили нет 10!n.

quotнеобходимо для поддержки отрицательного ввода. Он округляется до нуля, а divокругляется в меньшую сторону, что означает div (-1) 10 == (-1)создание бесконечного цикла.

8 Razetime Sep 30 2020 at 20:08

APL (расширенный Dyalog) , 18 байт

2∊+/↑(*3)2 10⊤¨0⌈⎕

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

18-байтовое решение Джо Кинга.

APL (расширенный Dyalog) , 20 21 20 26 25 байт

{<⍵:2∊+/↑(⊂×⍨⍎¨⍕⍵)⍪⊂⊤⍵⋄0}

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

+1 байт после исправления ответа (овс).

-1 байт после предложения ovs. (Ура!)

+7 байт после правильного принятия отрицательных тестовых случаев.

-1 байт от Адама.

На основе решения J.

Объяснение

{⍵>0:2∊+/↑(⊂2*⍨⍎¨⍕⍵)⍪⊂⊤⍵⋄0}
 ⍵>0:                       If number is positive
                      ⊤⍵    Decode number to binary
            ×⍨⍎¨⍕⍵          square each digit
         ↑ ⊂        ⍪⊂      join into two rows
       +/                   sum each row
     2∊                     is two present in it?
                         ⋄0 otherwise return 0
6 KevinCruijssen Sep 30 2020 at 20:07

05AB1E , 8 7 байт

b‚€{11å

Попробуйте онлайн или проверьте все тестовые примеры .

Пояснение:

b        # Convert the (implicit) input-integer to a binary string
 ‚       # Pair it together with the (implicit) input-integer
  €{     # Sort the digits in each string
    11å  # And check if this pair contains an 11 (which is truthy for "011","0011",etc.)
         # (after which the result is output implicitly)
6 DominicvanEssen Oct 01 2020 at 12:38

R , 50 49 48 46 байт

Изменить: -1 байт, затем еще -1 байт, а затем еще -2 байта, благодаря Робину Райдеру

gsub(0,'',n<-scan())!=11&sum(n%/%2^(0:n)%%2)-2

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

Тесты для десятичных 2-битных чисел с использованием текстовых манипуляций для удаления « 0цифр и проверки, не является ли результат » 11, а затем тесты на двоичные 2-битные числа, вычисляя двоичные цифры и проверяя , не совпадают ли они с суммой 2. Возвращает FALSE для 2-битных чисел и TRUE для не 2-битных чисел.
Кажется немного неуклюжим проводить два разных вида тестов по существу для одной и той же функции, но почему-то получается довольно коротко ...

5 xash Sep 30 2020 at 19:53

J , 25 байт

0&<*10&#.inv+&(2=1#.*~)#:

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

Как это устроено

0&<*10&#.inv+&(2=1#.*.~)#:
0&<*                       input is a positive number
    10&#.inv               list of digits base 10
                        #: list of digits base 2
            +&(        )   OR the result of both …
                    *.~    square each digit (x>=2 will be larger than 2)
                 1#.       sum
               2=          is equal to two

Если есть число DecimalBinary, +as OR может привести к 2, таким образом, потребуется на один байт больше +..

5 UnrelatedString Sep 30 2020 at 20:15

Брахилог , 9 байт

ℕ{ḃc|}o11

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

Несколько смущало, что раньше я не подумал переводить подходы на основе сортировки других решений ...

Более интересное решение:

Брахилог , 10 байт

ℕ{|ẹ~ḃ}ḃ+2

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

ℕ             The input is a whole number (necessary to exclude -3 etc.),
 {|   }       which either unchanged or
   ẹ          with its decimal digits
    ~ḃ        interpreted as binary (impossible if any ≥ 2),
       ḃ      has binary digits
        +2    that sum to 2.

Брахилог , 12 11 байт

ℕ{ḃ|ẹ}<ᵛ²+2

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

-1 байт благодаря xash

ℕ              The input is a whole number,
 { | }         and either
  ḃ            its binary digits
    ẹ          or its decimal digits
      <ᵛ²      are all less than 2
         +2    and sum to 2.
5 Shaggy Sep 30 2020 at 20:48

Japt , 9 байт

Должен быть способ избавиться от этого хотя бы на один байт.

ìͶBªB¥¢ñ

Попробуйте или запустите все тестовые примеры

ìͶBªB¥¢ñ     :Implicit input of integer U
ì             :Convert to digit array
 Í            :Sort (and implicitly convert back to integer)
  ¶           :Test for strict equality with
   B          :11
    ª         :Logical OR with
     B¥       :Test 11 for equality with
       ¢      :Convert U to binary string
        ñ     :Sort
5 JoKing Oct 01 2020 at 12:52

Раку , 25 байт

{$_|.base(2)~~/^10*10*$/}

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

Проверяет, соответствует ли ввод или основание 2 ввода регулярному выражению ^10*10*$

4 Neil Sep 30 2020 at 21:54

Уголь , 21 13 байт

№⟦⁻θ0⁻⍘N²0⟧11

Попробуйте онлайн! Ссылка на подробную версию кода. Выводит логическое значение Charcoal, то есть -для двухбитового числа, если нет, то ничего. Порт ответа PHP @Kaddath. Пояснение:

   θ            Input as a string
  ⁻ 0           Remove zeros
       N        Input as a number
      ⍘ ²       Convert to base 2
     ⁻   0      Remove zeros
 ⟦        ⟧     Make into a list
№          11   Count occurances of literal string `11`
4 Lynn Sep 30 2020 at 22:19

Python 3 , 67 байт

lambda n:n>2in{g(n,2),g(n,10)}
g=lambda x,b:x and(x%b)**2+g(x//b,b)

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

Порт моего ответа на Haskell. (Я взял тестовый комплект из ответа Python ovs. Спасибо!)

4 RobinRyder Sep 30 2020 at 21:11

R , 71 64 байта

-7 байт благодаря Доминику ван Эссену

`+`=function(n,k)sum((n%/%k^(0:n)%%k)^2)-2
n=scan();n<0|n+2&n+10

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

Выходной FALSEсигнал перевернут: отображается, если вход является двухбитовым числом, а TRUEесли нет.

Вспомогательная функция +преобразует целое число в вектор цифр в базе k(нам нужно k=2и k=10). Затем сложите квадрат этих цифр. Эта сумма равна 2 в точности для двухбитового числа.

Произойдет сбой из-за ограничений памяти для больших входных данных, и в этом случае вы можете использовать 0:log2(n)вместо 0:nи ||вместо |: Попробуйте онлайн! .

4 GalenIvanov Sep 30 2020 at 20:08

Фактор , 79 74 байта

: n ( n -- ? ) [ 10 >base ] [ >bin ] bi [ 48 swap remove "11" = ] bi@ or ;

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

3 HyperNeutrino Sep 30 2020 at 20:34

Желе , 8 байт

,BṢ€Ḍ11e

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

Объяснение

,BṢ€Ḍ11e  Main Link
,         Pair the integer with
 B        Convert the integer to binary
  Ṣ€      Sort Each (sorts the digits of the integer implicitly)
    Ḍ     Convert from decimal to integer
     11e  Is 11 in this list?
3 NahuelFouilleul Sep 30 2020 at 23:34

Perl 5 -lp , 35 байт

$_=grep/^10*10*$/,$_,sprintf"%b",$_

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

возвращает 1 или 2 (если число может быть десятичным и двоичным двухбитным числом) для истины, 0 для ложного.

3 J42161217 Sep 30 2020 at 22:22

Wolfram Language (Mathematica) , 46 байт

!FreeQ[Tr/@(#~IntegerDigits~{10,2}^2),2]&&#>0&

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

-1 байт от @att

3 n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Oct 01 2020 at 14:42

PCRE Regex, 100 95 байт

^(((?(2)\2\2|.))*.)(?!\1)((?(3)\3\3|.))*.$|^(((?(5)\5{10}|.{9}))*.)(?!\4)((?(6)\6{10}|.{9}))*.$

Предположим, что вводится одинарный (отрицательные числа не поддерживаются).

Должен работать в вариантах с поддержкой условного регулярного выражения и обратной ссылки, объявленной вперед.

Регулярное выражение состоит из двух одинаковых частей, одна проверяет двоичную, а вторая - десятичную.

  • Код использует сумму геометрических рядов для соответствия 2 n и 10 n .
    1 + (1 + 2 + 2 2 + ... + 2 n ) = 2 n + 1
    1 + 9 * (1 + 10 + 10 2 + ... + 10 n ) = 10 n + 1

  • Затем он пытается разложить число на сумму 2 n + 2 k (или 10 n + 10 k для десятичного числа) и проверить, что 2 n ! = 2 k

Обновить:

  • Отбрасывает неиспользованную группу захвата
  • Капли $в (?!\1$)так это нормально , если мы отвергаем 2 п <2 K

regex101

3 MarcMush Oct 02 2020 at 22:12

Юлия , 61 байт

использование регулярного выражения в двоичном и десятичном представлении числа

x->any(match.([r"^0*10*10*$"],["$x",bitstring(x)]).!=nothing)

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

Юлия, 69 байт

путем сортировки знаков

x->any(endswith.(join.(sort.(collect.(["0$x",bitstring(x)]))),"011"))

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

3 SiimLiiser Oct 02 2020 at 20:46

Ruby 2.7, 44 байта

->n{[2,10].any?{n.to_s(_1).tr(?0,'')=='11'}}

Пояснение:

->n{                      # a lambda with one argument
    [2,10].any?{          # Return true if for either of 2 or 10...
      n.to_s(_1)          # input in that base
      .tr(?0,'')          # after removing all 0-s
      =='11'              # is exactly '11'
    }
}

Эквивалент в рубине <2.7, 46 байт

->n{[2,10].any?{|b|n.to_s(b).tr(?0,'')=='11'}}

Попробуй это

3 Neil Oct 03 2020 at 07:42

Retina 0.8.2 , 36 байт

^\d+
$*1¶$&
+`^(1+)\1
$+0 m`^10*10*$

Попробуйте онлайн! Ссылка включает в себя большинство тестовых случаев (более крупные приводят к нехватке памяти Retina). Пояснение:

^\d+
$*1¶$&

Если вход неотрицательный, добавьте к нему унарную копию.

+`^(1+)\1
$+0

Начните преобразование унарной копии в двоичную. На данный момент в результате слишком много нулей, но, к счастью, они не имеют значения.

m`^10*10*$

Соответствует любому числу как двухбитному числу.

3 GalenIvanov Sep 30 2020 at 20:18

K (ngn / k) , 25 24 байта

-1 байт благодаря ngn

{("11"~($x)^$0)+2=+/2\x}

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

2 Kaddath Sep 30 2020 at 20:39

PHP , 69 67 байт

echo($f=fn($s)=>str_replace(0,'',$s)==11)($argn)|$f(decbin($argn));

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

Довольно просто: обрабатывает каждый ввод как строку, заменяет все нули на ''и проверяет, равны ли они (примерно) 11или двоичный файл равен

РЕДАКТИРОВАТЬ: сохранено 2 байта, используя 0вместо'0'

2 ovs Sep 30 2020 at 21:48

APL (расширенный Dyalog) , 19 байт

2∊2 10(+.×⍨⊤)¨⊢×0<⊢

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

Прокомментировал:

                0<⊢  ⍝ Is the (right) argument greater than 0
              ⊢×     ⍝ Multiply this with the argument
                     ⍝   results in 0 for negative inputs
  2 10(     )¨       ⍝ Call the next function with each of the bases 2 and 10
                     ⍝   and the non-negative number as a right argument
           ⊤         ⍝ Convert number to base digits
       +.×⍨          ⍝ The sum of squares of the digits
2∊                   ⍝ Does this contain 2?
2 Noodle9 Sep 30 2020 at 21:31

С (gcc) , 75 \$\cdots\$ 76 80 байт

Добавлено 6 байт для исправления ошибки.

d;r;c;f(n){for(c=2,r=__builtin_popcount(n)!=2|n<0;n>0;n/=10)d=n%10,c-=d*d;r*=c;}

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

Возвращает ложное значение, если \$n\$ является двухразрядным числом ™ ️ или истинным в противном случае.

2 PkmnQ Sep 30 2020 at 20:32

Pyth , 22 16 байт

-6 байт благодаря @FryAmTheEggman

}11,v-Q\0v-.BQ\0

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

2 Phoenix Oct 02 2020 at 11:34

Python, 79 байт

lambda n:any(sum((ord(c)-48)**4 for c in f.format(n))==2for f in["{}","{0:b}"])

Объяснение

Я форматирую int как двоичное, так и десятичное. Для каждого символа я вычитаю '0'символ, затем увеличиваю его до степени 4. Это сопоставляется '0'с 0, '1'1, '2'16 и другими цифрами, а '-'символ - с числами больше 16. Затем я проверяю, равно ли суммирование 2 .

2 TomCarpenter Oct 03 2020 at 20:06

Октава , 67 64 байта

@(x,p=@(b,z=dec2base(x*(x>0),b)-48)all(z<2)&sum(z)==2)p(2)|p(10)

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

Если есть сомнения, сделайте код более запутанным. Как-то это экономит байты ...

@(x,                               % Main anonymous function with 'x' as input
    p=                             % Second input 'p' with default value (no second input is given when calling function) which
      @(b,                         % consists of another anonymous function which takes base as input
          z=                       % From which it creates a second input 'z' with default value
            dec2base(       ,b)    % Which runs dec2base (convert from integer to string) using provided base
                     x             % On the input to the main anonymous function
                      *(x>0)       % Multiplied by (x>0) to return false for any negative integer passed in.
                               -48 % And converts from a string to an array of integers (one per digit)
      )
      all(z<2)&                    % Two-bit numbers must only contain 0 or 1, so need all elements in array of digits <2.
               sum(z)==2           % Sum all digits. Two-digit number if sum is 2 (two 1's)
)
p(2))||                            % Run two-bit number check in base 2
       p(10)                       % Run two-bit number check in base 10
       

Первая попытка,

@(x,p=@(z)all(z<50)&&sum(z-48)==2)x>0&&p(dec2bin(x))||p(num2str(x))

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

@(x,                               % Main anonymous function with 'x' as input
    p=                             % Second input 'p' with default value (no second input is given when calling function)
      @(z)                         % Default value consists of another anonymous function to check if string is two-bit
          all(z<50)&&              % Two-bit numbers must only contain '0' or '1', so need all elements in string <'2'(50).
                     sum(z-48)==2  % Convert all characters from '0'/'1' to 0/1 and sum. Two-digit if sum is 2 (two 1's)
)
x>0&&                              % Short-circuit to return false for any negative integer passed in.
     p(dec2bin(x))||               % Convert to binary string and check if two-digit, or...
                    p(num2str(x))  % Convert to decimal string and check if two-digit
2 t-clausen.dk Oct 02 2020 at 19:37

T-SQL, 93 байта

Возвращает 1 для истины, 0 для ложи.

DECLARE @y INT=@,@x INT=9WHILE @>0SELECT
@x+=@%2,@/=2PRINT
IIF(11in(@x,replace(@y,0,'')),1,0)

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

2 Neil Oct 06 2020 at 16:42

Общее регулярное выражение, 58 байт

^((((1+)(?=\4$))+|^)1){2}$|^((((1+)\8{8}(?=\8$))+|^)1){2}$

Попробуйте онлайн! Ссылка включает тестовую программу, написанную на Retina 0.8.2, хотя само регулярное выражение должно работать в большинстве движков. Принимает ввод в подписанном одноместный , т.е. ^-?1*$. Объяснение: Дано, kи mмы можем написать конкретный тест для числа, являющегося суммой kразличных степеней, mпутем многократного деления mи вычитания 1 kразличных моментов времени, прежде чем мы в конечном итоге достигнем нуля:

^((((1+)\4{<m-2>}(?=\4$))+|^)1){<k>}$

где <m-2>и <k>представляют собой замены для конкретных тестируемых значений (с учетом тривиальных сокращений, таких как \4{0}запрет на выполнение операций). Это работает следующим образом:

    (1+)                                Find `i` such that
        \4{<m-2>}                       `i+(m-2)i=(m-1)i` is equal to
                 (?=\4$)                `n-i`, therefore `i=n/m`.
   (                    )+              Divide `n` by `m` at least once
  (                       |^)           Except on the first loop
 (                           1){<k>}    Decrement `k` distinct times
^                                   $   Consume entire input

Тогда проблема сводится к чередованию двух таких тестов.