Я чистий номер?


72

Деякий час я вже стикався з проблемою, коли рахував на пальцях, зокрема, що можу рахувати лише десять. Моє рішення цієї проблеми полягало в тому, щоб підрахувати двійкові на пальцях, піднявши великий палець на один, мій вказівний палець на два, і великий, і вказівний палець на три тощо. Однак ми стикаємося з проблемою, коли дістаємось до число чотири. Зокрема, це вимагає від нас підняти середній палець, що призводить до досить невдалого жесту, який зазвичай не приймається в суспільстві. Цей тип числа - грубе число . Ми приходимо до наступного грубого числа в 36, коли піднімаємо великий палець на другій руці та середньому пальці першої руки. Визначення грубого числа - це будь-яке число, яке за цією системою підрахунку призводить до того, що ми виставляємо лише нассередній палець будь-якої руки. Як тільки ми проходимо 1023 (максимальна кількість досяжних для однієї людини з двома руками по п’ять пальців кожна), припустимо, що ми продовжуємо третю руку, додавши додаткові руки, якщо потрібно.

Ваше завдання:

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

Вхід:

Ціле число від 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

Regex (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
Я думав, що знаю регекс, але, мабуть, ні.
Зал КТ



8

Рубі, 36 19 байт

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

Спробуйте в Інтернеті!

Збережено 17 байт методом @tsh .


Це повертається істиною для 2207, у якому є двійкове представлення100010011111
Втілення Незнання

@EmbodimentofIgnorance Це правильний результат, чи не так? Друга рука - це 00100.
Дверна ручка

Я не розмовляю Рубі. Але чому б і ні ->n{n.to_s(32)=~/4/}?
tsh

1
@tsh, тому що я не такий розумний, як ти :)
Doorknob

Пробачте, якщо я не розумію питання, але це не перша рука 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 байти завдяки tsh


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 байти в unicode

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 # Interactive Compiler) , 31 байт

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

Виводить, кидаючи виняток. Те, як перетворити одне число з десяткового на інше, полягає в тому, щоб ділити десяткове число на це число повторно, а решту приймати як цифру. Це ми робимо, і ми перевіряємо, чи будь-яка з цифр має значення 4 в базовій-32;

Спробуйте в Інтернеті!


27? як бонус він не видається дивним чином
лише ASCII

1
також те, що tplig
лише ASCII

@ ASCII only 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 байт довше. Я не думаю, що в базі R є зворотна функція для strtoi, окрім як для шістнадцяткової та вісімкової
Нік Кеннеді,

48 байт з якоюсь матричною магією. Я вважаю, що бітова конверсія довша, intToBitsале тоді ми можемо працювати, intsзамість rawчого закінчується збереження байта - див., Наприклад, це зintToBits
Джузеппе,

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

ти вільний взяти його. :-)
Джузеппе

1
Звичайно, перенесення однієї з безлічі відповідей, що тестує на наявність цифри 4в базовій кількості 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;? очистіть нижню частину стеку та перевірте результат ділення на 0
  • O@ якщо div результат нульовий вихід і зупинка
  • s поміняйте верхню частину стеку і починайте знову, починаючи з кроку 2

2

@Luis я точно можу скинути G(не впевнений, чому я включив його в першу чергу), але це лише один байт (спасибі за те, що помітили це!). Зміна 32YA52на 32_YA4однакову кількість байтів, правда?
Санчіз

Ага, так, я не можу порахувати
Луїс Мендо

2
@Luis Count? Кому потрібно порахувати, коли можна'32_YA4'n'32YA52'n-
Санчіз

2

Пакетна, 77 45 байт

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

На основі цих тріщинних хакерів . Пояснення: Тільки 6 рук потрібно перевірити через обмежений діапазон (30 біт) входу, який потрібно підтримувати. Магічне число mеквівалентно 111111базовій 32, так що перша операція перемикає грубі біти на вхідному номері. Потім залишається знайти, яка з шести рук тепер дорівнює нулю.


2

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

(той же машинний код працює у 16-бітному, 32-бітному та 64-бітному режимі. У 16-бітному режимі він використовує AX і DI замість EAX та EDI у 32 та 64-бітному режимі.)

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

Телефонує з C char isrude(unsigned n);відповідно до конвенції про виклик системи x86-64. 0 - неправда, не-0 - хибність (це асм, а не 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,40 для рівності, але SUB швидше, тому що він може макрозливатися з JZ в єдину підгалузь і гілку взагалі в сім'ї Sandybridge.

Приємний факт: використання прапорця в результаті зміни на більш ніж 1 буде повільним для P6-сімейства (передній кінець, поки зміна не вийде), але це добре.


Виноска 1: Це функція мови складання, і x86 asm має jzі те jnz, і відповідно до мета я можу вибрати будь-який спосіб. Я не маю намір це відповідати C truthy / falesy.

Було зручно повертатися в AL замість EFLAGS, тож ми можемо описати функцію до компілятора C без обгортки, але мій вибір truthy / falesy не обмежений, використовуючи для випробування його 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

Мова Вольфрама (Mathematica) , 37 байт 36 байт 29 байт

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

#~IntegerDigits~32~MemberQ~4&

Спробуйте в Інтернеті!

31-байтне рішення:

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

Спробуйте в Інтернеті!


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

Привіт. Це ви маєте на увазі?
Rainer Glüge

pls використовуйте tio.run/#mathematica замість W | A, щоб переконатися, що це дійсний код математики: P і вам не потрібен [n]кінець, просто &. Оскільки в публікаціях є історія редагування, непогано залишати попередні записи, а умовна умова для старих партитур<s>40</s> <s>36</s>
ASCII-лише

Так. Це я мав на увазі. 29 байт .
Джонатан Фрех

Напевно, я повинен звикнути до функціонального стилю програмування.
Rainer Glüge

1

Java 8, 28 22 21 байт

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

Натхненний @ Кевін-cruijssen відповіді «s . Працює лише на 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.