Wortlängen-Summen-Vielfache

Sep 21 2020

Ein Port meiner anderen Frage: Double Prime Words

Betrachten Sie ein Wort / eine Zeichenfolge aus nalphanumerischen Zeichen mit der Summe der Zeichen unter sVerwendung ihrer numerischen Position im Alphabet ( a=1, B=2, c=3,usw.) oder des numerischen Werts (0,1, 2, 3 - 9). Numerische Zeichen sollten zum individuellen Wert genommen werden. ( 66ist zwei 6Zeichen für eine Summe von 12)

Ein Wort ist genau dann ein Längen-Summen-Vielfaches, wenn ses ein Vielfaches von ist n, insbesondere s/neine positive ganze Zahl {1,2,3,4...}. Im Fall von s=0und n={0,00,000,...}ist 0 ein Vielfaches von any n, ergibt jedoch keine positive ganze Zahl. Daher ist eine Eingabe von {0,00,000,...}False.

Die Eingabe kann eine beliebige Kombination aus Zahlen und alphabetischen Groß- oder Kleinbuchstaben sein, da zwischen aoder kein numerischer Unterschied besteht A. Die Verarbeitung leerer Eingaben n=s=0ist nicht erforderlich.

Die Ausgabe ist ein geeignetes logisches Format für Ihre Sprache. dh Richtig oder Falsch, T oder F, 1 oder 0, positiv für wahr und 0 für falsch usw. Die Angabe, in welchem ​​Format Ihre Ausgabe angezeigt wird, wird sehr geschätzt, ist jedoch nicht erforderlich. (Die Ausgabe muss nicht n oder s enthalten, aber ich füge sie unten als Demonstration und Beispiel hinzu.)

Gewinnbedingung: Schreiben Sie in so wenigen Bytes wie möglich eine Funktion, mit der festgestellt werden kann, ob eine Zeichenfolge ein Längen-Summen-Vielfaches ist.

Beispiele

Input -> Output (n,s) 

hello -> False (5, 52) 
MuLtIpLe -> False (8, 108)
Junct10n -> False (8, 83)
Order66 -> False (7, 72)
CodeGolf -> False (8, 67)
SUM -> False (3, 53)
ID -> False (2, 13)

25 -> False (2, 7)
0 -> False (1, 0) 0/1 = 0 which is not a positive integer
10 -> False (2, 1) 

hello2 -> True (6, 54)
5um -> True (3, 39)
length -> True (6, 66)
Order64 -> True (7, 70)
Covid19 -> True (7, 63)
Word -> True (4, 60)
APPLE -> True (5, 50)
lawYER -> True (6, 84)
abc123 -> True (6, 12)
is -> True (2, 28)
television -> True (10, 130)
19 -> True (2, 10)
234 -> True (3, 9)

a -> True (1, 1)
b -> True (1, 2)
C -> True (1, 3)
Z -> True (1, 26)
1 -> True (1, 1)
9 -> True (1, 9)

Antworten

4 KevinCruijssen Sep 21 2020 at 15:42

05AB1E , 16 15 Bytes

þIáÇ32%«ODXgÖ*Ā

Eingabe als Liste von Zeichen.

-1 Byte implizit dank @ovs .

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

þ                # Only leave the digits of the (implicit) input-list
 Iá              # Push the input-list again, and only leave its letters
   Ç             # Convert each letter to its codepoint integer
    32%          # Take modulo-32 on each codepoint
       «         # Merge it to the list of digits
        O        # Sum this list
         D       # Duplicate this sum
          Ig     # Push the input-list again, and pop and push its length
            Ö    # Check if the sum is divisible by this length
             *   # Multiply it by the duplicated sum
              Ā  # And check that this is NOT 0
                 # (after which the result is output implicitly)

3 Bytes ( D*Ā) werden für Randfälle 0/ 00/ 000/ etc. Verwendet .

4 JonathanAllan Sep 21 2020 at 17:44

Gelee ,  12  11 Bytes

ŒlO%48Sȯ.%L

Ein monadischer Link, der eine Liste von Zeichen akzeptiert, die Null ergibt (Falsey), wenn die Zeichenfolge ein Längen-Summen-Vielfaches ist, oder eine Nicht-Null-Zahl (wahr), wenn nicht.

