เครื่องคิดเลข Numerology


19

เป้าหมายของการท้าทายนี้คือการคำนวณหนึ่งชนิดของตัวเลขหลักจากสตริงที่มีตัวอักษรและตัวเลข

  • อินพุตอาจใช้วิธีการที่สะดวก (อินพุตมาตรฐานอาร์กิวเมนต์ไฟล์แยก)
  • การป้อนข้อมูลที่อาจจะมีตัวอักษรใด ASCII พิมพ์ แต่เพียงและตัวเลข ( A-Z, a-zและ0-9) จะต้องได้รับการพิจารณา
  • ผลลัพธ์จะต้องเป็นตัวเลขระหว่าง1และ9หรือเป็นดาว*ถ้าไม่มีตัวอักษรและไม่มีหลักที่พบ ... (หรือแม้ว่า0อินพุตจะมีจำนวนเท่าใดก็ได้0 และไม่มีอะไรอื่นนอกจากนี้ไม่สำคัญ)
  • ค่าตัวอักษรจะถูกแมปด้วยวิธีนี้:

    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
    
  • ตัวเลขหลักคำนวณโดยการเพิ่มมูลค่าของสตริงแต่ละแล้วทำซ้ำจนกว่าจะมีเพียงหนึ่งหลัก ตัวอย่างสำหรับ13579, Hello, world!, 00 0 00, !@#$%^&*();, และ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
    

    (อันนี้ยอดเยี่ยมตัวอย่างส่วนใหญ่ให้7! แต่เป็นเพียงตัวอย่างเท่านั้น)

    การทดสอบเพิ่มเติมบางส่วน:

    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
    

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

สั้นที่สุดตามภาษา


0 จะหายไปเมื่อเพิ่มเข้าไปในสิ่งอื่น ๆ
F. Hauri

0 ไม่เกี่ยวข้อง! เอาต์พุตที่เกี่ยวข้องอยู่ระหว่าง1ถึง9!
F. Hauri

คุณสามารถเพิ่มตัวอย่างที่ไม่มีตัวอักษรและตัวเลขได้หรือไม่
ETHproductions

1
ฉันหมายถึงสิ่งที่ชอบ!@#$%^&*(); *สิ่งที่ควรจะกลับ
ETHproductions

มันยากมากที่จะต่อต้านการอ้างถึงสิ่งนี้ในบางส่วนของการอภิปรายการวิเคราะห์ทางเทคนิคเกี่ยวกับพื้นที่เงิน ... ;-p
keshlam

คำตอบ:


6

