Если вы выразите некоторое положительное целое число в двоичном коде без ведущих нулей и замените каждое 1
на a, (
а каждое 0
на a )
, тогда совпадут ли все скобки?
В большинстве случаев они не будут. Например, 9 находится 1001
в двоичном формате, который становится там ())(
, где совпадают только первые две скобки.
Но иногда они будут совпадать. Например, 44 является 101100
двоичным, что становится ()(())
, где все левые скобки имеют соответствующие правые скобки.
Напишите программу или функцию, которая принимает положительное целое число из десяти целых чисел и печатает или возвращает истинное значение, если версия числа в двоичных скобках имеет все совпадающие скобки. Если это не так, выведите или верните ложное значение.
Самый короткий код в байтах побеждает.
Связанная последовательность OEIS.
Правдивые примеры ниже 100:
2, 10, 12, 42, 44, 50, 52, 56
Ложные примеры ниже 100:
1, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 45, 46, 47, 48, 49, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
Ответы:
TeaScript , 9 байтов
16 18 20 22 24Сохранено 2 байта благодаря @ETHproductions
Ого. Это коротко. Использует подход @ xnor. Это будет использовать рекурсивную функцию replace (
W
), которая заменит все10
равные()
ничем. Если строка пуста, она сбалансирована.Используя версию TeaScript, созданную после публикации этого запроса, это может стать 7 байтов:
Ungolfed
объяснение
источник
~--c
это ложь в том же сценарии, что иc--
.Pyth, 10 байт
Попробуйте этот набор тестов в компиляторе Pyth.
Как это работает
источник
!u:G`Tk.BQ
. Возможно, легче понять.Python2, 87 байт
Ужасная реализация, которая злоупотребляет синтаксическими ошибками.
источник
JavaScript (ES6),
555451 байтСохраненные байты благодаря @ Vɪʜᴀɴ и @xsot !
объяснение
источник
f=
. Вы также можете использовать use+c
вместоc|0
case для целого числа. Вы также можете использовать,(+c?d++:d--)
что еще корочеf=
? Потому что многие другие JavaScript-ответы на сайте называют свои функции.11
,true
когда он должен вернутьсяfalse
n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2
Python 2, 45 байт
Рекурсивная функция. Считывает двоичные цифры
n
с конца, сохраняя счетi
текущего уровня вложенности паренов. Если он падает ниже0
, отклонить. Когда мы дойдем до начала, проверяем, есть ли счет0
.На самом деле, мы начинаем отсчет,
i=1
чтобы было легко проверить, упал ли он0
. Единственный случай успеха терминала -n==0
иi==1
, проверенный сn<i<2
. Мы заставляем эту проверку произойти, еслиn==0
, или если онаi
падает0
, и в этом случае она автоматически завершается неудачейfeersum сэкономил два байта, реструктурировав нерекурсивные случаи с неравенствами к короткому замыканию.
источник
f=lambda n,i=1:n>0<i*f(n/2,i+(-1)**n) or n<i<2
, по крайней мере, сохраняет 1.CJam, 11 байт
Это немного нечисто: для чисел, вводимых в скобки, будет напечатан один или несколько блоков. Для чисел, не являющихся родительскими, он будет аварийно завершать работу, ничего не печатая в STDOUT. Если вы попробуете это онлайн в интерпретаторе CJam , имейте в виду, что он не различает STDOUT и STDERR.
Поскольку непустые / пустые строки в CJam являются правдивыми / ложными, а напечатанный вывод всегда является строкой, он, вероятно, соответствует правилам. При добавленной стоимости еще 3 байта, в общей сложности 14 байтов , мы можем фактически оставить в стеке правдивую или ложную строку , которая будет напечатана:
Это по-прежнему происходит сбой для чисел, не являющихся родительскими, которые разрешены по умолчанию .
Тестовые прогоны
Как это работает
CJam, 15 байтов
Попробуйте эту скрипку в интерпретаторе CJam или проверьте все тестовые случаи одновременно .
Как это работает
источник
Python, 51 байт
Анонимная функция. Оценивает выражение, которое выглядит как
Каждая замена удаляет все
10
, что соответствует()
. После того, как все замены были сделаны, функция возвращает, является ли то, что осталось, только двоичным префиксом0b
. Дляn
замены более чем достаточно , так какk
число -d занимает самое большее количествоk/2
шагов, а его значение больше2**k
.источник
Руби, 40
Простая обработка строк. Сбрасывает «10», пока не останется ни одного.
источник
Серьезно , 17 байтов
Выходы
0
для ложных и1
истинных. Попробуйте онлайн .Объяснение:
источник
Japt, 23 байта
Japt - это сокращенная версия Ja vaScri pt . переводчик
Это напоминает мне, насколько далеко еще должен пройти Japt по сравнению с TeaScript. После обновления переводчика в следующие несколько дней я бы хотел добавить в «ярлыки» символы типа Vɪʜᴀɴ.
Как это работает
Вскоре после этого испытания @ Vɪʜᴀɴ (теперь известный как @Downgoat) помог мне реализовать функцию рекурсивной замены, как
W
в ответе на TeaScript. Это означает, что этот вызов теперь можно выполнить всего за 5 байтов:Проверьте это онлайн!
источник
Mathematica, 49 байтов
источник
1,0
из списка и проверьте, является ли результат пустым списком.Октава, 48 байт
источник
C ++,
10494 байтаЗапустить с этим компилятором , необходимо указать стандартный ввод перед запуском.
объяснение
n>>=1
.c+=n&1?-1:1
ведет учет открытых скобок)
.n&c>=0
останавливается, когда остаются только начальные 0 или закрывающая скобка больше, чем открывается.источник
Haskell,
4946 байтовПример использования:
f 13
->False
.Я отслеживаю уровень вложенности,
l
как и многие другие ответы. Тем не менее, «сбалансированный» случай представлен1
, как и «более-)
чем-(
» случай0
.PS: нашел корректировку уровня вложенности
l+(-1)^n
в ответе xnor .источник
signum
Кажется слишком сложным, как насчет просто_#0=1<0
?l>0
вместоl==1
?l==1
сбалансировано. Еслиl>1
круглые скобки не разбиты.Python 2,
6057565553525049 байтовСпасибо xnor за сохранение двух байтов и feersum за доведение окончательного числа байтов до 49!
объяснение
Входной номер,
n
обрабатывается от его младшего значащего бита.i
это счетчик, который отслеживает количество 0 и 1. Обратите внимание, что он инициализирован1
для сохранения байта. Цикл будет прерван до того, какn
достигнет 0, если число 1 превысит число 0 (i<=0
).Для того, чтобы скобки были сбалансированы, необходимы два условия:
i==1
)n==0
). Изменить: я понял, что это условие не является необходимым, так какi
должно быть не положительным, еслиn!=0
так достаточно предыдущего условия.источник
i
иn
неотрицательны, тоi==n==0
естьi+n==0
.i
может быть отрицательным, если цикл прерывается преждевременно.i|n==0
всегда должно работать.while i*n
должен работатьJavaScript ES5,
11887858277 байтИнтересная техника на мой взгляд. Минус, черт возьми, благодаря @ETHproductions и @NotthatCharles
JavaScript ES6,
77575654 байта-21 байт для ETHпродукции.
источник
function p(x){x=x.toString(2);r=/10/;while(x.search(r)>=0){x=x.replace(r,"")}return!x}
x=>([...x=x.toString(2)].map(_=>x=x.replace(/10/,"")),!x)
хитрость заключается в том, чтобы переместить цикл while в a.map
, поскольку на входе никогда не бывает больше десяти, чем его длина.map
.x=>[...x=x.toString(2)].map(_=>x=x.replace(/10/,""))&&!x
IDK, если он может стать короче, хотя.D
209170 байтЭто делает именно то, что он должен делать без каких-либо дополнений или преимуществ.
источник
C 67 байт
В значительной степени порт моего представления Python.
источник
Пролог, 147 байт
Как это работает
Преобразует десятичное число N в двоичное представление в виде списка (в обратном порядке). Смысл:
Затем:
Повторяется по списку [H | T], увеличивая N, если элемент head равен 0, в противном случае его уменьшают.
Если N в любой точке становится отрицательным или если N в конце не равно 0, возвращает false, иначе true.
Разрез в
Есть ли, чтобы предотвратить откат и найти недвоичные решения для b (N, [N])?
Тестирование
Попробуйте онлайн здесь.
Запустите его с помощью запроса:
источник
PowerShell, 106 байт
Не собираюсь выигрывать соревнования на самую короткую длину, это точно. Но эй, по крайней мере, это бьет Java?
Использует очень длинный вызов .NET
[convert]::ToString($a,2)
для преобразования нашего входного номера в строку, представляющую двоичные цифры. Затем мы за цикл по этой строке с1..$b.length|%{..}
. В каждом цикле, если наша цифра является1
(оценивается с помощью,%2
а не-eq1
для сохранения пары байтов), мы увеличиваем наш счетчик; иначе мы уменьшаем его. Если мы когда-либо достигнем отрицательного значения, это означает, что их было больше,)
чем(
встречалось, поэтому мы выводим0
иexit
. Как только мы закончим цикл,$c
будет либо одно,0
либо какое-то число>0
, поэтому мы берем логическое, а не!
его число, которое получает вывод.Это имеет причуду вывода,
0
если парены не соответствуют, потому что у нас больше)
, но вывод,False
если парены не соответствуют, потому что у нас больше(
. По сути, функционально эквивалентные ложные высказывания, просто интересные. Если все символы совпадают, выходыTrue
.источник
GNU Sed (с расширением eval), 27
У Седа на самом деле нет четкого представления о правдивости и ложности, поэтому здесь я утверждаю, что пустая строка означает правдивость, а все остальные строки означают ложь.
Если это не приемлемо, тогда мы можем сделать следующее:
GNU Sed (с расширением eval), 44
Это выводит 1 для истины и 0 в противном случае.
источник
𝔼𝕊𝕄𝕚𝕟 (ESMin), 21 символ / 43 байта
Try it here (Firefox only).
Обратите внимание, что здесь используются переменные, предопределенные для чисел (в частности, 2 и 0). Есть предопределенные числовые переменные от 0 до 256.
19 символов / 40 байтов, неконкурентный
Try it here (Firefox only).
Решили реализовать неявный вывод ... Однако предыдущие формы вывода все еще поддерживаются, поэтому вы получаете несколько вариантов вывода!
источник
Java,
129131 байтВероятно, может быть сокращено. Объяснение, чтобы прийти. Спасибо Geobits за 4 байта!
источник
int k=0;
сint j=0;
?int k=0,j=0;for(...
затем вы можете поместитьchar[]
объявление внутри инициализатора цикла, чтобы также сохранить точку с запятой.C ++, 61 байт
Я думаю, что текущий ответ C ++ неверен: он возвращает истинное значение для всех четных чисел, например, 4. Отказ от ответственности: я не смог использовать упомянутый компилятор, поэтому я использовал g ++ 4.8.4. Проблема заключается в использовании двоичного оператора AND вместо логического AND, который используется для раннего прерывания, когда количество закрывающих скобок превышает количество открывающих скобок. Этот подход может работать, если
true
он представлен в виде слова с полностью истинным битовым шаблоном. В моей системе и, возможно, в большинстве других системtrue
это эквивалентно1
; только один бит верен. Такжеn/=2
короче чемn>>=1
. Вот улучшенная версия как функция:источник
𝔼𝕊𝕄𝕚𝕟 (очень неконкурентоспособно), 6 символов / 8 байт
Try it here (Firefox only).
Я решил вернуться к этой проблеме через очень, очень долгое время. Got стало намного лучше.
Причина, по которой это отдельный ответ, заключается в том, что две версии почти полностью отличаются.
объяснение
Преобразует входные данные в двоичные, рекурсивно заменяет 10 экземпляров, а затем проверяет, является ли результат пустой строкой.
источник
C # 98 байт
открыт для любых предложений. мне нравится этот вызов, даже если он старый
источник