Я грубый номер?


72

Некоторое время я сталкивался с проблемой при подсчете пальцев, в частности, то, что я могу сосчитать только до десяти. Мое решение этой проблемы состояло в том, чтобы посчитать двоичные числа на пальцах, поднять мой большой палец на один, мой указательный палец на два, большой палец и указательный палец на три и т. Д. Однако, когда мы добираемся до нас, мы сталкиваемся с небольшой проблемой. номер четыре. В частности, это требует, чтобы мы подняли средний палец, что приводит к довольно неудачному жесту, который обычно не принимается в обществе. Этот тип номера является грубым числом . Мы подходим к следующему грубому номеру в 36, когда мы поднимаем большой палец на нашей второй руке и средний палец нашей первой руки. Определение грубого числа - это любое число, которое в соответствии с этой системой подсчета приводит к тому, что мы ставим толькосредний палец любой руки. Как только мы передадим 1023 (максимальное число, достижимое для одного человека двумя руками по пять пальцев в каждой), предположим, что мы продолжим работу с третьей рукой, добавив дополнительные руки по мере необходимости.

Твое задание:

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

Входные данные:

Целое число от 0 до 10 9 (включительно).

Выход:

Истинное / ложное значение, которое указывает, является ли ввод грубым числом.

Тестовые случаи:

Input:    Output:
0   --->  falsy
3   --->  falsy
4   --->  truthy
25  --->  falsy
36  --->  truthy
127 --->  falsy
131 --->  truthy

Подсчет очков:

Это , поэтому выигрывает самая низкая оценка в байтах.


43
assume we continue with a third handКогда дело доходит до грубости, командная работа заставляет мечту работать.
Веска

5
@Veskah выясняется, что для оценки вопроса нужно всего 3 человека. Конечно, бьет старый вид счета на пальцах.
Грифон - Восстановить Монику

12
Хуже, если ты британец - тогда 6 тоже грубо!
Мэтью

1
Можно ли принимать входные данные в базе, отличной от 10?
Wastl

2
5 тоже кажется довольно грубым. Не уверен, что кто-то скажет: «О, у нее большой палец, это совершенно вежливо»
ale10ander

Ответы:



17

Регулярное выражение (ECMAScript), 37 байт

Ввод одинарный, как длина строки xs.

^((?=(x+)(\2{31}x*))\3)*(x{32})*x{4}$

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

^
(
    (?=(x+)(\2{31}x*))    # \2 = floor(tail / 32); \3 = tool to make tail = \2
    \3                    # tail = \2
)*                        # Loop the above as many times as necessary to make
                          # the below match
(x{32})*x{4}$             # Assert that tail % 32 == 4

13
Я думал, что знаю регулярные выражения, но, видимо, нет.
CT Hall

14

JavaScript (SpiderMonkey) , 23 байта

f=x=>x&&x%32==4|f(x>>5)

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

Это тривиальное решение, вы просто хотите конвертировать в базу 32 и проверить, есть ли в ней 4.


JavaScript (SpiderMonkey) , 26 байт

x=>x.toString(32).match(4)

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

Интересно, что /4/.test(...)стоит на один байт больше, чем ....match(4).



8

Рубин, 36 19 байт

->n{n.to_s(32)[?4]}

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

Сохранено 17 байт с помощью метода @tsh .


Это возвращает true для 2207, который имеет двоичное представление100010011111
Embodiment of Ignorance

@EmbodimentofIgnorance Это правильный результат, не так ли? Вторая рука есть 00100.
Ручка двери

Я не говорю на Руби. А почему нет ->n{n.to_s(32)=~/4/}?
TSH

1
@tsh, потому что я не такой умный, как ты :)
Дверная ручка

Простите, если я не понимаю вопроса, но не первая ли рука 2207 года 10001, вторая 00111и третья 11? Ни у кого из них только средний палец
Воплощение Невежества

8

APL + WIN, 10 байт

Запрашивает ввод целого числа

