Numerologie-Rechner

19

Das Ziel dieser Herausforderung besteht darin, eine Art von Numerologieziffer aus Zeichenfolgen zu berechnen, die Zeichen und Zahlen enthalten.

  • Die Eingabe kann über eine beliebige geeignete Methode erfolgen (Standardeingabe, Argumente, getrennte Datei).
  • Die Eingabe kann alle druckbaren ASCII - Zeichen enthalten, aber nur alphanumerical ( A-Z, a-z, und 0-9) müssen berücksichtigt werden.
  • Die Ausgabe muss eine Ziffer zwischen 1und 9oder ein Stern sein, *wenn kein Buchstabe und keine Ziffer gefunden wurden ... (oder auch, 0wenn die Eingabe eine beliebige Anzahl 0 und nichts anderes enthält, aber das spielt keine Rolle).
  • Buchstabenwerte werden folgendermaßen abgebildet:

    1  2  3  4  5  6  7  8  9
    a  b  c  d  e  f  g  h  i
    j  k  l  m  n  o  p  q  r
    s  t  u  v  w  x  y  z
    
  • Die Numerologieziffer wird berechnet, indem jeder Wert der Zeichenfolge addiert und wiederholt wird, bis nur noch eine Ziffer vorhanden ist. Probe für 13579, Hello, world!, 00 0 00, !@#$%^&*();, und 3.141592:

    13579 => 1 + 3 + 5 + 7 + 9 = 25 => 2 + 5 = 7
    Hello, world! => 8 + 5 + 3 + 3 + 6 + 5 + 6 + 9 + 3 + 4 = 52 => 5 + 2 = 7
    00 0 00 => 0 + 0 + 0 + 0 + 0 = 0
    !@#$%^&*(); => *
      => *
    3.141592 => 3 + 1 + 4 + 1 + 5 + 9 + 2 = 25 => 2 + 5 = 7
    3.1415926535897932384 => 
     3 + 1 + 4 + 1 + 5 + 9 + 2 + 6 + 5 + 3 + 5 + 8 + 9 + 7 + 9 + 3 + 2 + 3 + 8 + 4
     = 97 => 9 + 7 = 16 => 1 + 6 = 7
    

    (Das ist großartig, die meisten Beispiele geben es 7! Aber es ist nur ein Beispiel;)

    Noch ein paar Tests:

    Bob  => 2 + 6 + 2 = 10 => 1 + 0 = 1
    Charlie => 3 + 8 + 1 + 9 + 3 + 9 + 5 = 38 => 3 + 8 = 11 => 1 + 1 = 2
    Anna => 1 + 5 + 5 + 1 = 12 => 1 + 2 = 3
    Fana => 6 + 1 + 5 + 1 = 13 => 1 + 3 = 4
    Gregory => 7 + 9 + 5 + 7 + 6 + 9 + 7 = 50 => 5 + 0 = 5
    Denis => 4 + 5 + 5 + 9 + 1 = 24 => 2 + 4 = 6
    Erik => 5 + 9 + 9 + 2 = 25 => 2 + 5 = 7
    Helen => 8 + 5 + 3 + 5 + 5 = 26 => 2 + 6 = 8
    Izis => 9 + 8 + 9 + 1 = 27 => 2 + 7 = 9
    

Dies ist ein , also gewinnt die kürzeste Antwort in Bytes.

Kürzeste nach Sprache

F. Hauri
quelle
0 wird nicht mehr angezeigt, wenn zu irgendetwas anderem hinzugefügt
F. Hauri
0 ist nicht relevant! Relevante Ausgabe liegt zwischen 1und 9!
F. Hauri
Können Sie einige Beispiele ohne alphanumerische Zeichen hinzufügen?
ETHproductions
1
Ich meine so etwas wie !@#$%^&*(); etwas, das zurückkehren sollte *.
ETHproductions
Es war sehr schwer zu widerstehen, dies in einigen der Diskussionen über technische Analysen im Bereich Geld zu zitieren ... ;-p
keshlam

Antworten:

6

Matlab, 121 Bytes

s=[input('','s'),'*'];while nnz(s)>1;s=num2str(sum(mod([s(48<s&s<58)-4,s(96<s&s<123)+2,s(64<s&s<91)-2],9)+1));end;disp(s)

