Палиндромные числа с бинарным поворотом


29

Предупреждение: это НЕ вызов "Эй, давайте нарисуем торт в ASCII-искусстве"! Пожалуйста, продолжайте читать;)

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

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

   33   
--------

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

 100001
--------

Я вижу, что как десятичные, так и двоичные числа моего возраста являются палиндромными!

Вызов

Я хочу знать, можно ли поставить любое другое число на торт со свечами и быть палиндромным, десятичным и двоичным.

Напишите программу / функцию для проверки, является ли число палиндромным как в десятичном, так и в двоичном виде. Но подождите, это еще не все: в двоичном для теста учитываются ведущие нули!

вход

Десятичное число х , что я хочу проверить , если это день рождения палиндромический с 0 <х <2 32 -1 (да, люди в моем измерении живут очень долго)

Выход

Правда, если он соответствует именно этим двум условиям, Фальси еще:

  • Десятичное представление числа является стандартным палиндромом
  • Двоичное представление числа является стандартным палиндромом, и добавление начальных нулей может помочь в этом

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

1 > 1 => Truthy
6 > 110 (0110) => Truthy
9 > 1001 => Truthy
10 > 1010 (01010) => Falsey, 10 is not palindromic
12 => 1100 (001100) => Falsey, 12 is not palindromic
13 => 1101 (...01101) => Falsey, neither 13 nor 1101 are palindromic
14 => 1110 (01110) => Falsey, 14 is not palindromic
33 > 100001 => Truthy
44 > 101100 (..0101100) => Falsey, 101100 is not palindromic
1342177280 > 1010000000000000000000000000000 (00000000000000000000000000001010000000000000000000000000000) => Falsey, 1342177280 is not palindromic (but the binary representation is)
297515792 > 10001101110111011101100010000 (000010001101110111011101100010000) => Truthy

правила

Удачи, и в итоге с днем ​​рождения!



6
Возможно, стоит сменить название, так как часть дня рождения не имеет отношения к делу.
NoOneIsHere

@NoOneIsHere хорошо, проблема о свечах на торте ко дню рождения. Также есть поворот в двоичном представлении, так что это не "общие палиндромные числа". Если за ваш комментарий проголосовали, я придумаю другой заголовок.
Гуфалит

Таким образом, согласно правилам, 0b01010000000000000000000000000000не является палиндромным, так как для этого потребуется добавить больше нулей и, следовательно, превысить 2 ^ 32-1? В этом случае было бы 1342177280полезно добавить что-то вроде тестового примера Фэлси.
Кристиан Лупаску

1
@ w0lf Я не писал ограничения на добавление нулей, но я понимаю вашу проблему переполнения стека;) Кроме того, 1342177280это не десятичное палиндромное значение, так что Falsey. Редактирование
Goufalite

Ответы:


17

05AB1E , 7 байтов

b0Ü‚DíQ

Попробуйте онлайн! или как тестовый набор

объяснение

b         # convert input to binary
 0Ü       # remove trailing zeroes
   ‚      # pair with input
    D     # duplicate
     í    # reverse each (in the copy)
      Q   # check for equality

Бифуркат не помог?
Волшебная Урна Осьминога

@MagicOctopusUrn: К сожалению, нет, так как я хочу изменить каждое число в списке, а не сам список.
Emigna

11

Python 3 , 59 байт

lambda a:all(c==c[::-1]for c in[str(a),bin(a).strip('0b')])

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

-3 байта благодаря Роду
-3 байта благодаря Коннору Джонстону



1
использование полосы со строками удалит отдельные символы: [bin (a) [2:]. strip ('0') => bin (a) .strip ('0b')] ( tio.run/… "Python 3 - Попробуйте Это онлайн ")
Коннер Джонстон

@ConnerJohnston о круто, спасибо!
HyperNeutrino

8

JavaScript (ES6), 65 байт

Возвращает 0или 1.

n=>(g=b=>[...s=n.toString(b)].reverse().join``==s)()&g(2,n/=n&-n)