4∊(6⍴32)⊤⎕

Отмечая, что шесть рук необходимы для представления 10 ^ 9 преобразований в вектор из 6 элементов базового представления 32 и проверяет, существует ли 4 в каком-либо элементе.



6

Python 2 , 34 32 байта

f=lambda a:a%32==4or a>0<f(a/32)

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

2 байта благодаря тш


1
: | Вы можете редактировать сообщения, вы знаете, что правильно
только ASCII

Да; Я знаю. Это был несчастный случай! Авария, говорю тебе!
Час Браун

@tsh О, хорошо, забыл, что короткое замыкание
только ASCII

6

Машинный код x86, 17 байт

6A 20 59 85 C0 74 09 99 F7 F9 83 FA 04 75 F4 91 C3

Вышеуказанные байты определяют функцию, которая принимает число в качестве входных данных в EAXрегистре и возвращает результат в виде логического значения в EAXрегистре ( EAX== 0, если входное значение не является грубым числом EAX;! = 0, если входное значение является грубым числом ).

В читаемой человеком сборочной мнемонике:

; Determines whether the specified number is a "rude" number.
; Input:    The number to check, in EAX
; Output:   The Boolean result, in EAX (non-zero if rude; zero otherwise)
; Clobbers: ECX, EDX
IsRudeNumber:
    push    32           ; \ standard golfing way to enregister a constant value
    pop     ecx          ; /  (in this case: ECX <= 32)
CheckNext:
    test    eax, eax     ; \ if EAX == 0, jump to the end and return EAX (== 0)
    jz      TheEnd       ; /  otherwise, fall through and keep executing
    cdq                  ; zero-out EDX because EAX is unsigned (shorter than XOR)
    idiv    ecx          ; EAX <= (EAX / 32)
                         ; EDX <= (EAX % 32)
    cmp     edx, 4       ; \ if EDX != 4, jump back to the start of the loop
    jne     CheckNext    ; /  otherwise, fall through and keep executing
    xchg    eax, ecx     ; store ECX (== 32, a non-zero value) in EAX
TheEnd:
    ret                  ; return, with result in EAX

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


1
Интересная идея для использования idiv, хотя. Я не вижу каких-либо дополнительных улучшений в этом. Но посмотрите мой ответ : 14 байтов для цикла сдвига, который использует MOV / AND / SUB / JZ, чтобы проверить 5 младших битов на хамство.
Питер Кордес

4

Юлия 1,0 25 байт

f(n)=n%32==4||n>0<f(n>>5)

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

Юлия 1,0 , 26 байт

Альтернатива, которая на 1 символ короче, но на 1 байт длиннее, что тоже плохо, что требует 3 байта в юникоде.

n->'4'string(n,base=32)

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


Вы могли бы использовать n->n%32...для своего первого ответа на 2 байта короче?
Джузеппе

@ Giuseppe, к сожалению, нет, эта функция рекурсивная.
Кирилл Л.


4

Католик , 4 байта

ǔ?QǑ

Принимает число в виде строки со значением 256.

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

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


2
Хм, если это разрешено, то разрешено ли вместо этого принимать числа в базе 32?
рекурсивный

@recursive Вы можете заключить числа в <<и, >>и это позволяет числам больше 255 в них, как показано в наборе тестов.
Okx

1
Он был задуман как вопрос о вызове, но не очень ясно.
рекурсивный

4

C # (интерактивный компилятор Visual C #) , 31 байт

n=>{for(;n>0;n/=n%32==4?0:32);}

Выходы, выбрасывая исключение. Способ преобразования одного числа из десятичного в другое основание состоит в том, чтобы разделить десятичное число на это основание несколько раз и взять остаток как цифру. Это то, что мы делаем, и мы проверяем, имеет ли какая-либо из цифр значение 4 в base-32;

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


27? в качестве бонуса он не выводит странным образом
только ASCII

1
и что такое tplig
ASCII-только