Matlab, 121 ไบต์

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 ไม่ได้ถูกสร้างขึ้นมาเพื่อ strings = (



+1 ของฉันฉันทำดีกว่านี้ไม่ได้ btw จำเป็นต้องใส่dispstatement หรือไม่?
brainkz

@brainkz บางที แต่ฉันมักจะ incude มันจะอยู่ในความปลอดภัยด้าน
flawr

3

Mathematica, 174 168 163 ไบต์

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

ทำตามขั้นตอนแรกแล้วคำนวณรากดิจิตอล


3

Ruby, 97 74 ตัวอักษร

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

วิ่งตัวอย่าง:

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 ไบต์

73 + 1 สำหรับ-pสวิตช์

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

การทดสอบ

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ตัวอักษร !!

... ฉันคิดว่า: N % 32 + Yอาจแทนที่( N & 31 ) + Y !


1
ถ้าคุณจับ substring จับคู่ทั้งเป็นที่เท่าเทียมกันกับ$1 $&ดังนั้นควรลบการจับภาพและเปลี่ยนชื่อตัวแปร
จัดการระหว่าง

1
whileบล็อก 's $t="*";s/\d/$t+=$&/eg;$_=$tอาจจะ
จัดการ

1
ขออภัยจริง ๆ แล้วมันมีความยาว 1 ตัวอักษรเนื่องจากคุณควรรวม-pสวิตช์ไว้ในการนับ
จัดการระหว่าง

1
ขออภัยอีกครั้ง (ครั้งนี้เป็นการขออภัยครั้งใหญ่กว่า) แต่มันล้มเหลวในการป้อนอักขระที่ไม่ใช่คำเดียวตัวอย่างเช่น“!” ผลลัพธ์เหมือนกัน”!” ( ดูเหมือนว่าการทำงานเพราะที่นี่สายป้อนถูกส่งผ่านไปเสมอกับการขึ้นบรรทัดใหม่ต่อท้ายดังนั้นในกรณีการทดสอบของคุณไม่เคยผ่านการป้อนตัวอักษรตัวเดียว. ใช้echo -n "$test" | perl -pe '…'เพื่อดูสิ่งที่ผมหมายถึง.) คุณสามารถแก้ได้โดยการเปลี่ยนสภาพไปwhile !/^[\d*]$/ในขณะที่มีการลดการสูญเสียคะแนนคุณอาจแทนที่ทั้งหมดด้วยนี้while $t="*",s/\d/$t+=$&/eg,$_=$t until/^[\d*]$/
จัดการระหว่าง

1
มีการปรับปรุงอีกหนึ่งอย่างที่คุณสามารถทำได้ ในฐานะที่&มีลำดับความสำคัญต่ำกว่า+ในขณะที่%สูงขึ้นให้เปลี่ยน&31%32และคุณสามารถลบวงเล็บที่อยู่รอบ ๆ นิพจน์ย่อยนั้นได้
จัดการระหว่าง

3

ES6, 98 ไบต์

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- ไบต์ที่ใช้งานได้กับสตริงสั้น ๆ เท่านั้น:

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

การใช้match, mapและjoinเปิดออกจะสั้นกว่าการใช้replaceครั้งที่สอง:

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

ทดสอบที่นี่: https://jsbin.com/zizosayisi/edit?js,console


วิธีนี้ใช้ไม่ได้กับอินพุต00 0 00
rink.attendant.6

@ rink.attendant.6 Ah, REPL ที่ฉันใช้เพียงพิมพ์["0"]เพราะ0ฉันไม่สามารถบอกความแตกต่างได้
Neil

ดีกว่ารุ่น @ rink.attendant.6 มากเท่าไหร่! ใช้แฮ็คกอล์ฟที่ชาญฉลาด คุณสามารถอธิบาย> '@', & 31และ|| 9?
Pavlo

1
@Pavlo > '@'เพียงแยกความแตกต่างระหว่างตัวอักษรและตัวเลข & 31เป็นวิธีที่มีประโยชน์ในการเพิกเฉยความแตกต่างระหว่างรหัสตัวอักษรตัวพิมพ์ใหญ่และเล็กเพราะมันจะแมปรหัสตัวอักษรเข้ากับค่า 1..26 ได้อย่างสะดวก || 9จะใช้เพราะ% 9ผลตอบแทน 0 สำหรับทวีคูณของ 9 แต่ซ้ำ ๆ เพิ่มตัวเลขส่งกลับ 9 สำหรับทวีคูณที่ไม่เป็นศูนย์ของ 9 ในรหัส golfed ฉันใช้(t + 8) % 9 + 1แทนซึ่งมาในสิ่งเดียวกัน
Neil

ภาษานี้ใช้ชื่อว่า "JavaScript (ES6)"
edc65

2

Gema, 161 ตัวอักษร

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

(เขียนเพียงเพื่อลองว่าการเรียกโดเมนซ้ำจะทำงานได้หรือไม่

วิ่งตัวอย่าง:

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 ไบต์

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

ยังคงพยายามหาวิธีใช้การส่งคืนโดยนัยในฟังก์ชันภายนอก

Ungolfed + ไม่ระบุชื่อ

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. แยกอักขระที่ไม่ใช่ตัวอักษรและตัวเลขออกทั้งหมด
  2. เรียกใช้ฟังก์ชันซ้ำ ๆ เพื่อลดอักขระให้เป็นค่าตามลำดับในขณะที่สตริงยาวกว่า 1 อักขระ
    1. แปลงสตริงเป็นตัวพิมพ์ใหญ่เพื่อให้ทำงานกับรหัส ASCII ได้ง่าย
    2. แปลงเป็นอาร์เรย์โดยใช้โอเปอเรเตอร์การแพร่กระจาย
    3. ใช้isNaNฟังก์ชั่นทั่วโลก(ซึ่งปลดอินพุต) เพื่อตรวจสอบว่ามันไม่ใช่ตัวเลขหรือไม่
      • หากไม่ใช่ให้แปลงเป็นรหัส ASCII และ mod 9 เพื่อรับค่าที่เกี่ยวข้อง
      • หากเป็นตัวเลขให้โยนทิ้ง
  3. หากความยาวเป็น 0 จะไม่มีตัวอักษรและตัวเลขปรากฏ (ส่งคืนเครื่องหมายดอกจัน) มิฉะนั้นส่งคืนเอาต์พุตของฟังก์ชันเรียกซ้ำ

กฎการแบ่งนี้00 0 00ส่งออก*แทนที่จะเป็น 0!
F. Hauri

@ F.Hauri คงที่
rink.attendant.6 6

คุณสามารถหลีกเลี่ยงการส่งคืนอย่างชัดเจนโดยใช้โอเปอเรเตอร์ Comman: _=>{expr;return expr}=>_=>(expr,expr)
Pavlo

@Pavlo ฉันจะสมัครในกรณีของฉันได้อย่างไร
rink.attendant.6 6

ใช้งานไม่ได้สำหรับฉันพ่น SyntaxError: jsbin.com/havotusoqa/1/edit?js,console
Pavlo

1

Haskell, 126 ไบต์

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

การใช้งาน: ->f "Hello, world!""7"

lเป็นตารางการค้นหาสำหรับอักขระไปยังรายการจำนวนเต็ม (รายการซิงเกิลหากพบถ่านรายการอื่นที่ว่างเปล่า) fค้นหาข้อโต้แย้งของ char ทุกตัวและทำให้รายการที่ส่งคืนของรายการนั้นกลับเป็นรายการจำนวนเต็มและการโทรgเพื่อตรวจสอบสภาพสิ้นสุด (รายการที่ว่างเปล่า (-> *) หรือจำนวนเต็มเดียว) หรือเพื่อเรียกfด้วยผลรวมของรายการสำหรับรอบอื่น


1

MATL , 64 ไบต์

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

สิ่งนี้ใช้เวอร์ชันปัจจุบัน (4.0.0)ของภาษา

ฉันรู้สึกว่ามันสั้นลง ...

กรณีทดสอบ

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

โชคไม่ดีที่ฉันทดสอบตัวอย่างของคุณไม่ได้ กรุณาโพสต์กรณีทดสอบทั้งหมดรวมถึงการทดสอบที่เพิ่งเพิ่ม (ขออภัย)
F. Hauri

@ F.Hauri ใช่คุณต้องมี Matlab เพื่อทดสอบ ขออภัยที่ยังไม่มีคอมไพเลอร์ออนไลน์ ฉันได้เพิ่มกรณีทดสอบ
Luis Mendo

1

อย่างจริงจัง 50 ไบต์

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

ฐานสิบหก:

2c24973ba331d1df2b3b237058bb402d402d3b5960272a2e7f
60ce5831575860bda13b73392a402575604de4243b6c445758

ลองใช้ออนไลน์

อธิบาย:

,$ù                                               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 คลิก "ลองใช้งานออนไลน์" ป้อนกรณีทดสอบของคุณในกล่องใส่
quintopia


1

ทุบตีบริสุทธิ์199 194 ไบต์

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

(ตัวแบ่งบรรทัดที่สองมีไว้เพื่อหลีกเลี่ยงแถบเลื่อนเท่านั้น)

กฎทดสอบ:

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

โซลูชันแบบเรียกซ้ำ การเรียกซ้ำแบบหางตัวแปร t และ r ไม่จำเป็นต้องเป็นโลคอล

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

อธิบาย

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

ตัวอย่างการทดสอบ

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 ไบต์

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

การทดสอบนี้ล้มเหลวด้วย00 0 00!
F. Hauri

0

Mathematica, 133 ไบต์

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 ฟังก์ชั่นของฉันเปลี่ยนทุกอย่างให้เป็นรหัสตัวอักษรแล้วกรองสิ่งที่ไม่ใช่ตัวอักษรและตัวเลขออก (แทนที่ด้วยสตริงว่าง) หากไม่มีตัวอักษรและตัวเลขมันจะส่งกลับ * มิฉะนั้นจะใช้รากดิจิตอล สิ่งนี้อาจสั้นลงอย่างมีนัยสำคัญ (~ 15B) หากฉันไม่ต้องจัดการกับตัวพิมพ์ใหญ่ - ศูนย์ C'est la vie

Mathematica magic สำหรับมือใหม่: foo//.a_:>Tr@IntegerDigits@aเป็นการแทนที่ซ้ำ: แทนที่ตัวเลขใด ๆaใน foo ด้วยผลรวมของตัวเลขของพวกเขาจากนั้นจะแทนที่อีกครั้งจนกว่าจะถึงจุดคงที่คือaหยุดการเปลี่ยนภายใต้การแทนที่

แบบทดสอบ:

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}

โชคไม่ดีที่ฉันทดสอบตัวอย่างของคุณไม่ได้ กรุณาโพสต์กรณีทดสอบ
F. Hauri

ระหว่างทางของฉัน ในขณะที่รวบรวมการทดสอบฉันพบว่ามีการพิมพ์ผิดบางอย่างเพื่อแก้ไข ขอบคุณ;)
hYPotenuser
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.