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


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.