Обнаружить почти идеальные номерные знаки

15

Примечание: на этот вопрос @Willbeing вдохновил этот вопрос, где задачей было подсчитать количество идеальных тарелок определенной длины, но это немного отличается.


Мы называем идеальный номерной знак той табличкой, текст которой удовлетворяет следующим условиям:

  • Он состоит из символов, которые могут быть как заглавными буквами ( [A-Z]), так и цифрами ( [0-9])
  • Суммируя позиции своих букв в английском алфавите, 1 индексирует (т.е.:) A=1,B=2,...,Z=26дает целое число n
  • Получение каждого куска цифр, суммирование их и затем умножение всех результатов дает тот же результат, n
  • n - идеальный квадрат (например: 49 (7 2 ) , 16 (4 2 ) )

Почти идеальный номерной знак соответствует условиям для идеального номерного знака, за исключением того, что п является не идеальным квадратом.


вход

Строка, представляющая текст номерного знака, взятый как ввод в любой стандартной форме, кроме жесткого кодирования.

Выход

Если данная строка представляет собой почти идеальный номерной знак, верните истинное значение (например, True/ 1), в противном случае верните ложное значение (например, False/ 0). Любая стандартная форма вывода принимается, принимая во внимание, что эти лазейки строго запрещены.


Примеры

licence plate -> output


A1B2C3 -> 1

A + B + C = 1 + 2 + 3 = 6
1 * 2 * 3 = 6 
6 is not a perfect square, 6 = 6 => nearly perfect plate

01G61 -> 1

(0 + 1) * (6 + 1) = 7
G = 7
7 is not a perfect square, 7 = 7 => nearly perfect plate

11BB2 -> 0

(1 + 1) * 2 = 4
B + B = 2 + 2 = 4
4 = 4, but 4 is the square of 2 => perfect license plate (not what we want)

67FF1 -> 0

(6 + 7) * 1 = 13
F + F = 6 + 6 = 12
12 != 13 => not perfect at all!

счет

Это , поэтому выигрывает самый короткий ответ в байтах!

Мистер Xcoder
источник
Я думаю, что это было бы лучше, как код-гольф .
Эрик Outgolfer
Позвольте мне убедиться, что я понимаю это. Мы только выход truthy , если номерной знак является совершенным , и nэто не идеальный квадрат?
математик наркоман
@mathjunkie Да. TL; DR: только если лицензия почти идеальна (PS извините за поздний ответ)
г-н Xcoder
1
Прежде чем кто-либо сделает s/licence/license/igэто, имейте в виду, что «лицензия» - это правильное написание на британском английском (а также на английском языке в других частях света).
Мего

Ответы:

7

Желе , 29 28 30 байт

+1 байт исправить ошибку разысканы ChristianSievers (неправильно дело с подстроками только нули) +1 байт исправить ложные срабатывания для "0", "00"... найдено во время выше фиксаций (0 является квадратом).

i@€ØAS;Ʋ$
e€ØAœpV€€LÐfS€P;0⁼Ç

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

Как?

i@€ØAS;Ʋ$ - Link 1: [letter-sum, letter-sum is perfect square?]: plate
i@€        - index of €ach char in plate [reversed @rguments] (1-based, 0 otherwise) in:
   ØA      -     uppercase alphabet
     S     - sum
         $ - last two links as a monad:
      ;    -     concatenate with:
       Ʋ  -         is square?

e€ØAœpV€€LÐfS€P;0⁼Ç - Main link: plate                        e.g. "11BB2"
    œp              - partition plate at truthy values of:
e€                  -     is in? for €ach char in plate:
  ØA                -         uppercase alphabet                   [['1','1'],[''],['2']]
      V€€           - evaluate for €ach for €ach                   [[1,1],[],[2]]
          Ðf        - filter keep:
         L          -     length                                   [[1,1],[2]]
            S€      - sum each                                     [2,2]
              P     - product                                      4
               ;0   - concatenate a zero                           [4,0]
                  Ç - last link (1) as a monad (taking plate)      [4,1]
                 ⁼  - equal? (non-vectorising)                     0
