Wykryj prawie idealne tablice rejestracyjne

15

Uwaga: Inspiracją do tego pytania jest @Willbeing, gdzie zadaniem było policzyć liczbę doskonałych płyt o określonej długości, ale jest nieco inna.


Idealną tablicę rejestracyjną nazywamy tablicą , której tekst spełnia następujące warunki:

  • Składa się ze znaków, które mogą być dużymi literami ( [A-Z]) lub cyframi ( [0-9])
  • Sumując pozycje swoich liter w alfabecie angielskim, indeks 1 (tzn . A=1,B=2,...,Z=26:) daje liczbę całkowitą n
  • Pobranie każdego kawałka cyfr, zsumowanie ich, a następnie pomnożenie wszystkich wyników daje ten sam wynik, n
  • n jest idealnym kwadratem (np .: 49 (7 2 ) , 16 (4 2 ) )

Prawie idealny tablicy rejestracyjnej spełnia warunki idealnego tablicy rejestracyjnej, oprócz tego, że n jest nie idealny kwadrat.


Wejście

Ciąg znaków reprezentujący tekst tablicy rejestracyjnej, pobierany jako dane wejściowe w dowolnej standardowej formie, z wyjątkiem kodowania na stałe.

Wynik

Jeśli podany ciąg reprezentuje prawie idealną tablicę rejestracyjną, zwróć prawdziwą wartość (np .: True/ 1), w przeciwnym razie zwróć wartość fałsz (np .: False/ 0). Każda standardowa forma wyników jest akceptowana, przy czym należy pamiętać, że te luki są surowo zabronione.


Przykłady

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!

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w bajtach!

Pan Xcoder
źródło
konkurs popularności
Matthew Roh
Myślę, że byłoby to lepsze niż golf .
Erik the Outgolfer
Pozwól mi się upewnić, że to rozumiem. Mamy tylko wyjście truthy jeśli tablica rejestracyjna jest idealne i nto nie idealny kwadrat?
ćpun matematyki
@mathjunkie Tak. TL; DR: tylko jeśli licencja jest prawie idealna (PS przepraszam za spóźnioną odpowiedź)
Pan Xcoder
1
Zanim ktokolwiek to zrobi s/licence/license/ig, pamiętaj, że „licencja” to poprawna pisownia w brytyjskim angielskim (a także angielskim w innych częściach świata).
Mego

Odpowiedzi:

7

Galaretka , 29 28 30 bajtów

+1 bajt naprawić błąd zauważony przez ChristianSievers (niesłusznie czynienia z podciągi z samych zer) +1 bajt naprawić fałszywych alarmów dla "0", "00"... Znaleziono podczas powyższej mocowania (0 to idealny kwadrat).

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

Wypróbuj online! lub uruchom testy

W jaki sposób?

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
Jonathan Allan
źródło
Wow, genialne rozwiązanie Galaretki!
Pan Xcoder,
Co 11AA0?
Christian Sievers,
@ChristianSievers, good catch. Naprawiono wraz z innym rodzajem powiązanego błędu i rozszerzono pakiet testowy.
Jonathan Allan
7

MATL, 36 34 33 35 bajtów

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

Wypróbuj w MATL Online

Wyjaśnienie

        % 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
źródło
Daje fałszywe trafienia dla tablic składających się tylko z zer, np. '0'Lub '00'(FWIW Właśnie to naprawiłem w moim kodzie).
Jonathan Allan
1
@JonathanAllan Zaktualizowano.
Suever,
6

Python 2, 120 118 bajtów

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)

Wypróbuj online!

Interpretuje każdy znak jako liczbę w bazie 36 ( h). Konwertuje na dziesiętny i dodaje do sumy if h>9(co oznacza, że ​​jest to litera), w przeciwnym razie dodaje się do zmiennej, która zostaje pomnożona, aby utworzyć działający produkt później.

ćpun matematyki
źródło
4

Perl 5 , 80 bajtów

79 bajtów kodu + -pflaga.

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

Wypróbuj online!

