Найти соответствующие группы цифр

14

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

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

Можно найти группировку цифр, разбив число на группы по 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, либо любое значение truey / 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 Coneheringaahing
@cairdcoinheringaahing Пожалуйста, прочитайте ссылку на функции черного ящика , особенно ссылки в конце этого поста. Подводя итог, да, вы можете, даже если ваш язык способен принимать функции в качестве аргументов (afaict)
Conor O'Brien
Может ли вход быть отрицательным? Нуль? Вы говорите о целых числах, но все примеры положительные. Я бы также предложил включить тестовые случаи, когда необходимо обработать группу из 000 единиц.
xnor
1
@ ConorO'Brien В этом случае вы должны добавить ( n -> n > 0применить к 0) к тестам, потому что большинство ответов на него не удаются.
Asone Tuhid
1
@EriktheOutgolfer Они есть [0].
Конор О'Брайен,

Ответы:

4

Желе , 5 байт

bȷÇ€Ạ

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

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

Эрик Outgolfer
источник
Я почти уверен, что это ошибка при подаче n -> n != 0заявления0
Asone Tuhid
@AsoneTuhid Это не так; Номер есть 0, и его список группы цифр есть [0], и затем он сопоставляется с каждым элементом ( 0здесь единственным ), превращая список в [1]и, поскольку все элементы этого списка верны, 1возвращается. Обратите внимание, что если бы []вместо этого был список групп цифр, результат не изменился бы, так как все элементы []являются правдивыми (бессмысленная истина). Тем не менее, результат может быть разным для разных программ, и правила не совсем ясны по этому поводу ( спросил OP ).
Эрик Outgolfer
Извините, я едва понимаю Желе. Хорошее решение.
Asone Tuhid
7

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

ḃ₁₀₀₀↰₁ᵐ

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

Функция черного ящика идет во второй строке (или «Нижний колонтитул» на 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 спасибо! Мне понравилась альфа-альфа, хотя ...
Уриэль
поправьте меня, если я ошибаюсь, но я думаю, что это неудача
Asone Tuhid
3

JavaScript (ES6), 40 36 байт

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

Принимает функцию и значение с помощью карри и возвращает 0 или 1. Редактировать: 4 байта сохранены благодаря @Shaggy.

Нил
источник
1000-> 1e3чтобы сохранить пару байтов. И вы могли бы заменить &&с &еще байт?
Лохматый
@ Shaggy Да, я думаю, это достаточно безопасно. То же самое касается ответа бетсег?
Нил
терпит неудачу function_name(n=>n>0)(0)(возвращается true)
Asone Tuhid
@AsoneTuhid Спасибо, исправлено.
Нил
2

Pyth , 9 байт

.AyMjQ^T3

Попробуйте онлайн! (использует третий контрольный пример)

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

Мистер Xcoder
источник
2

Stax , 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 для ложных.

Emigna
источник
Это не выполняет код для каждого элемента, но для всего списка.
Эрик Outgolfer
@EriktheOutgolfer: с автоматической векторизацией 05AB1E это будет в большинстве случаев. Я просто понял, что это не сработает, Qи Êхотя. Я вернусь к 8-байтовой версии.
Эминья
Тем не менее, это не .Vто, что векторизация, это даже не принимает список в качестве самого аргумента для начала.
Эрик Outgolfer
@EriktheOutgolfer: я никогда не говорил, что .Vвекторизация. В примере по моей ссылке это È.
Emigna
На самом деле Qи Êбудет работать с векторизацией, в отличие от того, о чем я говорил ранее, но использование автоматической векторизации заставит эти команды отображаться во всем списке, что не соответствует духу задачи, поэтому нам это нужно ε.
Emigna
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 байтов (только положительные n)

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

Эта версия возвращается 1для правды, falseдля фальси. К сожалению, это может потерпеть неудачу, когдаn = 0

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

benj2240
источник
Я думаю, что вы должны сосчитать, g=если это рекурсивно
Asone Tuhid
@AsoneTuhid О, это имеет смысл. Я добавлю это.
benj2240
Кроме того, попробуйте это (-1 байт), оно возвращается 1как истинное значение
Asone Tuhid
Это немного помяло мой мозг ... Мне пришлось немного повозиться, чтобы убедить себя, что это работает во всех случаях. Благодарность!
benj2240
Я был неправ, эта версия не работает g[->n{n>0},0](возвращается true). 0
Сбой возможен
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
   ))))
DLosc
источник
1

Добавить ++ , 15 байт

L,1000$bbbUª{f}

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

Требуется функция f была объявлена ​​в заголовке TIO.

Как это устроено

D,f,@,0.5^i2^A=	; Declares a function 'f' to check if a perfect square
		; E.g. 25 -> 1; 26 -> 0

L,		; Declare the main lambda function
		; Example argument: 		[25121]
	1000$bb	; Convert to base 1000	STACK = [[25 121]]
	bUª{f}	; Is 'f' true for all?	STACK = [1]
Кэрд
источник