Знайдіть відповідні угруповання з цифрами


14

Нещодавно моя репутація була 25,121. Я помітив, що кожне згрупування цифр (тобто числа, розділені комами) було ідеальним квадратом.

Ваша задача полягає в тому, що враховуючи невід'ємне ціле число N та одинарну булеву функцію чорного поля f : Z *B , дайте значення truthy, якщо кожне значення f, застосоване до розрядних угруповань N, є truthy, а фальси в іншому випадку.

Дізнатися згруповання цифр можна, поділивши число на 3 групи, починаючи з правого боку. У крайній лівій групі може бути 1, 2 або 3 цифри. Деякі приклади:

12398123  -> 12,398,123    (3 digit groupings)
10        -> 10            (1 digit grouping)
23045     -> 23,045        (2 digit groupings)
100000001 -> 100,000,001   (3 digit groupings)
1337      -> 1,337         (2 digit groupings)
0         -> 0             (1 digit grouping)

Додаткові правила

  • Ця функція може зіставляти або булеві (наприклад, trueта false), 1s і 0s, або будь-які значення truthy / falsey. Вкажіть, будь ласка, який формат підтримується вашою відповіддю.
  • Ви можете взяти ціле число як вхідне чи ціле число (тобто рядок, що складається з цифр).
  • Ви можете написати програму або функцію.
  • Передаючи цифрові групи до функції f , слід обрізати всі непотрібні провідні нулі. Наприклад, f при застосуванні до N = 123 000 слід виконати як f (123) і f (0).

Тестові справи

Функція позначення n -> f(n), наприклад, n -> n == 0. Усі оператори приймають арифметику з цілим числом. (Наприклад, sqrt(3) == 1)

function f
integer N
boolean result

n -> n == n
1230192
true

n -> n != n
42
false

n -> n > 400
420000
false

n -> n > 0
0
false

n -> n -> 0
1
true

n -> sqrt(n) ** 2 == n
25121
true

n -> sqrt(n) ** 2 == n 
4101
false

n -> mod(n, 2) == 0
2902414
true

n -> n % 10 > max(digits(n / 10))
10239120
false

n -> n % 10 > max(digits(n / 10))
123456789
true

Якщо ми не можемо приймати функції як аргументи, чи можемо ми вважати, що функція визначена як змінна, і ми посилаємось на це у нашій програмі?
caird coinheringaahing

@cairdcoinheringaahing Будь ласка, прочитайте посилання на функції Black box , зокрема посилання в кінці цієї публікації. Підводячи підсумок, так, ви можете, навіть якщо ваша мова здатна приймати функції як аргументи (афакт)
Conor O'Brien

Чи може вхід бути негативним? Нуль? Ви говорите про цілі числа, але всі приклади є позитивними. Я б також запропонував включити тестові випадки, коли потрібно обробити групу 000.
xnor

1
@ ConorO'Brien У такому випадку вам слід додати ( n -> n > 0застосовано 0) до тестових випадків, оскільки більшість відповідей не відповідають на них.
Асона Тухід

1
@EriktheOutgolfer Вони є [0].
Conor O'Brien

Відповіді:


4

Желе , 5 байт

bȷÇ€Ạ

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

Аргумент командного рядка - це число. Рядок над рядком, в якому знаходиться ця функція, є основним рядком решти програми, тобто кодом, який викликається для кожної з груп. Будьте обережні, щоб не звертатися до рядка bȷÇ€Ạ! Приклад, який тут використовується, - 5-й тестовий випадок.



@AsoneTuhid Це не так; Число є 0, і його цифровий список груп є [0], тож він отримує відображення на кожен елемент (єдиний 0тут), перетворюючи список [1]і, оскільки всі елементи цього списку є правдоподібними, 1повертається. Зауважте, що якби у мене був список цифр групи, []замість цього результат не змінився б, оскільки всі елементи []є неправдивими (правдива правда). Однак результат може бути різним для різних програм, і правила щодо цього не зовсім зрозумілі ( запитав ОП ).
Ерік Аутгольфер

Вибачте, я ледве розумію Желе. Приємне рішення.
Асона Тухід

7

Брахілог , 8 байт

ḃ₁₀₀₀↰₁ᵐ

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

Функція blackbox переходить на другий рядок (або "Footer" на TIO), і ціле число зчитується з STDIN. Друкує true.або false.відповідно.

ḃ₁₀₀₀      Compute the base-1000 digits of the input.
     ↰₁ᵐ   Map the blackbox predicate over each digit. We don't care about the
           result of the map, but the predicate must succeed for each digit,
           otherwise the entire map fails.

5

APL (Dyalog) , 16 13 байт

3 байти збережено завдяки @ Adám

∧/⎕¨1e3⊥⍣¯1⊢⎕

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

Як?

1e3⊥⍣¯1⊢⎕ - ввести число і кодувати в базі 1000

⎕¨ - введіть функцію та застосуйте на кожній

∧/ - зменшити з логічним і


Збережіть 3 байти, виклавши явно: Спробуйте в Інтернеті!
Адам

