Виявити майже ідеальні номерні знаки


15

Примітка. Це надихає це питання компанією @Willbeing, де завданням було підрахувати кількість досконалих пластин певної довжини, але це трохи інакше.


Ми називаємо ідеальним номерним знаком ту табличку, текст якої відповідає наступним умовам:

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

Майже ідеальний номерний знак відповідає умовам для ідеального номерного знака, за винятком того, що п є НЕ ідеальним квадратом.


Вхідні дані

Рядок, що представляє текст номерного знака, прийнятий як вхід у будь-якій стандартній формі, за винятком жорсткого кодування.

Вихідні дані

Якщо дана рядок являє собою майже ідеальний номерний знак, поверніть значення truthy (наприклад: 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!

Оцінка балів

Це , тому найкоротша відповідь у байтах виграє!



Я думаю, що це було б краще як код-гольф .
Ерік Аутгольфер

Дозвольте переконатися, що я це розумію. Ми тільки вихід 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

Виходить помилковий показник для табличок, що складаються лише з нулів, наприклад, '0'або '00'(FWIW я теж зафіксував це у своєму коді).
Джонатан Аллан

1
@JonathanAllan Оновлено.
Суєвер

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ставиться a +перед кожною цифрою, тоді рядок використовується evalта помножується на поточний добуток.
По-друге, $t-=64-ord for/\pl/g;суми в $tкожній букві ( for/\pl/g). ( ordповертаємо код асції для букви і 64-..робить його між 1 і 26.
Нарешті, $.==$tперевіряє, чи обидва значення однакові, і ($.**.5|0)**2!=$.чи це ні досконалий квадрат.



4

Пітон 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 байт: Попереднє редагування було неправильним (множення суми цифр відбувалося в небажаному циклі)

1
from math import*коротше
shooqie

1
Вам не потрібно a, просто використовуйте for x in input():. Ви можете мати помилкові позитиви для табличок, що закінчуються рядком нулів (наприклад 11AA00), оскільки фінал m*=tне виконується.
Джонатан Аллан

1
Мабуть, мій код показує хибне позитивне значення для будь-якого рядка з ізольованими нулями в ньому (3A0B також показано правдою) ... Дякую за вказівку на це @JonathanAllan. Я спробую це виправити.
officialaimm

Перевірте нову версію ... Я додав нову змінну прапора 'p', щоб вирішити, чи потрібно помножувати суму цифр.
officialaimm

3

Сітківка, 143 байти

Повертає 1 для істинного, 0 для помилкового

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

[JS]
1 $ +
[ТЗ]
2 $ +
T`0L`ddd
1> `\ d + \ n?
$ *
^ ((? (1) ((? (2) \ 2 (11) | 111)) | 1)) * \ n

^ (1 *) \ n \ 1 $

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

Пояснення:

[1-9]
$ *
10 | 01
1

По-перше, ми замінюємо всі ненульові цифри їх одинарним поданням. Ми видаляємо будь-які нулі з сусідньою цифрою, щоб вони не впливали на наші одинакові операції

S_` (\ D)

Розділіть отриманий рядок на літери, обережно виключаючи порожні рядки (це проблема, коли дві літери підряд AA).

О`
{`1 (? = 1 * \ n (1+))
$ 1
) 2 = `1 + \ n

Сортуйте рядок лексикографічно. Потім кілька разів робіть наступне:

1) Замініть кожен 1на число 1s у наступному рядку (це імітує множення)

2) Видаліть другий рядок 1s

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

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

1> `\ d + \ n?
$ *

Перетворіть кожен рядок, окрім першого, в одинарний (перший рядок уже є одинарним). Об’єднайте ці рядки. Зараз нам залишилося рядок форми<product of digits>\n<sum of letters> .

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

Замініть квадратне число порожнім рядком. Для цього використовується метод "дерева різниць" .

^ (1 *) \ n \ 1 $

Поверніться, 1якщо дві струни з обох боків \nматчу. В іншому випадку поверніться 0.


Помилкові спрацьовування для 11AA0, 0AA11і т.д.
Jonathan Allan

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