Probieren Sie es online aus! Oder sehen Sie sich die Testsuite an .

Wie?

ŒlO%48Sȯ.%L - Link: list of characters, w  e.g. "ID"       "10"     "19"     "0...0"
Œl          - lower-case (w)                    "id"       "10"     "19"     "0...0"
  O         - ordinals                          [105,100]  [49,48]  [49,57]  [48,...,48]
    48      - forty-eight                       48         48       48       48
   %        - modulo                            [9,4]      [1,0]    [1,9]    [0,...,0]
      S     - sum                               13         1        10       0
        .   - a half                            0.5        0.5      0.5      0.5
       ȯ    - logical OR                        13         1        10       0.5
         L  - length (w)                        2          2        2        length(w)
        %   - modulo                            1          1        0        0.5
                                               (nope       nope     yep!     nope)
4 Noodle9 Sep 21 2020 at 16:22

C (gcc) , 73 \$\cdots\$ 63 61 Bytes

Gespeichert ein 3 Bytes dank ceilingcat !!!

n;u;f(char*s){for(n=u=0;*s;++n)u+=*s&15+*s++/64*16;u*=u%n<1;}

Probieren Sie es online aus!

Gibt eine Zeichenfolge ein und gibt eine Wahrheit zurück, wenn es sich um ein Längen-Summen-Vielfaches oder eine False handelt.

4 Jonah Sep 21 2020 at 18:40

J , 29 24 Bytes

#(|=0=])1#.48|64|96|3&u:

Probieren Sie es online aus!

-5 Bytes dank xash

Inspiriert von Neils Antwort - stimmen Sie ihn unbedingt ab.

  • 3&u: wandelt den String in ASCII-Codes um
  • 96| modifiziert die Kleinbuchstaben in den Bereich 1-26
  • 64| modifiziert die Großbuchstaben in den Bereich 1-26
  • 48| modifiziert die Ziffern in den Bereich 0-9
  • 1#. Summe aller umgerechneten Ziffern
  • # (ganz links) Länge der Saite
  • (|=0=])Zuerst prüfen wir, ob die Summe Null ist 0=]- dies wird zurückgegeben, 1wenn es ist und 0ansonsten. Dann überprüfen wir , ob Summe mod die Länge |gleich , dass . Damit die gesamte Phrase true zurückgibt, muss die Summe sowohl gleichmäßig teilbar als auch ungleich Null sein.

Warum kannst du nicht einfach einen einzelnen 32 Mod verwenden, anstatt einen 96 gefolgt von einem 64 zu machen?

Mit 32 würden Sie auch die Werte 0-9 beeinflussen. Mit 96/64 korrigieren Sie die Buchstaben, ohne die Ziffern zu berühren, und da die Buchstaben alle 26 und darunter sind, bleiben die bereits festgelegten Buchstaben beim Fixieren der Ziffern unberührt.

3 JonathanAllan Sep 21 2020 at 18:30

Python 3 , 54 Bytes

lambda s:(sum(ord(c)%48for c in s.lower())or.5)%len(s)

Eine unbenannte Funktion, die eine Zeichenfolge akzeptiert, die Null (Falsey) zurückgibt, wenn die Zeichenfolge ein Längen-Summen-Vielfaches ist, oder eine Nicht-Null-Zahl (wahr), wenn nicht.

Probieren Sie es online aus! Oder sehen Sie sich die Testsuite an .

3 DominicvanEssen Sep 21 2020 at 15:48

R , 63 62 57 56 Bytes

Bearbeiten: 1 Byte dank Jonah gespeichert

function(s)!sum(i<-utf8ToInt(s)%%96%%64%%48)%%nchar(s)&i

Probieren Sie es online aus!

Die Ausgabe ist eine Wahrheitsliste von einem oder mehreren WAHREN oder eine Falschliste von einem oder mehreren FALSCHEN.

3 user Sep 21 2020 at 17:10

Scala, 71 62 46 Bytes

  • Feste Antwort dank @Mr Redstoner
  • 9 Bytes dank @Dominic Van Essen gespart
  • 16 Bytes gespeichert! dank des tipps , den @xash auf Jonahs Antwort gab , den Dominic Van Essen vorschlug.
s=>{val x=(0/:s)(_+_%96%64%48);x>0&x%s.size<1}

Probieren Sie es online aus