Джонатан Аллан
источник
Вау, гениальное желейное решение!
мистер Xcoder
Как насчет 11AA0?
Кристиан Сиверс
@ChristianSievers, хороший улов. Исправлена ​​ошибка, связанная с ошибками и расширенным набором тестов.
Джонатан Аллан
7

MATL, 36 34 33 35 байт

3Y432YXU"@V!Usvp]GlY2&msy=wtQ:qUm~v

Попробуйте это на MATL Online

объяснение

        % Implicitly grab input as a string
3Y4     % Push the predefined literal '[A-Za-z]+' to the stack
32      % Push the literal 32 to the stack (ASCII for ' ')
YX      % Replace the matched regex with spaces (puts a space in place of all letters)
U       % Convert the string to a number. The spaces make it such that each group of
        % of consecutive digits is made into a number
"       % For each of these numbers
  @V!U  % Break it into digits
  s     % Sum the digits
  v     % Vertically concatenate the entire stack
  p     % Compute the product of this vector
]       % End of for loop
G       % Explicitly grab the input again
lY2     % Push the predefined literal 'ABCD....XYZ' to the stack
&m      % Check membership of each character in the input in this array and 
        % return an array that is 0 where it wasn't a letter and the index in 'ABC..XYZ'
        % when it was a letter
s       % Sum the resulting vector
y       % Duplicate the product of the sums of digits result
=       % Compare to the sum of letter indices result
w       % Flip the top two stack elements
Q       % Add one to this value (N)
t:      % Duplicate and compute the array [1...N]
q       % Subtract 1 from this array to yield [0...N-1]
U       % Square all elements to create all perfect squares between 1 and N^2
m~      % Check to ensure that N is not in the array of perfect squares
v       % Vertically concatenate the stack.
        % Implicitly display the truthy/falsey result
Suever
источник
Выдает ложные срабатывания для пластин, состоящих только из нулей, например '0'или '00'(FWIW, я тоже исправил это в своем коде).
Джонатан Аллан
1
@JonathanAllan Обновлено.
Suever
6

Python 2, 120 118 байт

s=t=p=0;r=1
for n in input():
 h=int(n,36)
 if h>9:s+=h-9;r*=t**p
 p=h<10;t=(t+h)*p
print(s==r*t**p)&(int(s**.5)**2<s)

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

Интерпретирует каждый символ как число в base-36 ( h). Преобразуется в десятичную и добавляет к сумме if h>9(имеется в виду буква), в противном случае добавляет переменную, которая умножается для формирования работающего продукта позже.

математик наркоман
источник
4

Perl 5 , 80 байт

79 байт кода + -pфлаг.

$.*=eval s/./+$&/gr for/\d+/g;$t-=64-ord for/\pl/g;$_=$.==$t&&($.**.5|0)**2!=$.

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

