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


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-м тестом.



@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. Я выполню все контрольные примеры позже, если у меня будет время.


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


Это не выполняет код для каждого элемента, но для всего списка.
Эрик 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

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


Я думаю, что вы должны сосчитать, 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
   ))))

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]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.