Numeroloji Hesaplayıcı


19

Bu zorluğun amacı karakter ve sayı içeren dizelerden bir çeşit numeroloji basamağını hesaplamaktır .

  • Giriş herhangi bir uygun yöntemle (standart girdi, bağımsız değişkenler, ayrılmış dosya) olabilir.
  • Giriş herhangi bir ASCII karakter içeren, ama sadece alfa nümerik (edebilir A-Z, a-zve 0-9) dikkate alınması gerekir.
  • Çıktı 1ve arasında bir rakam olmalıdır 9veya *herhangi bir harf bulunmazsa ve bulunmayan bir rakam 0yoksa ... (veya girdi herhangi bir sayı içeriyorsa 0 ve başka bir şey içermiyor olsa bile , bu önemli değildir).
  • Harf değerleri şu şekilde eşlenir:

    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
    
  • Numeroloji basamaklı tek haneli kalmayıncaya kadar dize her değerini ekleyerek hesaplanır, daha sonra tekrarlayın. Numune için 13579, Hello, world!, 00 0 00, !@#$%^&*();, ve 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
    

    (Bu harika, bu örneklerin çoğu verir 7! Ama sadece örnek;)

    Biraz daha test:

    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
    

Bu bir , bu yüzden bayttaki en kısa cevap kazanıyor.

Dile göre en kısa


0 başka bir şeye eklendiğinde ortadan
kaybolacak

0 ilgili değil! İlgili çıktı 1ve arasında 9!
F. Hauri

Alfasayısal karakter içermeyen bazı örnekler ekleyebilir misiniz?
ETHproductions

1
Yani şöyle bir şey demek istiyorum !@#$%^&*(); geri dönmesi gereken bir şey *.
ETHproductions

Para alanındaki bazı teknik analiz tartışmalarında buna atıfta bulunmak çok zor oldu ...
;-p

Yanıtlar:


6

Matlab, 121 bayt

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 sadece dizeler için yapılmamıştır = (


3
Hey, en azından Mma kadar ayrıntılı değil: P
LegionMammal978

+ 1'im, daha iyisini yapamadım. btw, dispifade vermek gerekli mi?
brainkz

@brainkz Belki, ama genellikle güvenli tarafta
olmaya teşvik ediyorum

3

Mathematica 174 168 163 bayt

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]]&

İlk adımı yapar, sonra dijital kökü hesaplar.


3

Ruby, 97 74 karakter

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

Örnek çalışma:

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

3

Perl, 91 89 76 74 bayt

73 + 1 -panahtar için

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

Testler

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

@Manatwork 2 14 16 15 17 karakter kurtarmak için bana yardım ettiğiniz için teşekkürler !!

... Ben düşündüm: N % 32 + Ymay replace( N & 31 ) + Y !


1
Eşleşen tüm alt dizeyi yakalarsanız, $1eşittir $&. Yakalamayı daha iyi kaldırın ve değişken adını değiştirin.
manatwork

1
whilebloğu olabilir $t="*";s/\d/$t+=$&/eg;$_=$t.
manatwork

1
Üzgünüz, ama aslında 1 karakter daha uzun, -panahtarı saymaya dahil etmelisiniz .
manatwork

1
Tekrar özür dilerim (bu sefer daha büyük bir özür dilerim), ancak tek kelime olmayan karakter girişinde başarısız oluyor, örneğin “!” Sonuçları aynı ”!”. ( Görünüyor burada-string ile giriş mutlaka sonunda yeni satır ile geçirilir çünkü böylece test durumlarda asla tek karakter girişi geçer, çalışmaya. Kullanım echo -n "$test" | perl -pe '…'ne demek istediğimi görmek için.) Sen değiştirerek bunu çözebilir whileiçin koşul !/^[\d*]$/. , Skor kaybını orada azaltmak için de, sen bütününü yerine geçebilir whilebununla: $t="*",s/\d/$t+=$&/eg,$_=$t until/^[\d*]$/.
manatwork

1
Yapabileceğiniz bir gelişme daha var. Gibi &daha düşük önceliğe sahiptir +ederken, %daha yüksek, değişime sahiptir &31%32ve bu alt ifadenin etrafında parantez kaldırabilirsiniz.
manatwork

3

ES6, 98 bayt

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 : "*";
}

Yalnızca kısa dizelerde çalışan 94 baytlık sürüm:

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

Kullanılması match, mapve joinkullanmaktan daha kısa olduğu ortaya çıktı replaceiki defa:

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

Burada test edin : https://jsbin.com/zizosayisi/edit?js,console


Bu girdi için çalışmaz00 0 00
rink.attendant.6

@ rink.attendant.6 Ah, kullandığım REPL farkları anlayamadığım için sadece baskılar ["0"]yapıyor 0.
Neil

@ Rink.attendant.6 sürümünden çok daha iyi! Zeki golf kesmek kullanılır. Eğer açıklayabilir misiniz > '@', & 31ve || 9?
Pavlo

1
@ Pavlo > '@'sadece harfler ve sayılar arasında ayrım yapar. & 31karakter kodlarını uygun şekilde doğrudan 1..26 değerleriyle eşleştirdiği için büyük ve küçük harf karakter kodları arasındaki farkı görmezden gelmenin yararlı bir yoludur. || 9kullanılır çünkü % 99'un katları için 0 döndürür, ancak art arda basamak ekleyerek 9'un sıfır olmayan katları için 9 döndürür (t + 8) % 9 + 1.
Neil