$.*=eval s/./+$&/gr for/\d+/g;mnoży sumy kolejnych cyfr. (Używam, $.ponieważ jest to wartość początkowa 1, co oznacza, że ​​jest to element neutralny do mnożenia). Dokładniej, dla każdej części cyfr ( for/\d+/g) s/./+$&/grumieszcza +przed każdą cyfrą, a następnie ciąg jest evaloznaczany i mnożony przez bieżący produkt.
Po drugie, $t-=64-ord for/\pl/g;sumy w $tkażdej literze ( for/\pl/g). ( ordzwróć kod ascii dla litery i spraw, 64-..aby zawierała się w przedziale od 1 do 26.
Na koniec $.==$tsprawdza , czy obie wartości są takie same i ($.**.5|0)**2!=$.czy nie jest to idealny kwadrat.

Dada
źródło
4

Python 2, 267 207 bajtów

Zaoszczędzono 60 bajtów dzięki 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

Funkcja z użyciem: print(g('A1B2C3'))

Wypróbuj online!

Pan Xcoder
źródło
4

Python 3 , 163 156 155 164 161 bajtów

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)))

Wypróbuj online!

  • zaoszczędził 7 bajtów dzięki Jonathanowi i Shooqie
  • zapisany 1 bajt: Naprawiono także błąd fałszywie dodatni. Dzięki Jonathanowi za wskazanie tego!
  • dodano 11 bajtów: poprzednia edycja była niepoprawna (mnożenie sumy cyfr odbywało się w niepożądanej pętli)
Officialaimm
źródło
1
from math import*jest krótszy
shooqie
1
Nie potrzebujesz a, po prostu użyj for x in input():. Możesz mieć fałszywe alarmy dla tablic kończących się ciągiem zer (np. 11AA00), Ponieważ finał m*=tnie jest wykonywany.
Jonathan Allan
1
Najwyraźniej mój kod pokazuje fałszywie dodatni dla każdego łańcucha z izolowanymi zerami (3A0B jest również pokazany jako prawdziwy) ... Dzięki za wskazanie tego @ JonathanAllan. Spróbuję to naprawić.
officialaimm
Sprawdź nowszą wersję ... Dodałem nową zmienną flagi „p”, aby zdecydować, czy należy pomnożyć sumę cyfr.
officialaimm
3

Siatkówka, 143 bajty

Zwraca 1 dla wartości true, 0 dla wartości false

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

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

^ (1 *) \ n \ 1 $

Wypróbuj online!

Wyjaśnienie:

[1-9]
$ *
10 | 01
1

Po pierwsze, zamieniamy wszystkie niezerowe cyfry na ich jednoargumentową reprezentację. Usuwamy wszelkie zera z sąsiednią cyfrą, aby nie wpływały one na nasze jednoargumentowe operacje

S_` (\ D)

Podziel powstały ciąg na litery, uważając, aby wykluczyć puste linie (jest to problem, gdy dwie litery są następujące po sobie AA).

O`
{`1 (? = 1 * \ n (1+))
1 USD
) 2 = „1 + \ n

Posortuj ciąg leksykograficznie. Następnie kilkakrotnie wykonaj następujące czynności:

1) Zamień każdy 1na liczbę 1s w następującym wierszu (to naśladuje mnożenie)

2) Usuń drugą linię 1s

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

Zastąpić litery J-Sz 1J, 1Kitp i zastąpić litery T-Zz 2T, 2Uitp Następnie zastąpić każdą z grup A-I, J-Soraz T-Zz 1-9. Pozostanie nam wartość liczbowa każdej litery (np. 13Dla M).

1> `\ d + \ n?
$ *

Konwertuj każdą linię oprócz pierwszej na unarną (pierwsza linia jest już unarna). Połącz te linie. Pozostaje nam teraz ciąg formularza <product of digits>\n<sum of letters>.

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

Zamień liczbę kwadratową na pusty ciąg. Używa to metody „drzewa różnic” .

^ (1 *) \ n \ 1 $

Zwróć, 1jeśli dwa ciągi po obu stronach \nmeczu. W przeciwnym razie wróć 0.

ćpun matematyki
źródło
Fałszywie pozytywne dla 11AA0, 0AA11itp.
Jonathan Allan
@JonathanAllan Thanks! Naprawienie mnie kosztowało 11 bajtów
ćpun matematyczny