[Question]
  [
In the MMORPG Final Fantasy XIV, the Ninja class has the ability to use combinations of up to three handsigns (Ten, Chi and Jin) to perform a variety of ninjutsu skills.
The skill you cast depends on the last sign used, and using two or more of the same sign makes the ninjutsu skill fail and [puts a little bunny on your head](https://external-preview.redd.it/P1Z4Ux5iuAM8HiiX1YcOXetj_Zhp6qR9DSD4JiSsE0U.jpg?auto=webp&s=2215b323234c063590efdc85b3d0c67b4e89f3ad).
## Challenge
Your job is to take up to three handsigns as input, and output the name of the ninjutsu skill this combination does. Of course, since this is [code-golf](/questions/tagged/code-golf "show questions tagged 'code-golf'"), the goal is to make your code as short as possible!
## Input
The program should take between 1 and 3 handsigns as input via STDIN or function arguments. You can use any kind of input format you prefer.
Example inputs:
```
TCJ
Ten Chi Jin
["T", "C", "J"]
["Ten", "Chi", "Jin"]
```
## Output
The program should output the name (in title case) of the ninjutsu skill you get from the handsigns sent to it via input. Here's a table of each combination and their resulting skill.
Mudra table:
```
| Handsigns                     | Ninjutsu Skill |
|-------------------------------|----------------|
| Any one                       | Fuma Shuriken  |
| Any one + Ten                 | Katon          |
| Any one + Chi                 | Raiton         |
| Any one + Jin                 | Hyoton         |
| Any two + Ten                 | Huton          |
| Any two + Chi                 | Doton          |
| Any two + Jin                 | Suiton         |
| Contains two of the same sign | Bunny          |
```
Bunny takes precedence over any other ninjutsu.
## Examples
```
TCJ                -> Suiton
J                  -> Fuma Shuriken
['Ten', 'Chi']     -> Raiton
"Jin" "Jin" "Ten"  -> Bunny
```
## Leaderboards
Here is a Stack Snippet to generate both a regular leaderboard and an overview of winners by language.
To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:
```
# Language Name, N bytes
```
where `N` is the size of your submission. If you improve your score, you *can* keep old scores in the headline, by striking them through. For instance:
```
# Ruby, <s>104</s> <s>101</s> 96 bytes
```
If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the *last* number in the header:
```
# Perl, 43 + 2 (-p flag) = 45 bytes
```
You can also make the language name a link which will then show up in the leaderboard snippet:
```
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
```
```
var QUESTION_ID=218805;
var OVERRIDE_USER=45220;
var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;function answersUrl(d){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+d+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(d,e){return"https://api.stackexchange.com/2.2/answers/"+e.join(";")+"/comments?page="+d+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(d){answers.push.apply(answers,d.items),answers_hash=[],answer_ids=[],d.items.forEach(function(e){e.comments=[];var f=+e.share_link.match(/\d+/);answer_ids.push(f),answers_hash[f]=e}),d.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(d){d.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),d.has_more?getComments():more_answers?getAnswers():process()}})}getAnswers();var SCORE_REG=function(){var d=String.raw`h\d`,e=String.raw`\-?\d+\.?\d*`,f=String.raw`[^\n<>]*`,g=String.raw`<s>${f}</s>|<strike>${f}</strike>|<del>${f}</del>`,h=String.raw`[^\n\d<>]*`,j=String.raw`<[^\n<>]+>`;return new RegExp(String.raw`<${d}>`+String.raw`\s*([^\n,]*[^\s,]),.*?`+String.raw`(${e})`+String.raw`(?=`+String.raw`${h}`+String.raw`(?:(?:${g}|${j})${h})*`+String.raw`</${d}>`+String.raw`)`)}(),OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(d){return d.owner.display_name}function process(){var d=[];answers.forEach(function(n){var o=n.body;n.comments.forEach(function(q){OVERRIDE_REG.test(q.body)&&(o="<h1>"+q.body.replace(OVERRIDE_REG,"")+"</h1>")});var p=o.match(SCORE_REG);p&&d.push({user:getAuthorName(n),size:+p[2],language:p[1],link:n.share_link})}),d.sort(function(n,o){var p=n.size,q=o.size;return p-q});var e={},f=1,g=null,h=1;d.forEach(function(n){n.size!=g&&(h=f),g=n.size,++f;var o=jQuery("#answer-template").html();o=o.replace("{{PLACE}}",h+".").replace("{{NAME}}",n.user).replace("{{LANGUAGE}}",n.language).replace("{{SIZE}}",n.size).replace("{{LINK}}",n.link),o=jQuery(o),jQuery("#answers").append(o);var p=n.language;p=jQuery("<i>"+n.language+"</i>").text().toLowerCase(),e[p]=e[p]||{lang:n.language,user:n.user,size:n.size,link:n.link,uniq:p}});var j=[];for(var k in e)e.hasOwnProperty(k)&&j.push(e[k]);j.sort(function(n,o){return n.uniq>o.uniq?1:n.uniq<o.uniq?-1:0});for(var l=0;l<j.length;++l){var m=jQuery("#language-template").html(),k=j[l];m=m.replace("{{LANGUAGE}}",k.lang).replace("{{NAME}}",k.user).replace("{{SIZE}}",k.size).replace("{{LINK}}",k.link),m=jQuery(m),jQuery("#languages").append(m)}}
```
```
body{text-align:left!important}#answer-list{padding:10px;float:left}#language-list{padding:10px;float:left}table thead{font-weight:700}table td{padding:5px}
```
```
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/primary.css?v=f52df912b654"> <div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table> 
```
  
[Answer]
# JavaScript (ES6), 95 bytes
*A shorter version suggested by @tsh*
Expects `[1,2,3]` for `"TCJ"`.
```
(a,b,c)=>a^b&&a^c&&b^c?',Hu,Do,Sui,Hyo,Rai,Ka'.split`,`[c||7-b]+'ton':b?'Bunny':'Fuma Shuriken'
```
[Try it online!](https://tio.run/##TU5da8IwFH33V9yF0SQYg7KHgaOKcw5xD8L0TVp6m7YzribF2jFZ/e1do4z5ci6cr3t2@IWlOuji2DM2SZvMbxiKWCjujzCMPQ9D5XlxqMZUzCvxYsWq0mJ@suIdtXhDKssi18dIRBtV14@9OOjSozV0GI/pc2XMiQ7pa7VHWG2rg/5MDW0m4MOGEAFk7WDqYEGCp85EZvYwQ7VlCP6oA4DgefDPxlcWbij1RwG0cl3DXXu6oDh3UWVNafNU5vaDRez@h5X99je2hqtJFpjMTMIe@JmDkwdumpSy7Adyj8WlHgispwsitUnS72XG2m4ud1YbRultA/RGbUfGXHzAzxG/7HLIO7z5BQ "JavaScript (Node.js) ‚Äì Try It Online")
---
# JavaScript (ES6), 99 bytes
Expects `"012"` for `"TCJ"`.
```
s=>/(.).?\1/.test([,b,c]=s)?'Bunny':b?'Hu,Do,Sui,Hyo,Rai,Ka'.split`,`[c||5-b]+'ton':'Fuma Shuriken'
```
[Try it online!](https://tio.run/##TU5dT4MwFH3fr7gSs7ZZKVuMLzNA5pxZ5oOJ8w1JKKVsKLaEgnEZ@@1YXIx7OTc5H/ecd/7FjaiLqnGVzmSf@73xAw8zwsK3mccaaRoc0ZSK2DckRPetUgc0T0O0bumDptu2oOuDpi@8oE8cMVOVRZPQJBJdd@um8QQ1WqE5emw/OWz3bV18SIX6BfgQOQ4F53WA5QAbJ74bLViu6xUXe8zBD0YAHMZj@GfTMwsXlPijAKzcdXBlzwQEIUNUaGV0KVmpdzjB10dsprabW8PZxCqerVSGb8iJwCDPrGymrJZVyYXEHvN2FIYOu3W5cVihMvn9nGP7/zIMbmDjuc2TU0J@9wxIRqT/AQ "JavaScript (Node.js) ‚Äì Try It Online")
### Commented
```
s =>                         // s = input string
  /(.).?\1/                  // regex to detect a duplicate character
  .test([, b, c] = s)        // apply it to s; at the same time, load the 2nd
                             // and 3rd characters into b and c respectively
  ?                          // if there's a duplicate:
    'Bunny'                  //   return 'Bunny'
  :                          // else:
    b ?                      //   if the 2nd character is defined:
      'Hu,Do,Sui,Hyo,Rai,Ka' //     lookup string of prefixes
      .split`,`              //     split it
      [c || 5 - b]           //     use c if it's defined, or 5 - b otherwise
      + 'ton'                //     append the suffix
    :                        //   else:
      'Fuma Shuriken'        //     return 'Fuma Shuriken'
```
[Answer]
# [R](https://www.r-project.org/), ~~153~~ ~~149~~ ~~144~~ 139 bytes
*Edit: -5 bytes thanks to Giuseppe*
```
function(x)`if`(any(table(x)>1),'Bunny',`if`((l=sum(x|1))-1,a[l*3-6+x[l]],'Fuma Shuriken'));a=paste0(scan(,''),'ton')
Ka
Rai
Hyo
Hu
Do
Sui
```
[Try it online!](https://tio.run/##bY/BasMwEETv@gpBD5JaBSIJekhxD00Iob01vYVAFGMTtc4q2Fqwof/uippSI/s281azO6p7cPCJocGsLxHy4DzwVpxceeIWOh7suSoieFZCshcE6Jj8HfIqa/DK228lxEJJe6juzeLxoT1Ux6NkW7xaur9g7b4KYEI82exmm1AseZNb4JKxuC74OCJvlrxbR3adJzskG0/26Eh/Rx3cMKyooqWvKfuIayTVg1lfXDRmMK8O2Ir8/YIr8a/1SJuRzrmSsfYY6BSYFCip04hOIzqNmDRi0sgE6Gk1M1Nu5tYU6WmBmU7Dq/4H "R ‚Äì Try It Online")
Input is `1` for 'Ten', `2` for 'Chi', `3` for 'Jin'.
**Ungolfed:**
```
a=paste0(scan(,''),'ton')       # scan(,'') reads the subsequent strings until it finds an empty one,
Ka                              # paste0 joins them each together with 'ton'.
Rai
Hyo
Hu
Do
Sui
function(x){
 if(any(table(x)>1))'Bunny'     # if there are any duplicates: 'Bunny'
 else{                          # otherwise
  l=length(x)                   # define l=length of x (the R golfy way: sum(x|1) because 'length' is 6 letters)
  if(l-1)a[l*3-6+tail(x,1)]     # if it isn't length 1, output the relevant element from the vector 'a' of ninjutsu names 
  else'Fuma Shuriken'           # otherwise (it's length 1): 'Fuma Shuriken'.
 }
}
```
```
[Answer]
# x86-16 machine code, IBM PC DOS, ~~102~~ 101 bytes
```
00000000: b409 ba38 0149 742d ba46 0151 51ac 8bfe  ...8.It-.F.QQ...
00000010: f2ae 59e0 f759 741d 49ac 7402 0403 2c30  ..Y..Yt.I.t...,0
00000020: 8ad0 b024 b116 bf4b 01f2 aefe ca75 fa8b  ...$...K.....u..
00000030: d7cd 2103 d1cd 21c3 4675 6d61 2053 6875  ..!...!.Fuma Shu
00000040: 7269 6b65 6e24 4275 6e6e 7924 4b61 2452  riken$Bunny$Ka$R
00000050: 6169 2448 796f 2448 7524 446f 2453 7569  ai$Hyo$Hu$Do$Sui
00000060: 2474 6f6e 24                             $ton$
```
**Listing:**
```
B4 09       MOV  AH, 9                  ; DOS display $-terminated string syscall 
                                        ; STEP 1 - check if input is only 1 char
BA 0138     MOV  DX, OFFSET FAM         ;  default output is Fama
49          DEC  CX                     ;  is only 1 char? 
74 2D       JZ   DONE                   ;  if so, output is Fama
                                        ; STEP 2 - check if input has duplicate chars
BA 0147     MOV  DX, OFFSET BUN         ;  next default output is Bunny 
51          PUSH CX                     ;  save original input length
        DUP_LOOP:
51          PUSH CX                     ;  save loop position 
AC          LODSB                       ;  load next char into AL 
8B FE       MOV  DI, SI                 ;  start search at current char 
F2 AE       REPNZ SCASB                 ;   and search for AL 
59          POP  CX                     ;  restore loop position 
E0 F7       LOOPNZ DUP_LOOP             ;  end loop if there was a match 
59          POP  CX                     ;  restore original length 
74 1D       JZ   DONE                   ;  had a dup? output is Bunny
                                        ; STEP 3 - use last char to get correct name
49          DEC  CX                     ;  ZF if two chars, NZ if three chars 
AC          LODSB                       ;  load last char into AL 
74 02       JZ   FIND_NAME              ;  is three chars? 
04 03       ADD  AL, 3                  ;  if so, offset array index by 3
        FIND_NAME: 
2C 30       SUB  AL, '0'                ;  ASCII convert input 
8A D0       MOV  DL, AL                 ;  set number of delimiters to find
B0 24       MOV  AL, '$'                ;  set delimiter char to find ('$')
B1 16       MOV  CL, 22                 ;  length of name array
BF 014C     MOV  DI, OFFSET NAM-1       ;  pointer to name array
        SCAN_LOOP: 
F2 AE       REPNZ SCASB                 ;  search until delimiter found 
FE CA       DEC  DL                     ;  decrement counter 
75 FA       JNZ  SCAN_LOOP              ;  loop until end of counter 
8B D7       MOV  DX, DI                 ;  move found pointer to DX 
CD 21       INT  21H                    ;  write name prefix to STDOUT
03 D1       ADD  DX, CX                 ;  advance to start of suffix string
        DONE:                           ; STEP 4 - display string at DX
CD 21       INT  21H                    ;  write output string to STDOUT
C3          RET                         ;  return to caller
                                        ; Strings and Things
    FAM     DB  'Fuma Shuriken$'        ;  if one char 
    BUN     DB  'Bunny$'                ;  if duplicate chars 
    NAM     DB  'Ka$','Rai$','Hyo$'     ;  name prefix array
            DB  'Hu$','Do$','Sui$'      ;   delimited by $
    TON     DB  'ton$'                  ;  name suffix
```
Callable function, input as string at `[SI]`, length in `CX` where `Ten` = `1`, `Chi` = `2` or `Jin` = `3`. Output to DOS STDOUT.
Test program output:
[![enter image description here](https://i.stack.imgur.com/LOUTm.png)](https://i.stack.imgur.com/LOUTm.png)
[Answer]
# [Haskell](https://haskell.org), ~~116~~ 109 bytes
*saved 7 bytes thanks to @ovs, and obscure things in the stdlib (why is `word` but not `split` in Prelude?)*
```
n[_]="Fuma Shuriken" -- matches a list of one element
n(a:b)|a`elem`b="Bunny" -- matches a list starting with a where a is in b `| `(cond)` =` is a guard that checks cond
n[a,b]=words"Ka Rai Hyo Ho Do Sui"!!b++"ton" -- !! is indexing, ++ is appending
n[a,b,c]=n[b+3,c+3] -- don't mistake n[] as indexing, it's calling n with a list.
-- b+3 so it will still catch duplicates where b=c
```
Highly readable (IMO), and highly not PHP (sorry PHP). This makes excessive use of pattern matching. It takes input as a list of Ten=0, Chi=1, Jin=2. Trailing whitespace and comments (starting with --) are not counted.
[ideone it!](https://ideone.com/Sck456)
[Answer]
# [05AB1E](https://github.com/Adriandmen/05AB1E), ~~54~~ ~~52~~ 51 bytes
-3 bytes thanks to [Kevin Cruijssen](https://codegolf.stackexchange.com/users/52210/kevin-cruijssen)!
Takes a string of first letters of the handsigns. A list of integers could probably save a byte.
```
√ô√äi'√•∆í√´.‚Ä¢!Àú≈í¬æ√ã‚ÇÇŒì‚àç≈∏¬æ¬µ√ì‚Ä¢#‚Ä¶ton¬´Œπ.‚Ä¢E‚Äπ√ò√Å√≥+¬±√Ü‚Ä¢¬∏≈°√ÅIg√®I3√∂√®}‚Ñ¢
```
[Try it online!](https://tio.run/##AWsAlP9vc2FiaWX//8OZw4ppJ8OlxpLDqy7igKIhy5zFksK@w4vigoLOk@KIjcW4wr7CtcOT4oCiIyfDj8K3wqvOuS7igKJF4oC5w5jDgcOzK8Kxw4bigKLCuMWhw4FJZ8OoSTPDtsOofeKEov//VA "05AB1E ‚Äì Try It Online") or [Try all possible cases!](https://tio.run/##S0oszvifnFiiYGOj4OrvpmCnkJyfkqqXmJT6//DMw12Z6oeXHpt0eLXeo4ZFiqfnHJ10aN/h7kdNTecmP@roPbrj0L5DWw9PBsopqx/uP7T90OpzO0EqXR817Dw843Dj4c3ahzYebgOKHNpxdOHhRs/0wys8jQ9vO7yi9lHLov9A@7i40vKLFDIVMvMUqkN0nHW8amE0di6U4krJ51JQSE3OyFfQzVNQUslU0LVTUAIK6ecXlOjnFycmZaZCKbh/gD60UVDJBGrNS/0PAA)
**Commented**:
```
√ô                    # deduplicate the input
 √ä                   # is this different from the input?
  i                  # if this is the case
   '√•∆í              '# push compressed string "bunny"
√´                    # else:
 .‚Ä¢!...√ì‚Ä¢            # push compressed string "rai do hyo sui ka hu"
         #           # split on spaces
          ‚Ä¶ton¬´      # append "ton" to each word
               Œπ     # rearrange the words into two lists
                     # [["raiton", "hyoton", "katon"], ["doton", "suiton", "huton"]]
.‚Ä¢E...√Ü‚Ä¢             # push compressed string "fuma shuriken"
        ¬∏            # wrap into a list 
         ≈°           # prepend to the other list 
          √Å          # rotate this list right
                     # [["doton", "suiton", "huton"], ["fuma shuriken"], ["raiton", "hyoton", "katon"]]
           Ig        # take the length of the input
             √®       # index into the list of lists
              I      # push the input again
               3√∂    # convert from base 3
                 √®   # modularly index into the list
}‚Ñ¢                   # after the if/else: titlecase each word
```
[Answer]
# [PHP](https://php.net/), 106 bytes
Inspired by [640KB's answer](https://codegolf.stackexchange.com/a/218815/100869). Expects input as `123`
```
fn($s)=>$s[1]?max(count_chars($s))>1?Bunny:[Ka,Hu,Rai,'Do',Hyo,Sui][$s[-1]*2-!$s[2]-1].ton:'Fuma Shuriken'
```
[Try it online!](https://tio.run/##XZFfT4MwFMXf9ym6hmRgyiLTp01cYnUuncmM8oZkabAT4mwbKMn88uJlG9c/D4TDveeeH7e1hW2v5rawg4G3jdut9r06iK@9Oo2y@Yfc@7lptNvkhazqrhVcR/ObRuvPabqSbNmwJ1my0a0ZseWnYc9NmaUwG0bZ2SQcgppkoMfO6Olo0XxI8lw0Vfmu9KidAbHUtnEkJmpvd@ZV@ZRR5snqTQezgVepGlre1q9dtamU3clc@SlNwMThETRjacQm7CJjp6D0PAtgUuWFIccSVMiYnAKUdD4llJHLECo7Bbv2piAAGw0JhZd/JMcx6WOjjMwJXa@GBAxTQhey3A3pYYTc7a3KnXqdHmZ/TUDzxd0bd2p0mWPyuHzc3K0fZm3C/hzHgP/7Fv@@k4Qdjh3Ej@KoRK94dyFw3KDQx9HHRXdFh7boLuyo0Cg4uz3V@kBIWcmuxJHLkcsTzEMGRy7/VcM4xHLALpujQh9iRY8ViBVJ/3cC1xW4ruB9nECsQOxPLi4rkCr67pexrjS6bsPFNw "PHP ‚Äì Try It Online")
### Explanation
```
fn($s)=> 
  $s[1]?                          // check if 2nd char of input is present
    max(count_chars($s))>1?       // count chars, check if any are present more than once
      'Bunny'                     // input has duplicates
    :                             // input does not have duplicates
      [Ka,Hu,Rai,'Do',Hyo,Sui]    // array of possible results
      [$s[-1]*2-!$s[2]-1]         // find correct index of result
                                  // takes last char of input, multiplied by 2,
                                  // minus boolean value based on input length
                                  // finally adjust index by -1
      .'ton'                      // and add suffix
  :
  'Fuma Shuriken'                 // input length was 1
```
[Answer]
# [PHP](https://php.net/), ~~139~~ ~~133~~ 128 bytes
```
fn($s)=>($l=strlen($s))>1?max(count_chars($s))>1?Bunny:[T=>[Ka,Hu],C=>[Rai,'Do'],J=>[Hyo,Sui]][$s[-1]][$l%2].ton:'Fuma Shuriken'
```
[Try it online!](https://tio.run/##NchBa8IwGMbx@/spcshoC1HQo64V9qqUbDCZuZUgobSmWJPQNDC//LI42On5PX@nXXzdOe0AaF/G3uTUF2WV07H08zR2f7@oVru7@s5bG8x8abWa/H9@C8Y8No0oq@ZdsTpIholfamDZ3maS8fTqh2XnMEjZUN8sVs8dX9ZyOVuzyY7hrshZh2m4dSaLW4Cu1ZbQPidUTVdDCkZO9ely@PzYRgQOAlCAQBAckCfxRExOlT@dukidI6aGP9bNgzU@Lo6/ "PHP ‚Äì Try It Online")
### Explanation
```
fn( $s ) => 
    ( $l = strlen( $s ) ) > 1 ?             // is input longer than one char?
        max( count_chars( $s ) ) > 1 ?      // has more than 1 of any single char?
            'Bunny'                         // if so, contains dupes so... Bunny it is
        :                                   // else, no dupes
            [
                'T' => [ 'Ka',  'Hu'  ],    // two dimensional associative
                'C' => [ 'Rai', 'Do'  ],    //   array containing handsign 
                'J' => [ 'Hyo,  'Sui' ]     //   and length as indexes
            ]
            [ $s[-1] ]                      // access array by last letter and
            [ $l % 2 ]                      //   length mod 2 (2 == 0, 3 == 1)
            . 'ton'                         //   and append "ton"
    :                                       // finally...
    'Fuma Shuriken'                         // input length was only one char
```
And combining some ideas from [Cray's golfier answer](https://codegolf.stackexchange.com/a/218828/84624), and taking input as `1, 2, 3`, gets it down to **111** bytes (Cray's is still shorter though):
### [PHP](https://php.net/), 111 bytes
```
fn($s)=>$s[1]?max(count_chars($s))>1?Bunny:[0,[Hu,Ka],['Do',Rai],[Sui,Hyo]][$s[-1]][!$s[2]].ton:'Fuma Shuriken'
```
[Try it online!](https://tio.run/##FcxRa8MgEMDxdz@FC0ISsGPp3tq1gbqV4AYrq28iQUJSw1YVjbB@@bnrw3E//gfnjc8vrTceITLt8mQrEuvdnkTZqPaqf6vBJbv0g9Eh3k/1vmkPydrbRj5R2SX6rhWV5asr6Zeegec00@7mlJLwY9XAfgCslXpcnN2Ux3TV@GxSmL9HW@YtQuNgHCZTheMS@jD6Hz2MlSxEQQsGwwt42tA1fVaU6HCxuMY1xafu1L99fmwzQxwJxAQSDAmOGAdxIAND5XdDF9A5Y9DYn/PL7GzMq@M/ "PHP ‚Äì Try It Online")
[Answer]
# [J](http://jsoftware.com/), 84 79 bytes
```
('Bunny';'Fuma Shuriken';,&'ton'&.>Ka`Rai`Hy`Hu`Do`Sui){~({:+1 1 4{~#)@}.*]-:~.
```
[Try it online!](https://tio.run/##hZBNT4NAEIbv/Io3mnSKwsaqJyqGlKZBajy03EwTSN2WtXExZTeGEPnrCNEiJCYe5vLMzDMfr/UZox1cBwQLV3CasBn81eOiHtNMS1nQlBb6LcE61Udx4JKm1ohUJmnE7pdJvEpEHBRxoON5Fq@1MMtqXDqXE0xwW1bnpvfJLja2U7HaNJ5mDA/yXSuo5MBzCKn4nh9zfAiVgstt9iLk3mlar3EDFxF8hIaheK5cduc9w273jPyQsPMEw8Yw@DbN8LMo2kJQFNFf2A/DEx/e8523HPL/yXf9y6S9/@TtxjWv6PGo0wVFH3eWQPdw@KuZZ4PyTtM8d6APqf4C "J ‚Äì Try It Online")
Takes 1, 2, 3 as inputs, mapping to T, C, J, respectively.
* `('Bunny';'Fuma Shuriken';,&'ton'&.>Ka`Rai`Hy`Hu`Do`Sui)` creates the word list and was the least satisfactory part of the golf, despite some effort. It produces:
```
‚îå‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¨‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¨‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¨‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¨‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¨‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¨‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¨‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îê
‚îÇBunny‚îÇFuma Shuriken‚îÇKaton‚îÇRaiton‚îÇHyton‚îÇHuton‚îÇDoton‚îÇSuiton‚îÇ
‚îî‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¥‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¥‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¥‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¥‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¥‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¥‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚î¥‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îÄ‚îò
```
* `{~` From that, select the following index:
* `(...)@}.` First remove the first element and...
* `{:+1 1 4{~#` Take the last element `{:` of what remains (crucially, this will be 0 for the empty list, i.e., one element inputs) and add to it 1, 1, or 4, depending on if the length is 0, 1, or 2.
* `*]-:~.` Multiply that result by 1 if the unique of the input `~.` matches the input `]-:`, and 0 otherwise. This ensures inputs with duplicates always have 0 index and return bunny.
[Answer]
# [Charcoal](https://github.com/somebody1234/Charcoal), 65 bytes
```
¬ø‚äôŒ∏‚äñ‚ÑñŒ∏ŒπBunny¬ø‚äñÔº¨Œ∏‚Å∫¬ß‚™™¬ß‚™™‚Äù‚Ü∂/‚äü‚â°‚ß¥‚ÑñK5Ôºß‚Å∞‚Å∫jÔº≠‚úÇ‚éöŒ£‚ÄùœáÔº¨Œ∏ ‚ÑÖ¬ßŒ∏¬±¬πton¬¶Fuma Shuriken
```
[Try it online!](https://tio.run/##XY7NCsIwEIRfZckphQr23FO1SP1Bi/UFQrvaYLqxaSL26WMK/uEeFmZ2Z/jqVphaC@W9PAPPaOR9DDnWBjskiw1fakd2MmUUBkojg2QLRzSyKAVUA8IU/c3skC625f03UCo38MyuqcEHr25K2j/FtgKOQkIx6sJBrqFyksWQzKMYvnUxMGBhH0wjSahPR8Db40VY5MlEGd6sJha9@V7QK9cJqFpn5BXDNfX@tNz42V09AQ "Charcoal ‚Äì Try It Online") Link is to verbose version of code. Takes input as a string of initials. Explanation:
```
¬ø‚äôŒ∏‚äñ‚ÑñŒ∏ŒπBunny
```
If any of the characters appear more than once then print "Bunny".
```
¬ø‚äñÔº¨Œ∏‚Å∫¬ß‚™™¬ß‚™™‚Äù‚Ü∂/‚äü‚â°‚ß¥‚ÑñK5Ôºß‚Å∞‚Å∫jÔº≠‚úÇ‚éöŒ£‚ÄùœáÔº¨Œ∏ ‚ÑÖ¬ßŒ∏¬±¬πton
```
If the length is more than one then look up the appropriate prefix from either "Ka Rai Hyo" or "Hu Do Sui" (depending on the length) split on spaces and indexed by the ordinal of the last character, concatenated with "ton".
```
¬¶Fuma Shuriken
```
But if the length is 1 then just print "Fuma Shuriken".
[Answer]
# [Lua (LuaJIT)](https://luajit.org/), ~~170~~ 167 bytes
```
r={'Rai','Hyo','Sui','Ka','Hu','Do'}t={'Fuma Shuriken',CT=4,JT=4,JC=1,TC=1,CJ=2,TJ=2,CJT=5,JCT=5,JTC=6,TJC=6,CTJ=3,TCJ=3}print(t[#i]or t[i]and r[t[i]]..'ton'or'Bunny')
```
[Try it online!](https://tio.run/##Hcw9C8IwEIDh3V9RcLgW0kD9qFMWIyJ1s91Kh6AtntZEQjIU6W@Ply4Px73HjV7lo1cvdGEQg9d3h0anmAUrfnBTCAwukyFrH@erigtPnAzMjm7O/qOS@uktvnsNTDZix6oFKQrWRGQlNqyJSCp7KovUSlpHJdUtHZPz16J2qWvX2BmbuBY7pR@JbePUcQ7OaDAWjl7rCbLQU8zzojyshpRznoVAb/4 "Lua (LuaJIT) ‚Äì Try It Online")
[Answer]
# Perl 5, 120 bytes
```
/(.).?\1/ and$_="Bunny";s/^.$/Fuma Shuriken/;s/..J/Suiton/;s/..C/Doton/;s/..T/Huton/;s/.J/Hyoton/;s/.C/Raiton/;s/.T/Katon/
```
It's everybody's favorite thing: a bunch of regular expressions sitting in a row. Run with `perl -lapE '<the above code>'`
First, we deal with the bunny case, by checking if any character appears twice and simply replace the string with "Bunny" in that case. Next, we check if there's exactly one character and replace with "Fuma Shuriken". Beyond that, we simply brute force the remaining options with regular expressions. Finally, if the resulting string does not end in n or y (i.e. it's not "Bunny" or "Fuma Shuriken"), then we add "ton" to the end.
[Answer]
# [PowerShell](https://github.com/TryItOnline/TioSetup/wiki/Powershell), ~~214~~ ~~208~~ ~~207~~ ~~205~~ ~~203~~ ~~201~~ ~~188~~ ~~186~~ ~~180~~ 177 bytes
```
$s=$args[0];if($s[1]){if($s|% t*y|group|% c*|?{$_-ne1}){'Bunny'}else{@{'T'=('Ka','Hu');'C'=('Rai','Do');'J'=('Hyo','Sui')}["$($s[-1])"][$s.length%2]+'ton'}}else{'Fuma Shuriken'}
```
[Try it online!](https://tio.run/##Jc1BC4IwHAXwryIy@atlZFeRIiOkbulNJEYsldYmzhEy99nXrNt7v8N7Pf@QQbSEUmOQSBEeGlFt66R7@khUcR2oX5o9ZwynuRm47G1@hPNeoXvESKwDBUfJ2ASaUEHUQUEJqQ9XDGvIJQQJZEu/4c7CiS9wWSCfuIVCdhDoykXLXWT/3LpCYkMJa8bW29UrGDkD/d@Gs3xjp2jl0L2IVWNMVn4B "PowerShell ‚Äì Try It Online")
Thanks @640KB for the forkable PHP answer.
Cheers folks, help me to reduce the size!
(Please manually pass the argument, for test I have passed "CT", it worked and others worked too ;-)
Last -3 bytes thanks to @mazzy
]