Matlab ist einfach nicht für Strings gemacht = (

fehlerhaft
quelle
3
Hey, zumindest ist es nicht so ausführlich wie Mma: P
LegionMammal978
mein +1 könnte ich nicht besser machen. Übrigens, ist es notwendig, eine dispErklärung abzugeben?
Brainkz
@brainkz Vielleicht, aber ich nehme es normalerweise auf die sichere Seite
Fehler
3

Mathematica, 174 168 163 Bytes

Catch[#-9Floor[Max[#-1,1]/9]&@If[(a=Tr[Characters@#/.{(b=a_String)?DigitQ:>FromDigits@a,b?LetterQ:>LetterNumber@a~Mod~9,b->0}])<1&&#~StringFreeQ~"0",Throw@"*",a]]&

Führt den ersten Schritt aus und berechnet dann die digitale Wurzel.

LegionMammal978
quelle
3

Ruby, 97 74 Zeichen

n=->s{(t=eval s.tr('a-z9A-Z','1-9'*6).scan(/\d/)*?+)&&t>9?n[t.to_s]:t||?*}

Probelauf:

2.1.5 :001 > n=->s{(t=eval s.tr('a-z9A-Z','1-9'*6).scan(/\d/)*?+)&&t>9?n[t.to_s]:t||?*}
 => #<Proc:0x00000001b4b3f0@(irb):4 (lambda)> 

2.1.5 :002 > puts ['13579', 'Hello, world!', '00 0 00', '!@#$%^&*();', ' ', '3.141592', '3.1415926535897932384', 'Bob', 'Charlie', 'Anna', 'Izis'].map{|s|'%s : %s'%[n[s],s]}
7 : 13579
7 : Hello, world!
0 : 00 0 00
* : !@#$%^&*();
* :  
7 : 3.141592
7 : 3.1415926535897932384
1 : Bob
2 : Charlie
3 : Anna
9 : Izis
Mann bei der Arbeit
quelle
3

Perl, 91 89 76 74 Bytes

73 + 1 für -pSchalter

s/[a-z]/(ord($&)%32-1)%9+1/eig;$t="*",s/\d/$t+=$&/eg,$_=$t until/^[*\d]$/

Tests

for test in '13579' 'Hello, world!' '00 0 00' '!@#$%^&*();' ' ' \
    '3.141592' '3.1415926535897932384' \
    Bob Charlie Anna Fana Gregory Denis Erik Helen Izis ;do  
    perl -pe '
      s/[a-z]/(ord($&)%32-1)%9+1/eig;$t="*",s/\d/$t+=$&/eg,$_=$t until/^[*\d]$/
      ' < <(echo -n "$test")
    echo "  $test"
done
7  13579
7  Hello, world!
0  00 0 00
*  !@#$%^&*();
*   
7  3.141592
7  3.1415926535897932384
1  Bob
2  Charlie
3  Anna
4  Fana
5  Gregory
6  Denis
7  Erik
8  Helen
9  Izis

Vielen Dank an @manatwork, dass Sie mir geholfen haben, 2 14 16 15 17 Zeichen zu sparen !!

... habe mir überlegt: N % 32 + Ydarf ersetzen( N & 31 ) + Y !

F. Hauri
quelle
1
Wenn Sie die gesamte übereinstimmende Teilzeichenfolge erfassen, $1ist gleich mit $&. Entfernen Sie die Erfassung, und ändern Sie den Variablennamen.
Handarbeit
1
whilekönnte sein block $t="*";s/\d/$t+=$&/eg;$_=$t.
Handarbeit
1
Tut mir leid, aber es ist tatsächlich 1 Zeichen länger, da Sie den -pSchalter in die Zählung einbeziehen sollten.
Handarbeit
1
Es tut mir wieder leid (diesmal ein größeres leid), aber es schlägt bei der Eingabe einzelner Zeichen, die keine Wörter sind, fehl, zum Beispiel "!" Ergibt dasselbe "!". ( Scheint zu funktionieren, da bei Here-String die Eingabe immer mit einem nachgestellten Zeilenumbruch übergeben wird, sodass in Ihren Testfällen die Eingabe von Einzelzeichen nie erfolgreich ist. echo -n "$test" | perl -pe '…'Sehen Sie, was ich meine.) Sie können das Problem lösen, indem Sie die whileBedingung in ändern !/^[\d*]$/. Zwar gibt es, die Partitur Verlust zu reduzieren, können Sie die gesamte ersetzen whilemit diesem: $t="*",s/\d/$t+=$&/eg,$_=$t until/^[\d*]$/.
Handarbeit
1
Es gibt noch eine Verbesserung, die Sie tun können. Da &hat eine niedrigere Priorität als +, während %höher ist, ändern Sie &31%32und Sie können die Klammern um diesen Unterausdruck entfernen.
Handarbeit
3

ES6, 98 Bytes

s=>(m=s.match(/[1-9a-z]/gi))?(t=8,m.map(c=>t+=c>'@'?c.charCodeAt()&31:+c),t%9+1):/0/.test(s)?0:'*'

Ungolfed:

function(s) {
    var m = s.match(/[1-9a-z]/gi);
    if (m) {
        var t = 0;
        for (var i = 0; i < m.length; i++) {
            if (m[i] > '@')
                t += m[i].charCodeAt(0) & 31;
            else
                t += parseInt(m[i]);
        }
        return t % 9 || 9;
    }
    return /0/.test(s) ? 0 : "*";
}

94-Byte-Version, die nur mit kurzen Zeichenfolgen funktioniert:

s=>(m=s.match(/[1-9a-z]/gi))?m.map(c=>c>'@'?c.charCodeAt()&31:c).join``%9||9:/0/.test(s)?0:'*'

Unter Verwendung match, mapund joinstellte sich heraus , dass sie kürzer als die Verwendung von replacezweimal:

s=>(m=s.replace(/[^1-9a-z]/gi,''))?m.replace(/[a-z]/gi,c=>c.charCodeAt()&31)%9||9:/0/.test(s)?0:'*'

Testen Sie es hier: https://jsbin.com/zizosayisi/edit?js,console

Neil
quelle
Dies funktioniert nicht für die Eingabe00 0 00
rink.attendant.6
@ rink.attendant.6 Ah, die REPL, die ich gerade verwendete, druckt ["0"]so, 0dass ich den Unterschied nicht erkennen konnte.
Neil
Viel, viel besser als @ rink.attendant.6 Version! Clevere Golf-Hacks zum Einsatz. Könnten Sie erklären > '@', & 31und || 9?
Pavlo
1
@Pavlo > '@'unterscheidet nur zwischen Buchstaben und Zahlen. & 31Dies ist eine nützliche Methode, um den Unterschied zwischen Groß- und Kleinbuchstaben zu ignorieren, da Zeichencodes auch bequem direkt auf 1..26-Werte abgebildet werden. || 9wird verwendet, weil % 90 für ein Vielfaches von 9 zurückgegeben wird, aber das wiederholte Hinzufügen von Ziffern 9 für ein Vielfaches von 9 ungleich Null zurückgibt (t + 8) % 9 + 1.
Neil
Die Sprache wird allgemein als "JavaScript (ES6)" bezeichnet
edc65
2

Gema, 161 Zeichen

*=@n{*}
n:\A=@set{t;};<L1>=@set{t;@add{$t;@add{@mod{@sub{@mod{@char-int{$0};32};1};9};1}}};<D1>=@set{t;@add{$t;$0}};?=;\Z=@cmps{$t;;;\*;@cmpn{$t;9;$t;$t;@n{$t}}}

(Nur geschrieben, um zu prüfen, ob rekursive Domänenaufrufe funktionieren.)

Probelauf:

bash-4.3$ for input in '13579' 'Hello, world!' '00 0 00' '!@#$%^&*();' ' ' '3.141592' '3.1415926535897932384'; do
>     echo -n "'$input' : "
>     gema '*=@n{*};n:\A=@set{t;};<L1>=@set{t;@add{$t;@add{@mod{@sub{@mod{@char-int{$0};32};1};9};1}}};<D1>=@set{t;@add{$t;$0}};?=;\Z=@cmps{$t;;;\*;@cmpn{$t;9;$t;$t;@n{$t}}}' <<< "$input"
>     echo
> done
'13579' : 7
'Hello, world!' : 7
'00 0 00' : 0
'!@#$%^&*();' : *
' ' : *
'3.141592' : 7
'3.1415926535897932384' : 7
Mann bei der Arbeit
quelle
1

JavaScript (ES6), 162 159 157 Bytes

f=_=>{for(_=_.replace(/\W+/g,''),g=$=>''+[...$.toUpperCase()].reduce((p,a)=>isNaN(a)?p+(a.charCodeAt()-64)%9:+a+p,0);1<(l=_.length);_=g(_));return!l?'*':g(_)}

Ich versuche immer noch, nach einer Möglichkeit zu suchen, implizite Rückgabe in der äußeren Funktion zu verwenden.

Ungolfed + unbegrenzt

f = str => {
  str = str.replace(/\W+/g, '');
  recursiveFunc = $ => String([...$.toUpperCase()].reduce(
    (prev, val) => isNaN(val) ? prev + (val.charCodeAt() - 64) % 9 : Number(val) + prev,
    0
  ));
  while (1 < (len = str.length)) {
    str = recursiveFunc(str);
  }
  return len === 0 ? '*' : recursiveFunc(str)
}
  1. Entfernt alle nicht alphanumerischen Zeichen
  2. Ruft eine Funktion rekursiv auf, um die Zeichen auf ihre jeweiligen Werte zu reduzieren, während die Zeichenfolge länger als 1 Zeichen ist.
    1. Konvertiert die Zeichenfolge in Großbuchstaben, um problemlos mit ASCII-Codes arbeiten zu können
    2. Konvertieren Sie mithilfe des Spread-Operators in ein Array und führen Sie einen Akkumulator aus
    3. Verwenden Sie die globale isNaNFunktion (die ihre Eingabe umsetzt), um zu überprüfen, ob es sich nicht um eine Zahl handelt
      • Ist dies nicht der Fall, konvertieren Sie in ASCII-Code und Mod 9, um den entsprechenden Wert zu erhalten
      • Wenn es eine Zahl ist, gib sie ein
  3. Wenn die Länge 0 ist, waren keine alphanumerischen Zeichen vorhanden (Sternchen zurückgeben), andernfalls die Ausgabe der rekursiven Funktion zurückgeben.
rink.attendant.6
quelle
Diese Pausenregel 00 0 00wird ausgegeben *anstatt 0!
F. Hauri
@ F.Hauri behoben.
rink.attendant.6
Sie können eine explizite Rückkehr vermeiden, indem Sie den Kommanoperator verwenden: _=>{expr;return expr}=>_=>(expr,expr)
Pavlo
@Pavlo Wie wende ich das in meinem Fall an?
rink.attendant.6
Funktioniert bei mir nicht, wirft SyntaxError: jsbin.com/havotusoqa/1/edit?js,console
Pavlo
1

Haskell, 126 Bytes

l x=[n|(c,n)<-zip(['0'..'9']++['a'..'z']++'\0':['A'..'Z'])$0:cycle[1..9],c==x]
g[]="*"
g[x]=show x
g x=f$show$sum x
f=g.(l=<<)

Verwendung: f "Hello, world!"-> "7".

list eine Nachschlagetabelle für Zeichen zur Auflistung von Ganzzahlen (Singleton-Liste, wenn char gefunden wird, leere Liste sonst). fDurchsucht jedes Zeichen seines Arguments und fasst die zurückgegebene Liste der Listen in eine einfache Liste von Ganzzahlen und Aufrufen zusammen g, um die Endebedingung (leere Liste (-> *) oder einzelne Ganzzahl) zu überprüfen oder fmit der Summe der Liste für eine weitere Runde aufzurufen .

nimi
quelle
1

MATL , 64 Bytes

jk42ht`YUt'[a-z]'XXY}3+w'[1-9]'XXY}6+h,9X\st9>]w2Y24Y2h!=~?x'*']

Dies verwendet die aktuelle Version (4.0.0) der Sprache.

Ich habe das Gefühl, dass es kürzer gemacht werden könnte ...

Testfälle

>> matl
 > jk42ht`YUt'[a-z]'XXY}3+w'[1-9]'XXY}6+h,9X\st9>]w2Y24Y2h!=~?x'*']
 > 