$.*=eval s/./+$&/gr for/\d+/g;умножает суммы последовательных цифр. (Я использую, $.потому что это начальное значение 1, что означает, что это нейтральный элемент для умножения). Точнее говоря, для каждого блока цифр ( for/\d+/g) перед каждой цифрой ставится s/./+$&/grзнак « +а», затем строка evalобрабатывается и умножается на текущий продукт.
Во-вторых, $t-=64-ord for/\pl/g;суммы в $tкаждой букве ( for/\pl/g). ( ordвозвращает код ascii для буквы и 64-..устанавливает его между 1 и 26.
Наконец, $.==$tпроверяет, что оба значения одинаковы, и ($.**.5|0)**2!=$.что это не идеальный квадрат.

папа
источник
4

Python 2, 267 207 байт

Сохранено 60 байтов благодаря ovs

import re
def g(l):a=reduce(lambda a,b:a*b,[sum(map(int,list(i)))for i in re.sub(r'\D',' ',l).split()],1);return a==sum(sum(k)for k in[[ord(i)-64for i in x]for x in re.sub(r'\d',' ',l).split()])and a**.5%1>0

Функция с использованием: print(g('A1B2C3'))

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

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

Python 3 , 163 156 155 164 161 байт

from math import*
m=1;s=t=p=0
for x in input():
 try:t+=int(x);p=1
 except:m*=[1,t][p];p=t=0;s+=ord(x.upper())-64
if p:m*=t
print(m==s and sqrt(m)!=int(sqrt(m)))

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

  • спас 7 байтов благодаря Джонатану и Шуки
  • сохранено 1 байт: также исправлена ​​ошибка ложного срабатывания. Спасибо Джонатану за то, что указал на это!
  • добавлено 11 байт: предыдущее редактирование было неверным (умножение суммы цифр происходило в нежелательном цикле)
officialaimm
источник
1
from math import*Короче
shooqie
1
Вам не нужно a, просто используйте for x in input():. Вы можете иметь ложные срабатывания для пластин, заканчивающихся строкой нулей (например 11AA00), так как финал m*=tне выполняется.
Джонатан Аллан
1
По-видимому, мой код показывает ложное срабатывание для любой строки с изолированными нулями в ней (3A0B также отображается как true) ... Спасибо за указание на это @JonathanAllan. Я постараюсь это исправить.
officialaimm
Проверьте более новую версию ... Я добавил новую переменную флага 'p', чтобы решить, умножать или нет сумму цифр.
officialaimm
3

Сетчатка, 143 байта

Возвращает 1 для истины, 0 для ложных

[1-9]
$ *
10 | 01
1
S_` (\ D)
O`
{ `1 (? = 1 * \ п (1+))
$ 1
) 2 = `1 + \ п

[JS]
1 $ +
[TZ]
2 $ +
T`0L`ddd
1> `\ D + \ п?
$ *
^ (((1) (((2) \ 2 (11) |? 111)) | 1)) * \ п

^ (1 *) \ п \ 1 $

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

Объяснение:

[1-9]
$ *
10 | 01
1

Сначала мы заменяем все ненулевые цифры их унарным представлением. Мы удаляем все нули с соседней цифрой, чтобы они не влияли на наши унарные операции.

S_` (\ D)

Разделите полученную строку на буквы, стараясь исключить пустые строки (это проблема, когда две буквы являются последовательными AA).

O`
{ `1 (? = 1 * \ п (1+))
$ 1
) 2 = `1 + \ п

Сортировать строку лексикографически. Затем несколько раз сделайте следующее:

1) Замените каждый 1числом 1s на следующей строке (это имитирует умножение)

2) Убрать вторую строку 1с

[JS]
1 $ +
[TZ]
2 $ +
T`0L`ddd

Заменить буквы J-Sс 1J, 1Kи т.д. и заменить буквы T-Zс 2T, 2Uи т.д. Затем, замените каждую из групп A-I, J-Sи T-Zс 1-9. Нам останется числовое значение каждой буквы (например, 13для M).

1> `\ D + \ п?
$ *

Конвертировать каждую строку, кроме первой, в унарную (первая строка уже в унарной). Объединить эти строки. Теперь мы остались со строкой формы <product of digits>\n<sum of letters>.

^ (((1) (((2) \ 2 (11) |? 111)) | 1)) * \ п

Замените квадратное число пустой строкой. Это использует метод "дерева различий" .

^ (1 *) \ п \ 1 $

Вернуть, 1если две строки по обе стороны \nсовпадают. В противном случае вернитесь 0.

математик наркоман
источник
Ложные срабатывания для 11AA0, 0AA11и т.д.
Jonathan Allan
@JonathanAllan Спасибо! Это стоило мне 11 байтов, чтобы исправить
математика наркоман