32 Bytes, wenn Null nicht falsch wäre

s=>(0/:s)(_+_%96%64%48)%s.size<1

Probieren Sie es online aus

3 MrRedstoner Sep 21 2020 at 18:18

Java 79 77 68 66 64 Bytes

s->{int u=0;for(int c:s)u+=c%96%64%48;return u>0&u%s.length<1;};

Probieren Sie es hier aus!

Meine allererste Antwort! Der "0" -Testfall hat mich durcheinander gebracht, ohne ihn hätte ich 51 haben können (ich wollte versuchen, die C-Antwort herauszufordern, von der ich die Umwandlung von Zeichen in Zahlen ausgeliehen habe). Jetzt so ziemlich ein Port der C-Antwort.

s->s.chars().map(c->c%96%64%48).sum()%s.length()<1;

Immer noch ziemlich stolz darauf, einige der aktuellen Antworten in Sprachen wie Python und JavaScript mit dem "ach so wortreichen" Java zu übertreffen.

Vielen Dank an @user für ein paar zusätzliche gespeicherte Bytes

@ceilingcat für ein paar mehr

@ dominic-van-essen für 2 weitere mit @ xashs Idee

2 ovs Sep 21 2020 at 15:42

Python 3.8 , 59 Bytes

lambda d:1>(x:=sum(int(c,36)-9*(c>'9')for c in d))%len(d)<x

Probieren Sie es online aus!

2 Neil Sep 21 2020 at 17:55

Holzkohle , 18 Bytes

≔ΣE↧θ﹪℅ι⁴⁸η∧η¬﹪ηLθ

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Die Ausgabe ist ein Holzkohle-Boolescher Wert, dh -für ein Vielfaches, nichts, wenn nicht. Erläuterung:

≔ΣE↧θ﹪℅ι⁴⁸η

Konvertieren Sie die Zeichenfolge in Kleinbuchstaben, nehmen Sie die Codepunkte aller Zeichen, reduzieren Sie sie auf Modulo 48 und nehmen Sie dann die Summe.

∧η¬﹪ηLθ

Überprüfen Sie, ob die Summe ein Vielfaches ungleich Null der Länge der Zeichenfolge ist.

2 DomHastings Sep 21 2020 at 18:47

Perl 5 + -plF, 32 Bytes

-7 Bytes dank @Nahuel Fouilleul !

$s+=ord(lc)%48for@F;$_&&=1>$s%@F

Probieren Sie es online aus!

1 aidan0626 Sep 21 2020 at 15:51

Python 3 , 101 96 Bytes

def f(s):x=sum([i-[48,96][i>96]for i in map(ord,s.lower())]);return not(x%len(s))and x//len(s)>0

Probieren Sie es online aus!

1 HyperNeutrino Sep 21 2020 at 16:16

Gelee , 23 Bytes

ØWiⱮ_³e€ØD¤%26Sµ;ọ³L¤$Ȧ

Probieren Sie es online aus!

1 Byte Golf gespielt und auch das Programm tatsächlich zum Laufen gebracht (das dritte Mal ist ein Zauber? Es war immer noch kaputt)

Erläuterung

ØWiⱮ_³e€ØD¤%26Sµ;ọ³L¤$Ȧ  Main Link
   Ɱ                     For each character in the input
  i                      find its index in
ØW                       "ABC...XYZabc...xyz0123456789_"
    _                    and subtract from each element
     ³e€ØD¤              the corresponding value, which is
     ³                   if the original character
      e€                 is a member of
        ØD               the digits (this is to fix the one-off offset of the digits)
                         (the above nilad gets a list of 0 and 1 for if each character is a digit, and since Jelly's subtraction `_` is vectorized, this works as subtracting the corresponding element)
           %26           modulo 26
              Sµ         take the sum; begin a new link with this value
                ;    $   append
                 ọ       the number of times the sum is divisible by (just plain "divisible by?" has the arguments in the opposite order which would take 1 extra byte to flip)
                  ³L¤    the length of the input
                      Ȧ  any and all - are both values truthy; that is, is the sum divisible and non-zero?
1 Shaggy Sep 21 2020 at 15:48

Japt , 22 17 15 Bytes

Die Eingabe besteht aus einer Reihe von Zeichen.

Oder 13 Bytes , ohne Sonderfall 0.

xÈv c u48
©vNÎl

Versuch es

;x@ÒBbXu)ªX\n©vNÎl     :Implicit input of character array U
 x                     :Reduce by addition
  @                    :After passing each X through the following function
   Ò                   :  Negate the bitwise NOT of