> 13579
7

>> matl
 > jk42ht`YUt'[a-z]'XXY}3+w'[1-9]'XXY}6+h,9X\st9>]w2Y24Y2h!=~?x'*']
 > 
> Hello, world!
7

>> matl
 > jk42ht`YUt'[a-z]'XXY}3+w'[1-9]'XXY}6+h,9X\st9>]w2Y24Y2h!=~?x'*']
 > 
> 00 0 00
0

>> matl 
 > jk42ht`YUt'[a-z]'XXY}3+w'[1-9]'XXY}6+h,9X\st9>]w2Y24Y2h!=~?x'*']
 > 
> !@#$%^&*();
*

>> matl
 > jk42ht`YUt'[a-z]'XXY}3+w'[1-9]'XXY}6+h,9X\st9>]w2Y24Y2h!=~?x'*']
 > 
> 3.141592
7

>> matl
 > jk42ht`YUt'[a-z]'XXY}3+w'[1-9]'XXY}6+h,9X\st9>]w2Y24Y2h!=~?x'*']
 > 
> 3.1415926535897932384
7

>> matl
 > jk42ht`YUt'[a-z]'XXY}3+w'[1-9]'XXY}6+h,9X\st9>]w2Y24Y2h!=~?x'*']
 > 
> Bob
1