@ ASCII-только n>31->n>0
TSH


1
Является ли программа остановкой, это не разрешенный метод вывода . Вывод через исключение разрешен.
Deadcode


3

R , 50 48 байтов

any(2^(0:4)%*%matrix(scan()%/%2^(0:34)%%2,5)==4)

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

Теперь используется аккуратный матричный подход (любезно предоставлено @Giueseppe). Он генерирует матрицу 5x7 битов, преобразует ее в серию из 32 целых чисел и проверяет любые 4.


@ Giuseppe Упс, совсем пропустил это. Должен работать сейчас, хотя, к сожалению, на 19 байт длиннее. Я не думаю, что есть обратная функция к strtoi, кроме шестнадцатеричной и восьмеричной в базе R
Ник Кеннеди

48 байтов с некоторой матрицей магии. Я считаю, что преобразование битов дольше, чем intToBitsтогда, но мы можем работать с ним, intsвместо того, чтобы rawзаканчивать тем, что сохранили байт - посмотрите, например, на этоintToBits
Giuseppe

@ Giuseppe это совершенно другое (и аккуратное) решение для меня - вы хотите, чтобы я обновил мой, или вы публикуете свое собственное?
Ник Кеннеди

ты можешь принять это. :-)
Джузеппе

1
Конечно, портирование одного из многих ответов, которые проверяют наличие цифры 4в числе base-32, составляет, о-о, 29 байтов .
Джузеппе



2

Древесный уголь , 6 байт

№⍘N³²4

Попробуйте онлайн! Ссылка на подробную версию кода. Вывод -s в зависимости от того, насколько грубое число. Объяснение:

  N     Input as a number
 ⍘      Convert to base as a string
   ³²   Literal 32
№       Count occurrences of
     4  Literal string `4`

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




2

Cubix , 26 байтов

u!@-W14;OIS%/\;;,p;?wO@u/s

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

Оборачивается на куб с длиной ребра 3 следующим образом

      u ! @
      - W 1
      4 ; O
I S % / \ ; ; , p ; ? w
O @ u / s . . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Смотреть это беги

Довольно простая реализация, без всех перенаправлений, которые она делает:

  • IS запускает программу нажатием ввода и 32 в стек
  • %4-! получает остаток и проверяет, равен ли он 4 вычитанием
  • 1O@ вывод 1, если это было 4 и остановка
  • ;;, очистить стек и сделать целочисленное деление
  • p;? очистить дно стека и проверить результат div на 0
  • O@ если результат div нулевой вывод и остановка
  • s поменяйте местами вершину стека и начните с шага 2 выше

2

@ Луис Я могу определенно отбросить G(не уверен, почему я включил его в первую очередь), но это только один байт (спасибо, что заметил это!). Переход 32YA52на 32_YA4такое же количество байтов не так ли?
Санчиз

Ах, да, я не могу сосчитать
Луис Мендо

2
@Luis Count? Кто должен считать, когда вы можете'32_YA4'n'32YA52'n-
Sanchises

2

Пакет, 77 45 байтов

@cmd/cset/a"m=34636833,n=%1^m*4,(n-m)&~n&m*16

Основано на этих хитростях . Объяснение: Необходимо проверить только 6 рук из-за ограниченного диапазона (30 бит) входного сигнала, который требуется поддерживать. Магическое число mэквивалентно 111111основанию 32, так что первая операция переключает грубые биты во входном номере. Затем остается выяснить, какая из 6 раздач сейчас равна нулю.


2

машинный код x86, 14 байт

(Тот же машинный код работает в 16-битном, 32-битном и 64-битном режимах. В 16-битном режиме он использует AX и DI вместо EAX и EDI в 32- и 64-битном режиме.)

Алгоритм: проверьте младшие 5 битов x & 31 == 4, затем сдвиг вправо на 5 битов и повторите, если результат сдвига не равен нулю.