Dil genellikle "JavaScript (ES6)" olarak adlandırılır
edc65

2

Gema, 161 karakter

*=@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}}}

(Yalnızca yinelenen alan adı çağrılarının çalışıp çalışmadığını denemek için yazılmıştır.)

Örnek çalışma:

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

1

JavaScript (ES6), 162 159 157 bayt

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(_)}

Hala dış işlevde örtük dönüş kullanmanın bir yolunu aramaya çalışıyorum.

İşaretsiz + değiştirilmemiş

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. Alfasayısal olmayan tüm karakterleri çıkarır
  2. Dize 1 karakterden uzunken karakterleri ilgili değerlerine azaltmak için bir işlevi özyinelemeli olarak çağırır.
    1. ASCII kodlarıyla kolayca çalışmak için dizeyi büyük harfe dönüştürür
    2. Forma operatörünü kullanarak diziye dönüştürün ve bir akümülatör çalıştırın
    3. isNaNBir sayı olup olmadığını kontrol etmek için global işlevini (girişini düzenleyen) kullanın
      • Değilse, ilgili değerini almak için ASCII koduna ve mod 9'a dönüştürün
      • Eğer bir sayı ise,
  3. Uzunluk 0 ise, alfasayısal karakter yoktu (yıldız işareti döndürün), aksi takdirde özyinelemeli işlevin çıktısını döndürün.

Bu mola kuralı yerine 00 0 00çıktı ! *0
F. Hauri

@ F.Hauri Düzeltildi.
rink.attendant.6

Comman operatörünü kullanarak açık dönüşü önleyebilirsiniz: _=>{expr;return expr}=>_=>(expr,expr)
Pavlo

@Pavlo Bunu benim durumumda nasıl uygularım?
rink.attendant.6

Benim için çalışmıyor, SyntaxError atar: jsbin.com/havotusoqa/1/edit?js,console
Pavlo

1

Haskell, 126 bayt

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

Kullanımı: f "Hello, world!"-> "7".

lkarakterlerin tamsayılar listesine girmesi için bir arama tablosudur (eğer char bulunursa, tekli liste, aksi takdirde boş liste). fargümanının her karakterini arar ve döndürülen liste listesini gson koşulu (boş liste (-> *) veya tek tamsayı) kontrol etmek veya fbaşka bir tur için listenin toplamıyla çağırmak için basit bir tamsayılar ve çağrılar listesine düzleştirir .


1

MATL , 64 bayt

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

Bu , dilin geçerli sürümünü (4.0.0) kullanır .

Daha kısa yapılabileceğini hissediyorum ...

Test senaryoları

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

Ne yazık ki, numunenizi test edemedim. Lütfen yakın zamanda eklenen testler de dahil olmak üzere tüm test vakalarını gönderin (üzgünüm).
F. Hauri

@ F.Hauri Evet, onları test etmek için Matlab'a ihtiyacınız var. Üzgünüm, henüz çevrimiçi derleyici yok. Test
senaryolarını

1

Ciddi, 50 bayt

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

Hex Dökümü:

2c24973ba331d1df2b3b237058bb402d402d3b5960272a2e7f
60ce5831575860bda13b73392a402575604de4243b6c445758

Çevrimiçi Deneyin

Açıklaması:

,$ù                                               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

@ F.Hauri "Çevrimiçi Deneyin" düğmesini tıklayın. test kutularınızı giriş kutusuna girin.
quintopia


1

Saf bash, 199 194 bayt

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:-*}"

(ikinci satır sonu yalnızca kaydırma çubuğundan kaçınmak içindir)

Test kuralı:

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

1

JavaScript (ES6), 78 83

Özyinelemeli çözüm. Kuyruk özyineleme olduğundan, t ve r değişkenlerinin yerel olması gerekmez.

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

Açıklaması

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

Test snippet'i

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>


0

Python, 154 bayt

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"*"

Bu başarısızlık testi ile 00 0 00!
F. Hauri

0

Mathematica, 133 bayt

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,"*"]&

LegionMammal978'den biraz farklı. İşlevim her şeyi bir karakter koduna dönüştürür, ardından alfasayısal olmayan şeyleri filtreler (boş dizelerle değiştirir). Alfanümerik yoksa, * döndürür, aksi takdirde dijital kök alır. All-zeros-string ile uğraşmak zorunda kalmazsam, bu önemli ölçüde (~ 15B) daha kısa olabilir. En la vie.

Mathematica büyüsü, başlatılmamış için: foo//.a_:>Tr@IntegerDigits@atekrarlanan bir yedek: foo'daki herhangi bir sayıyı rakamlarının atoplamıyla değiştirir, daha sonra sabit bir noktaya ulaşana kadar tekrar adeğiştirir , yani değiştirme altında değişmeyi durdurur.

Testler:

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}

Ne yazık ki, numunenizi test edemedim. Lütfen test
senaryoları gönderin

Yolumun üzerinde. Testleri bir araya getirirken, düzeltmek için bazı yazım hataları buldum. Thanks;)
hYPotenuser
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.