>> matl
 > jk42ht`YUt'[a-z]'XXY}3+w'[1-9]'XXY}6+h,9X\st9>]w2Y24Y2h!=~?x'*']
 > 
> Charlie
2

>> matl
 > jk42ht`YUt'[a-z]'XXY}3+w'[1-9]'XXY}6+h,9X\st9>]w2Y24Y2h!=~?x'*']
 > 
> Anna
3

>> matl
 > jk42ht`YUt'[a-z]'XXY}3+w'[1-9]'XXY}6+h,9X\st9>]w2Y24Y2h!=~?x'*']
 > 
> Izis
9
Luis Mendo
quelle
Leider konnte ich Ihre Probe nicht testen. Bitte posten Sie ganze Testfälle, einschließlich kürzlich hinzugefügter Tests (sorry).
F. Hauri
@ F.Hauri Ja, Sie würden Matlab brauchen, um sie zu testen. Leider noch kein Online-Compiler. Ich habe die Testfälle hinzugefügt
Luis Mendo
1

Im Ernst, 50 Bytes

,$ù;ú1╤▀+;#pX╗@-@-;Y`'*.`╬X1WX`╜í;s9*@%u`MΣ$;lDWX

Hex Dump:

2c24973ba331d1df2b3b237058bb402d402d3b5960272a2e7f
60ce5831575860bda13b73392a402575604de4243b6c445758