@ Adám дякую! Мені сподобався альфа-альфа ...
Уріель

виправте мене, якщо я помиляюся, але я думаю, що це невдача
Асона Тухід





3

JavaScript (ES6), 40 36 байт

f=>g=i=>f(i%1e3)&(i<1e3||g(i/1e3|0))

Приймає функцію та значення за допомогою завивки та повертає 0 або 1. Редагування: Збережено 4 байти завдяки @Shaggy.


1000-> 1e3щоб зберегти пару байт. І ви могли б замінити &&з &ще байт?
Кудлатий

@Shaggy Так, я думаю, що це досить безпечно. Це ж стосується і відповіді betseg?
Ніл

не вдається function_name(n=>n>0)(0)(повертається true)
Асона Тухід

@AsoneTuhid Дякую, виправлено.
Ніл

2

Pyth , 9 байт

.AyMjQ^T3

Спробуйте в Інтернеті! (використовує третій тестовий випадок)

Передбачається, що функція чорного поля названа y. Ви можете оголосити таку функцію за допомогою L(аргумент b:), як показано на TIO. Всі тестові справи я впроваджую пізніше, якщо матиму час.


2

Стакс , 8 байт

Vk|Eym|A

Програми Stax не мають функціональних викликів чи аргументів, тому ми зберігаємо блок у Yреєстрі, який споживає та видає єдине значення. Це можна зробити перед кодом програми.

{...}Yd     store a block in the Y register that executes ...
Vk|E        get "digits" of input using base 1000
    ym      map "digits" to array using y as mapping function
      |A    all elements are truthy?

Ось приклад використання ідеальної функції квадрата.





1

05AB1E , 8 байт

₄вεI.V}P

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

Пояснення

₄в         # convert first input to base-1000
  ε   }    # apply to each element
   I.V     # execute second input as code
       P   # product of the resulting list

Приймає число як перший рядок введення, а функцію - як другий.
Виходи 1 для трибуни і 0 для хибних.


Це не виконує код на кожному елементі, а на всьому списку.
Ерік Аутгольфер

@EriktheOutgolfer: З автоматичною векторизацією 05AB1E це відбувається в більшості випадків. Я просто зрозумів, що це не буде працювати, Qі Êхоча. Я повернусь до 8-байтової версії.
Емінья

Але все-таки це не .Vте, що векторизується, він навіть не сприймає список як сам аргумент.
Ерік Атголфер

@EriktheOutgolfer: Я ніколи не говорив, що .Vвекторизуються. У прикладі в моїй посиланням це È.
Емінья

Насправді Qі Êпрацював би з векторизацією на відміну від раніше заявленого, але використання автоматичної векторизації зробить ці команди відображеними у всьому списку, який почувається поза духом виклику, тому нам це потрібно ε.
Емінья

1

Excel VBA, 79 байт

Анонімна функція негайного вікна VBE, яка приймає введення nяк ціле число з діапазону [A1], а також назва публічно визначеної функції VBA з діапазону [B1].

t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t

Приклад використання

У відкритому модулі функція введення f()визначається в цьому випадку .

Public Function f(ByVal n As Integer) As Boolean
    Let f = (n Mod 2 = 0)
End Function

Вхідні змінні встановлюються.

[A1]=2902414    ''  Input Integer
[B1]="f"        ''  input function

Потім викликається функція негайного вікна.

t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t
 1              ''  Function output (truthy)

1

Рубін , 37 байт

g=->f,n{f[n%x=1000]&&(n<x||g[f,n/x])}

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

Рекурсивна лямбда, що приймає функцію і ціле число і повертає булеве значення.

36 байт (тільки позитивний п)

g=->f,n{n>0?f[n%k=1000]&&g[f,n/k]:1}

Ця версія повертається 1для truthy, falsefor falsey. На жаль, коли це може вийти з ладуn = 0

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


Я думаю, вам доведеться порахувати, g=чи є рекурсивна
Асона Тухід

@AsoneTuhid О, це має сенс. Я додам його.
benj2240

Крім того, спробуйте це (-1 байт), воно повертається 1як триєдне значення
Asone Tuhid

Це трохи зморщило мій мозок ... Мені довелося трохи поворухнутися, щоб переконати себе, що це працює у всіх випадках. Спасибі!
benj2240

Я помилявся, ця версія не працює g[->n{n>0},0](повертається true). Це не вдається, якщо вхід є, 0але в запитанні написано "негативно", тому вам слід повернутися до 37. Вибачте
Асона Тухід

1

Яблучне насіння , 51 байт

(lambda(n f)(all(map f(or(to-base 1000 n)(q(0))))))

Анонімна лямбда-функція, яка приймає число і функцію і повертає булеве значення.

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

(lambda (n f)         ; Function with parameters n and f
 (all                 ; Return true if all elements of this list are truthy:
  (map f              ; Map the function f to each element of
   (or                ; This list if it is nonempty:
    (to-base 1000 n)  ; Convert n to a list of "digits" in base 1000
    (q (0))           ; Or if that list is empty (when n=0), then use the list (0) instead
   ))))

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