Как?

Вспомогательная функция g () принимает целое число b в качестве входных данных и проверяет, является ли n палиндромом в базе b . Если b не указан, он просто конвертирует n в строку перед тестированием.

Мы избавляемся от конечных нулей в двоичном представлении n , выделяя наименее значимое 1 с помощью n&-nделения n на полученную величину.

Забавный факт: это правда, 0потому что (0/0).toString(2)равняется "NaN", что является палиндромом. (Но 0в любом случае это неверный ввод.)

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


5

Mathematica, 52 49 байт

i=IntegerReverse;i@#==#&&!i[#,2,Range@#]~FreeQ~#&

Попробуйте на Wolfram Sandbox

использование

f = (i=IntegerReverse;i@#==#&&!i[#,2,Range@#]~FreeQ~#&);

f[6]

True

f /@ {9, 14, 33, 44}

{True, False, True, False}

объяснение

i=IntegerReverse;i@#==#&&!i[#,2,Range@#]~FreeQ~#&

i=IntegerReverse                                   (* Set i to the integer reversing function. *)
                 i@#==#                            (* Check whether the input reversed is equal to input. *)
                       &&                          (* Logical AND *)
                          i[#,2,Range@#]           (* Generate the binary-reversed versions of input, whose lengths *)
                                                   (* (in binary) are `{1..<input>}` *) 
                                                   (* trim or pad 0s to match length *)
                                        ~FreeQ~#   (* Check whether the result is free of the original input *)
                         !                         (* Logical NOT *)

Версия со встроенным PalindromeQ

PalindromeQ@#&&!IntegerReverse[#,2,Range@#]~FreeQ~#&


3

Japt , 14 байт

s ꬩ¢w n2 ¤ê¬

Проверьте это онлайн!

объяснение

 s ê¬ © ¢   w n2 ¤  ê¬
Us êq &&Us2 w n2 s2 êq   Ungolfed
                         Implicit: U = input integer
Us êq                    Convert U to a string and check if it's a palindrome.
        Us2 w            Convert U to binary and reverse. 
              n2 s2      Convert to a number, then back to binary, to remove extra 0s.
                    êq   Check if this is a palindrome.
      &&                 Return whether both of these conditions were met.

Придумали пару похожих решений на 13 байтов: sêQ *(¢w)sêQиsêQ &¢w n sêQ
Shaggy

@Shaggy Спасибо, но, к сожалению, оба они не работают 297515792(обратный двоичный код, преобразованный в десятичный, слишком велик для обработки JS) ...
ETHproductions


2

APL, 27 31 байт

∧/(⌽≡⊢)∘⍕¨{⍵,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢⍵}

Как это работает? Используя 6 в качестве аргумента ...

      2⊥⍣¯1⊢6 ⍝ get the bit representation
1 1 0

      ⌽2⊥⍣¯1⊢6 ⍝ reverse it (if it's a palindrome, it doesn't matter)
0 1 1

      {⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6 ⍝ drop off the trailing (now leading 0's)
1 1

      6,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6 ⍝ enclose and concatenate the bits to the original number
┌─┬───┐
│6│1 1│
└─┴───┘

      (⌽≡⊢)∘⍕ ⍝ is a composition of
      ⍕ ⍝ convert to string and 
      (⌽≡⊢) ⍝ palindrome test

      (⌽≡⊢)∘⍕¨6,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6 ⍝ apply it to each of the original argument and the bit representation
  1 1

      ∧/(⌽≡⊢)∘⍕¨6,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6  ⍝ ∧/ tests for all 1's (truth)
  1

Попробуйте это на TryAPL.org


Согласно спецификации, 6 должен быть хорошим вводом, но предоставленное выражение возвращает false.
lstefano

Ах, крысы! Вот что я получаю за то, что не прочитал проблему целиком. Хороший улов. Спасибо! Я исправил немного более длинное, но, надеюсь, более правильное решение.
Брайан Беккер

Добро пожаловать в PPCG. Хороший первый пост! К сожалению, ваше представление в его нынешнем виде не является ни программой, ни функцией. Не беспокойтесь, вы можете превратить это в функцию, но позволяя внешним скобкам заключать весь код.
адам

Сохранить три байта: {(⌽¨≡⊢)⍕¨⍵,⊂(⌽↓⍨~⊥~)2⊥⍣¯1⊢⍵}(это хорошая форма , чтобы обеспечить связь для запуска всего набора тестов)
адам


1

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

↔?ḃc↔.↔

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

Это много ...

объяснение

С неявным вводом и выводом код: ?↔?ḃc↔.↔.

?↔?        The Input is a palindrome
   ḃ       Convert it to the list of its digits in binary
    c      Concatenate it into an integer
     ↔     Reverse it: this causes to remove the trailing 0's
      .↔.  The resulting number is also a palindrome

1

APL (Dyalog Classic) , 26 байтов

{≡∘⌽⍨⍕⍵,⍵,⍨(<\⊂⊢)⌽2⊥⍣¯1⊢⍵}

объяснение

                  2⊥⍣¯1⊢⍵  encode  as binary
                          reverse
           (<\⊂⊢)          partition from first 1
      ⍵,⍵,⍨                prepend and append 
                         turn into text string
≡∘⌽⍨                       match text with its reverse (fX is XfX, where f is a composed function that reverses its right argument and matches with left)

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


Ох, ты вне игры в гольф BB!
Адам


1

Пыть , 10 байт

Возвращает [1], если истина, [0], если ложь

ĐɓƖ₫áĐ₫=ʁ∧

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

Объяснение:

              Implicit input
Đ             Duplicate input
ɓ             Get input in binary (as string)
Ɩ             Cast to integer
₫             Reverse the digits (this removes any trailing zeroes)
á             Push the stack into a list
Đ             Duplicate the list
₫             Reverse the digits of each element of the list
=             Are the two lists equal element-wise
ʁ∧            Reduce the list by bitwise AND

0

Сетчатка , 72 байта

.+
$*_;$&
+`(_+)\1
$+0
0_
_
0+;
;
+`\b(\w)((\w*)\1)?\b
$3
(\B;\B)|.*
$.1

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Работает, создавая одинарный дубликат исходного числа, но используя _s, чтобы его не перепутать, например, с помощью ввода 11. Унарное число затем преобразуется в «двоичный», а завершающие нули удаляются. Затем палиндромы последовательно усекаются, и на последнем этапе проверяется, осталось ли что-нибудь еще.




0

Gaia , 10 байт

ṙṭ@ḍ2⁻Πbṭ∧

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

объяснение

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

ṙ           String representation of number
 ṭ          Is palindromic?
  @         Push input again
   ḍ        Prime factors
    2⁻      Remove all 2s
      Π     Product
       b    Convert to binary
        ṭ   Is palindromic?
         ∧  Logical and

0

C (gcc) , 105 байт

r(n,b){int s=0,c=n;for(;n;n/=b)s=s*b+n%b;return s==c;}
c;f(n){for(c=n;c%2<1;c/=2);return r(n,10)&r(c,2);}

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


Вы можете заменить оба вхождения return с n=. ( 95 байт. )
Джонатан Фрех

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

0

C # (.NET Core) , 130 129 179 173 + 23 байта

Несколько слов, спасибо Эд Марти за то, что он указал, что мне нужно проверить, сколько пэдов набито впереди для палиндрома. И мне нужно убедиться, что я могу проверить до х ^ 32 -1.

x=>{var a=Convert.ToString(x,2);var b=x+"";Func<string,bool>p=z=>z.SequenceEqual(z.Reverse());return new int[a.Length].Select((_,z)=>p(new string('0',z)+a)).Any(z=>z)&p(b);}

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


1
Вы можете удалить пробел между 129 байтамиreturn и (для них
г-н Xcoder

Это работает только при добавлении не более одного начального 0, но проблема заключается в том, что допускается несколько ведущих нулей.
Эд Марти

@EdMarty, который был обработан, а также ошибка переполнения стека.
Dennis.Verweij

Вы пропустили using System;иusing System.Linq
LiefdeWen

или это +23 байта?
LiefdeWen

0

Python 2 , 56 байт

lambda n:all(s==s[::-1]for s in(`n`,bin(n).strip("0b")))

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

Использование языка Python stripметода как ИЗВЛЕКИТЕ bin(..)выход «s Ведущее 0b и замыкающих нули двоичного числа (как они всегда будут иметь соответствующий бит).


0

Pyth , 25 22 19 18 17 байт

- 3 6 7 8 байт при дальнейшем изучении языка

Ks_.Bsz&_IzqKs_`K

Объяснение:

Ks        Set K to the integer version of...
 _.BsJ    Reverse string of the binary input
&         And
 _Iz      Is the input equal to the reverse of itself?
 qKs_`K   Is K equal to int(the reverse of basically string(K))

Я уверен, что это может быть в гольфе, я буду работать над этим.

Тестирование


0

PHP, 69 + 1 байт

$q=trim(decbin($p=$argn),0);if(strrev($p)==$p&&strrev($q)==$q)echo$p;

Запустить как трубу с -nR
Echoes оригинальный ввод для правды / ничего для фальси

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


0

Октава , 68 66 байт

@(x)all([d=num2str(x) b=deblank(['' dec2bin(x)-48])]==flip([b d]))

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

Первичное предложение от Octave.

Мы в основном создаем массив, содержащий число в виде десятичной строки и число в виде двоичной строки с удаленными конечными нулями. Затем мы создаем массив с такими же строками, но с перевернутыми двоичными и десятичными числами. Наконец, сравниваются оба массива, и результат либо true, если они совпадают (оба палиндрома), либо false, если они не совпадают (один или оба не палиндромы).


  • Сохраните 2 байта, используя flipвместо fliplr.

0

APL2 (не Dyalog), 36 байт

(N≡⌽N←⍕N)^∨/(((⌽B)⍳1)↓B)⍷B←(32⍴2)⊤N←

Сначала позвольте B быть 32-битным представлением N:

B←(32⍴2)⊤N

Затем отразите В и найдите положение 1-го 1:

(⌽B)⍳1

Затем отбросьте столько позиций из B. Это сохранит правильное количество ведущих нулей.

Затем выполните FIND и OR-REDUCTION, чтобы увидеть, содержит ли обрезанный B свое зеркало.

Теперь давайте посмотрим на N, десятичное. Самое левое выражение в скобках преобразует N в символьный вектор и проверяет, соответствует ли оно собственному зеркалу.

Наконец, AND объединяет две проверки.


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


1
Добро пожаловать в PPCG!
Мартин Эндер

Добро пожаловать в PPCG! Для менее читерской версии вы можете добавить quad ( ), чтобы сделать ее полноценной программой? Кроме того, вы можете сократить до (N≡⌽N←⍕N)^∨/(B↓⍨1⍳⍨⌽B)⍷B←(32⍴2)⊤N←⎕?
Эрик Outgolfer

Эрик, спасибо за проверку! Я уверен, что это можно улучшить, но в APL2 у меня нет ⍨ болтовни.
Маппо

0

Java 8, 105 104 байта

n->{String t=n+n.toString(n,2).replaceAll("0*$","")+n;return t.contains(new StringBuffer(t).reverse());}

Объяснение:

Попробуй это здесь.

n->{                         // Method with Integer parameter and boolean return-type
  String t=n                 //  Create a String `t` starting with the input Integer
    +n.toString(n,2)         //  Append the binary representation of the input Integer,
      .replaceAll("0*$","")  //   with all trailing zeroes removed
    +n;                      //  Append the input Integer again
  return t.contains(new StringBuffer(t).reverse());
                             //  Return true if `t` is a palindrome
}                            // End of method
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.