Вызывается из C в char isrude(unsigned n);соответствии с соглашением о вызовах System V. x86-64. 0 - правда, не-0 - ложь (это asm, а не C 1 ).

 line   addr    code bytes
  num
     1                             ; input:  number in EDI
     2                             ; output: integer result in AL: 0 -> rude, non-zero non-rude
     3                             ; clobbers: RDI
     4                         isrude:
     5                         .check_low_bitgroup:
     6 00000000 89F8               mov    eax, edi
     7 00000002 241F               and    al, 31          ; isolate low 5 bits
     8 00000004 2C04               sub    al, 4           ; like cmp but leaves AL 0 or non-zero
     9 00000006 7405               jz    .rude            ; if (al & 31 == 4) return 0;
    10                         
    11 00000008 C1EF05             shr    edi, 5
    12 0000000B 75F3               jnz   .check_low_bitgroup
    13                             ;; fall through to here is only possible if AL is non-zero
    14                         .rude:
    15 0000000D C3                 ret


    16          0E             size:  db $ - isrude

Это использует преимущества краткой формы op al, imm8для AND и SUB. Я мог бы использоватьXOR al,4 для получения 0 на равенстве, но SUB работает быстрее, потому что он может слиться с JZ в один и тот же ответвление в семействе Sandybridge.

Интересный факт: использование флага-результата смещения более чем на 1 будет медленным на семействе P6 (передний конец останавливается, пока смена не сойдет), но это нормально.


Сноска 1: Это функция на ассемблере, и в x86 asm есть и то, jzи другое jnz, поэтому в соответствии с мета я могу выбрать любой путь Я не собираюсь, чтобы это соответствовало C истина / ложь.

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


2

ES6, 31 30 26 байт

b=>b.toString(32).match`4`

Не стесняйтесь высказывать идеи о том, как уменьшить это дальше, если таковые имеются.


Добро пожаловать в PPCG!
Лайкони

Вам не нужно считать имя своей функции, и хотя я думаю, что вы можете сохранить байт с помощью test, вы можете сохранить два байта, сопоставив их 4как число и разрешив matchпреобразовать это в строку, а затем получить RegExp для вас. ,
Нейл

1

Сетчатка 0.8.2 , 31 байт

.+
$*
+`(1+)\1{31}
$1;
\b1111\b

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Выходы ноль, если число не является грубым. Работает путем преобразования входных данных в унарное, а затем в унарно-кодированное основание 32 и подсчета числа 4s в результате.




1

Wolfram Language (Mathematica) , 37 байтов 36 байтов 29 байтов

-2 байта Джонатан Фрех

#~IntegerDigits~32~MemberQ~4&

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

31-байтовое решение:

MemberQ[IntegerDigits[#,32],4]&

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


Привет и добро пожаловать в PPCG. В вашем нынешнем выражении ваше выражение является единственным логическим значением. Пожалуйста, исправьте свой ответ, чтобы он был либо полной программой, либо функцией ( ...#...&часто используется в Mathematica).
Джонатан Фрех

Привет. Это то, что вы имеете в виду?
Райнер Глюге

Пожалуйста, используйте tio.run/#mathematica вместо W | A, чтобы убедиться, что это правильный код mathematica: P и [n]в конце вам не нужен , только &. Кроме того, поскольку записи имеют историю редактирования, хорошо пропустить предыдущие записи, и соглашение для старых оценок<s>40</s> <s>36</s>
только ASCII

Да. Это то, что я имел в виду. 29 байт .
Джонатан Фрех

Думаю, мне нужно привыкнуть к стилю функционального программирования.
Райнер Глюге

1

Java 8, 28 22 21 байт

n->n%32==4|n>>5%32==4

Вдохновленный ответом @ kevin-cruijssen . Работает только на 2 руки.

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

Объяснение:

n->                 // Method with int parameter and boolean return-type
  n%32              // Only consider right 5 bytes (fingers)
  ==4               // Middle finger
  | ... n>>5       // Repeat with shifted bits for other hand

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