;   B                  :  Uppercase alphabet
     b                 :  0-based index of
      Xu               :    Uppercase X
        )              :  End indexing
         ªX            :  Logical OR with X, which gets coerced to an integer
           \n          :Reassign to U
             ©         :Logical AND with
              v        :  Is divisible by
               N       :  Array of all inputs
                Î      :  First element (i.e., the original U)
                 l     :  Length
1 Arnauld Sep 21 2020 at 16:17

JavaScript (Node.js) ,  54  53 Byte

Gibt 0 oder 1 zurück .

s=>Buffer(s).map(c=>t+=++k&&c%96%64%48,k=t=0)|t%k<!!t

Probieren Sie es online aus!

Teck-freak Sep 21 2020 at 15:53

Python 2 & Python 3 - 69 Bytes

lambda a:0==sum(ord(s.upper())-[64,48][s.isdigit()]for s in a)%len(a)

Wenn man die Eingabe als Zeichenfolge für die Variable a annimmt, kann man bis zu 60 Bytes erreichen

0==sum(ord(s.upper())-[64,48][s.isdigit()]for s in a)%len(a)
SomoKRoceS Sep 21 2020 at 16:53

JavaScript, 107 Bytes

a=>(b=a.toLowerCase().split('').reduce((c,d)=>c+(+(isNaN(d)?d.charCodeAt(0)-96:d)),0)/a.length,!(b?b%1:!b))

Probieren Sie es online aus!

Neil Sep 21 2020 at 18:09

Retina 0,8,2 , 63 Bytes

^
$.'$*1;
T`L`l
[j-z]
55$& [t-z] 55$&
T`_l`ddd
\d
$* ^(1+);\1+$

Probieren Sie es online aus! Link enthält Testfälle. Erläuterung:

^
$.'$*1;

Stellen Sie der Eingabe eine unäre Kopie von sich selbst voran.

T`L`l

Konvertieren Sie es in Kleinbuchstaben.

[j-z]
55$& [t-z] 55$&
T`_l`ddd

Konvertieren Sie die Buchstaben in Ziffern mit derselben digitalen Summe.

\d
$*

Nehmen Sie die digitale Summe.

^(1+);\1+$

Stellen Sie sicher, dass es sich um ein Vielfaches ungleich Null der Länge handelt.

Razetime Sep 22 2020 at 04:30

MAWP , 78 Bytes

%|0/[!843WWP843WWWA/]~[!88WP88WWA/]~[!86WP86WWA/]_1A![1A~M~]%!~!~/P\WA{0:.}?1:

Versuch es!

Warten auf Antwort in 1 + ...

Verwendet die Modulmethode aus Jonahs J-Antwort.

LuisMendo Sep 21 2020 at 17:04

MATL , 12 11 Bytes

k48\stGn\~*

Die Ausgabe erfolgt, 0wenn die Eingabe ein Längen-Summen-Vielfaches oder eine positive Zahl ist.

Probieren Sie es online aus! Oder überprüfen Sie alle Testfälle .

Wie es funktioniert

k     % Implicit input. Convert to lowercase
48    % Push 48
\     % Modulus. Each character is first converted to its code-point
s     % Sum. This gives "s"
t     % Duplicate (*)
G     % Push input again
n     % Number of elements. This gives "n"
\     % Modulus
~     % Negate. This gives true if s mod n equals 0, or false otherwise (**)
*     % Multiply (*) and (**)
      % Implicit display. True and false are displayed as 1 and 0 respectively
LegionMammal978 Sep 25 2020 at 10:52

Wolfram Language (Mathematica) , 54 Bytes

Tr[a=FromDigits/@#/.a_/;a>9:>a-9]~Mod~Tr[1^#]==0<Tr@a&

Probieren Sie es online aus! Reine Funktion. Nimmt eine Liste von Zeichen als Eingabe und gibt sie zurück Trueoder Falseals Ausgabe. Der Großteil der Arbeit wird von erledigt FromDigits, wodurch die Zeichen 0-9, AZ in die Zahlen 0-35 konvertiert werden.