Probieren Sie es online

Erklärt:

,$ù                                               Read input, make it a string, lowercase
    ú                                             Push lowercase alphabet
     1╤▀+                                         Prepend base 10 digits.
         ;#pX╗                                    Remove "0" from a copy and stash in reg0
   ;          @-                                  Remove alphanumerics from input copy
                @-                                Remove nonalphanumerics from input
                  ;Y                              Push 1 if string is empty, else 0
                    `'*.`╬                        If top is truthy, output * and halt
                          X                       Discard boolean
                           1                      Push 1 to enter loop
                            WX                 WX Loop while top of stack is truthy
                              `         `M        Map this function over the string
                               ╜                  Push alphanumeric string from reg0
                                í                 Push index of this char in it
                                 ;s9*             Push 9 if found, else -9
                                     @%u          Take index mod previous: this yields the
                                                  correct conversion from the numerology
                                          Σ       Sum the resulting digits.
                                           $      Convert the sum to a string.
                                            ;lD   push 1 less than its length
Quintopie
quelle
@ F.Hauri Klicken Sie auf "Online testen". Geben Sie Ihre Testfälle in das Eingabefeld ein.
Quintopia
1

Pyth, 39 Bytes

IK@J+jkUTGrz0WtK=K`smh%xtJd9-K\0)K).?\*

Probieren Sie es online

Ich mache das nur, weil ich nicht schlafen kann. Vielleicht erkläre ich es morgen ...

Quintopie
quelle
1

Pure Bash, 199 bis 194 Bytes

eval a+={a..z};r="$1";while [ "${r:1}" ];do o=;for ((i=0;i<${#r};i++));do
l=${r:i:1};case $l in [a-zA-Z])d=${a%${l,}*};((o+=$((${#d}%9+1))));;[0-9])
((o+=l));;esac;done;r="$o";done;echo "${o:-*}"

(Der zweite Zeilenumbruch dient nur zum Vermeiden der Bildlaufleiste.)

Testregel:

numerology() {
    eval a+={a..z};
    r="$1";
    while [ "${r:1}" ]; do
        o=;
        for ((i=0; i<${#r}; i++))
        do
            l=${r:i:1};
            case $l in 
                [a-zA-Z])
                    d=${a%${l,}*};
                    ((o+=$((${#d}%9+1))))
                ;;
                [0-9])
                    ((o+=l))
                ;;
            esac;
        done;
        r="$o";
    done;
    echo "${o:-*}"
}

for test in '13579' 'Hello, world!' '00 0 00' '!@#$%^&*();' ' ' \
            '3.141592' '3.1415926535897932384'\
            Bob Charlie Anna Fana Gregory Denis Erik Helen Izis ;do
    echo "$(numerology "$test")" $test
done
7 13579
7 Hello, world!
0 00 0 00
* !@#$%^&*();
*
7 3.141592
7 3.1415926535897932384
1 Bob
2 Charlie
3 Anna
4 Fana
5 Gregory
6 Denis
7 Erik
8 Helen
9 Izis
F. Hauri
quelle
1

JavaScript (ES6), 78 83

Rekursive Lösung. Als Schwanzrekursion müssen die Variablen t und r nicht lokal sein.

f=x=>(t=r=0,x.replace(/\w/g,d=>t+=1+~-parseInt(d,r=36)%9),t>9?f(''+t):r?t:'*')

Erklärt

f=x=>(
  t = 0, // set initial value of counter to 0 
  r = 0, // flag to verify that we found at last one alphanumeric chars
  x.replace(/\w/g, d => ( // execute the following for each alphanumeric character
    // t += 1 + ~-parseInt(d,r=36) % 9 explained below
    r = 36, // set flag, could be any nonzero value
    d = parseInt(d,36), // convert to numeric. a..z -> 10..25, case insensitive.
    d = 1 + (d-1) % 9, // this is the arithmetic conversion required (
                       // works also with 0 because the strange implementation of % in javascript for negative numbers
    t = t + d // add to global counter
  ) ), 
  t > 9 // if t > 9 then we found some alphanumeric char, but we must repeat the loop on t
    ? f(''+t) // recursive call, t is numeric and must become a string
    : r // check flag r 
      ? t // if alphanumeric found, return t 
      : '*' // else return '*'
)

Testschnipsel

f=x=>(t=r=0,x.replace(/\w/g,d=>t+=1+~-parseInt(d,r=36)%9),t>9?f(''+t):r?t:'*')

console.log=x=>O.textContent+=x+'\n';

;[['13579',7],['Hello, world!',7],['00 0 00',0],['!@#$%^&*();','*'],
['3.141592',7],['3.1415926535897932384',7],
['Bob', 1],['Charlie', 2],['Anna', 3],['Fana', 4],['Gregory', 5],
['Denis', 6],['Erik', 7],['Helen', 8],['Izis', 9]]
.forEach(t=>{
  i=t[0]+''
  k=t[1]
  r=f(i)
  console.log(i+' -> ' + r + (k==r? ' OK':' Fail - expected '+k))
  })
<pre id=O></pre>

edc65
quelle
0

Python, 154 Bytes

def A(S):
 D=lambda x:int(x)if x.isdigit()else (ord(x.lower())-6)%9
 while len(S)>1:S=str(sum([D(c)for c in S if c.isalnum()]))
 print S if int(S)else"*"
Kieran Hunt
quelle
Dieser Fehlertest mit 00 0 00!
F. Hauri
0

Mathematica, 133 Bytes

f[s_]:= ToCharacterCode@ToUpperCase@s-64/.{a_/;17>-a>6:>a+16,b_/;b<1||b>26:>""}//If[Or@@NumberQ/@#,Tr@#/.""->0//.a_:>Tr@IntegerDigits@a,"*"]&

Ein bisschen anders als bei LegionMammal978. Meine Funktion wandelt alles in einen Zeichencode um und filtert dann die nicht-alphanumerischen Elemente heraus (indem sie durch leere Zeichenfolgen ersetzt werden). Wenn keine alphanumerischen Zeichen vorhanden sind, wird * zurückgegeben, andernfalls wird die digitale Wurzel verwendet. Dies könnte erheblich (~ 15B) kürzer sein, wenn ich mich nicht mit dem Ganz-Null-String-Fall befassen müsste. So ist das Leben.

Die Mathematica-Magie für die Uneingeweihten: foo//.a_:>Tr@IntegerDigits@aist eine wiederholte Ersetzung: Sie ersetzt alle Zahlen ain foo durch die Summe ihrer Ziffern und ersetzt sie dann erneut, bis sie einen festen Punkt erreicht, dh sie aändert sich nicht mehr, wenn sie ersetzt wird .

Tests:

f /@ {"13579", "Hello,world!", "00 0 00", "!@#$%^&*()", "3.141592","3.1415926535897932384"}
     => {7, 7, 0, "*", 7, 7}
f /@ {"Bob", "Charlie", "Anna", "Fana", "Gregory", "Denis", "Erik",  "Helen", "Izis"}
     => {1, 2, 3, 4, 5, 6, 7, 8, 9}
Hypotenuser
quelle
Leider konnte ich Ihre Probe nicht testen. Bitte poste Testfälle
F. Hauri
Bin unterwegs. Beim Zusammenstellen der Tests habe ich auch einige Tippfehler gefunden, die behoben werden müssen. Danke;)
hYPotenuser