올해는 좋았습니까?


31

소개

산타가 처리하기에는 이름이 너무 많아서 도움이 필요합니다! 그는 당신이 프로그램이나 출력하는 기능, 기록해야 할 nice, naughty, very naughty또는 very very naughty. 누군가가 얼마나 좋고 나쁜지 결정하기 위해 산타는 알고리즘을 개발했습니다.

니스 ( , ) :

우선, 모든 문자를 추가하여 이름에서 숫자를 얻습니다 ( 공백은 무시 됨 ). 예를 들면 다음과 같습니다.

Doorknob =

D = 4
o = 15
o = 15
r = 18
k = 11
n = 14
o = 15
b = 2

4 + 15 + 15 + 18 + 11 + 14 + 15 + 2 = 94

제수의 수가 이름의 길이와 같으면 그 사람이 고려됩니다 nice. 이것은 프로그램이 출력해야한다는 것을 의미합니다 [name] has been nice. 여기에 제수는 다음과 같습니다 94.

Divisors of 94: 1, 2, 47, 94

있다 4약수,하지만 이름이 길이 8( 공백 포함 ). 결론 Doorknob은 좋지 않았습니다. 그래서 우리는 여행을 계속합니다 :


못된 ( , ) :

산타는 새로운 시퀀스 인 크리스마스 번호를 개발했다 . 먼저 다음과 같은 크리스마스 트리를 살펴 보겠습니다.

n = 1        n = 2          n = 3          n = 4

                                             *
                                            ***
                                           *****
                                          *******
                                         *********
                          _   *             ***
                         |   ***           *****
                         |  *****         *******
               *         | *******       *********
  *           ***        |   ***            ***
 ***         *****   n*n |  *****          *****
  *           ***        | *******        *******
             *****       |   ***         *********
               *         |  *****           ***
                         |_*******         *****
                              *           *******
                           |_____|       *********
                             2n+1            *

  5            18             47             98

별표의 양은 크리스마스 수를 결정합니다. 순서는 다음과 같습니다 5, 18, 47, 98, 177, .....

여기에서 우리는 그것이 94크리스마스 번호가 아니라는 결론을 내릴 수 있습니다. 그것은 Doorknob단지 장난 꾸러기 만이 아니라는 것을 의미합니다 .


매우 장난 꾸러기 ( ) :

이를 위해 우리 Doorknob높이기 사다리 줄 인지 알아야 합니다 . 이것은와 이름으로 문자에 의해 결정된다 A = 1, B = 2, C = 3, 등 :

먼저 첫 글자 인을 살펴 보겠습니다 D. 이것은 가치가 4있습니다. 이것이 우리의 출발점입니다. 다음 글자는 o입니다. 여기에는 15이전 값보다 높은 값이 있으므로 사다리에서 한 단계 더 올라갑니다. 다음 값은 o입니다. 이것은 동일하므로 우리는 아무것도하지 않습니다. 다음 값이 현재 값보다 높으면 한 단계 더 올라갑니다. 다음 값이 현재 값보다 낮 으면 스터가 낮아집니다. 동일하면 동일한 단계를 계속 수행합니다. 이에 대한 시각 Doorknob, Martin ButtnerAlex A:

            O
           / \
      R   N   B
     / \ /
  O-O   K                 T   N   U                 L   X
 /                       / \ / \ / \               / \ / \
D                   M   R   I   B   T-T           A   E   A
                     \ /               \
                      A                 N   R
                                         \ /
                                          E

당신은 Doorknob시작 위치보다 높은 끝을 볼 수 있습니다 . 그래서 Doorknob has been very naughty. Martin Buttner그리고 Alex A시작점 이상하지 않았다. 그래서 그들은 둘 다 very very naughty입니다.

테스트 사례

Input: Doorknob
Output: Doorknob has been very naughty

Input: Martin Buttner
Output: Martin Buttner has been very very naughty

Input: Jakube
Output: Jakube has been nice

Input: B
Output: B has been very very naughty

규칙

  • 적어도 하나의 문자로 구성된 입력을받는 프로그램이나 기능을 제공해야합니다.
  • 입력은 대문자 , 소문자공백으로 구성 됩니다. 입력 길이를 제외하고는 프로세스 중에 공백이 무시됩니다.
  • 이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!

15
Btw, 움라우트없이 Büttner를 작성하는 올바른 방법은 Buttner가 아닌 Buettner입니다.
Dennis

3
크리스마스 숫자는 n^3 + 2n^2 + 2btw 로 생성됩니다 .
Lynn

2
알았어 그런 다음 이름의 최대 "점수"는입니다 ZZZ...Z = 26 * 99 = 2574. 즉,를 포함하여 크리스마스 번호 만 확인하면됩니다 n=13. (다른 골퍼들에게 유용한 정보)
Lynn

23
Santa has been very very naughty. 무엇을 기다립니다?
Doorknob

5
@Doorknob 冰-당신은 그의 이름을 얻지 못했습니다 : Santa Claus has been very naughty. 세인트 닉, 세인트 니콜라스, 세인트 닉, 세인트 니콜라스, 크리스 크 링글, 아버지 성탄절, 페레 노엘 및 그의 다른 별명도 시도해보십시오. 는 "좋은"사람이 많은 별칭을 설정해야하는 이유 이미 꽤 의심하지만 ...
대럴 호프만

답변:


5

Pyth 86 바이트

분명히 나는 ​​올해 잘 지냈어 ...

jd[z"has been"?qlzl{yPJsKxL+NG@Grz0"nice"+*"very "&!}Jm+*+2d*dd2SJhgs._M-VKtK0"naughty

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명:

jd[z"has been"...      list with input string, "has been" and ...; join with spaces
qlzl{yPJsKxL+NG@Grz0   compares the length of input with the number of divisors
                       (computes all prime factors and counts the elements in the powerset)
?..."nice"             if True, use "nice" as last list element
                       else:
}Jm+*+2d*dd2SJ            check for christmas number
                          (checks, if its of the form n^3+2*n^2+2)
gs._M-VKtK0               check if raising ladder string ends lower or equal
                          (assigns each neighbor pair a number -1,0,1 and computes the sum)
&!...h...                 returns 0, 1 or 2
*"very "                  repeat "very " this times
+..."naughty              add "naughty" and use this as the third list element

10

CJam, 109 (108) 107 바이트

l" has been "1$[_,\S-:eu'@f-:A:+__,:)f%0e=@=\_{)__2+**))}%&A2ew::-:g1b0<]{}#4,="very "*_5>\"naughty""nice"?

온라인으로 사용해보십시오.

설명

자세한 설명은 나중에 기다려야하지만 다음 코드는 다른 섹션으로 나뉩니다.

l" has been "1$[                    e# Some preparation...
  _,\S-:eu'@f-:A:+                  e# Determine letter sum.
  __,:)f%0e=@=                      e# Check divisor count.
  \_{)__2+**))}%&                   e# Check for Christmas number.
  A2ew::-:g1b0<                     e# Check ladder.
]{}#4,="very "*_5>\"naughty""nice"? e# Determine nice/naughtiness.

@RikerW 나는 Doorknob의 의견에서 그것을 훔쳤다.
Martin Ender

나는 그의 의견도 +1했다.
Rɪᴋᴇʀ

"산타는 매우 장난이
심했다

4

MATL , 117 바이트

지금까지 가장 긴 MATL 프로그램 :-) :-(

이 문제보다 빠른 언어의 현재 릴리스 를 사용합니다 .

jttk96-t0>)tstt:\~s4$bn=?xx'nice'}[1,2,0,2]99:ZQ=a?'naughty'}dt0>sw0<s-O>~'very naughty'w?'very 'wh]]]' has been 'whh

>> matl
 > jttk96-t0>)tstt:\~s4$bn=?xx'nice'}[1,2,0,2]99:ZQ=a?'naughty'}dt0>sw0<s-O>~'very naughty'w?'very 'wh]]]' has been 'whh
 > 
> Doorknob
Doorknob has been very naughty

>> matl
 > jttk96-t0>)tstt:\~s4$bn=?xx'nice'}[1,2,0,2]99:ZQ=a?'naughty'}dt0>sw0<s-O>~'very naughty'w?'very 'wh]]]' has been 'whh
 > 
> Jakube
Jakube has been nice

설명

jt                        % input string. Duplicate
tk96-t0>)                 % duplicate. Convert to lower, then to numbers, remove spaces
ts                        % duplicate. Sum
tt:                       % duplicate. Vector from 1 to obtained sum
\~s                       % modulus operation. Count zeros to determine number of divisors
4$bn=                     % does it equal original name length?
?                         % if so
    xx'nice'              % remove values not needed, and push string
}                         % else
    [1,2,0,2]99:ZQ        % all Christmas numbers
    =a                    % does sum equal any Christmas number?
    ?                     % if so
        'naughty'         % push string
    }                     % else
        dt0>s             % total number of increases
        w0<s              % total number of decreases
        -O>~              % subtract both. Is total <=0?
        'very naughty'w   % push string, which will be needed in either case. Swap
        ?                 % if total was <=0
            'very 'wh     % prepend string
        ]                 % end if
    ]                     % end if
]                         % end if
' has been 'whh           % build complete string from pushed parts

2

루아, 371 284 바이트

개선의 여지가 있다고 확신합니다. 만약 일부를 잘라 내고 싶습니다.

편집 : 4 개월 후, 나는 루아에 대해 많이 배웠고이 제출물로 돌아 가기를 원했습니다. 87 바이트를 잘라 냈습니다!

a=... .." has been "s=(...):lower()b="very "x=0y=s:byte(1)-96z=0r="naughty"for i=2,#s
do c=s:byte(i)y=c+y-96z=z+c<s:byte(i-1)and-1or 1 end
for i=1,y do x=y%i<1 and x+1or x end
for i=1,13 do d=y==i^3+2*i^2+2 and 0or d end
print(a..(x==#s and"nice"or(d and""or b..(z>0 and""or b))..r))

언 골프

a=... .." has been "           -- Start of the sentence
s=(...):lower()                -- convert the input to lower case
b="very "                      
x=0                            -- y's divisor count
y=s:byte(1)-96                 -- will contain the sum of the char's position in the alphabet
z=0                            -- will contain the raising ladder state
r="naughty"                    

for i=2,#s                     -- iterate over each character in s
do
  c=s:byte(i)                  -- shorthand for the byte value of the current char
  y=c+y-96                     -- increment the sum of letter's positions
  z=z+c<s:byte(i-1)            -- if the previous char is greater than the current
        and-1                  -- the ladder goes down
      or 1                     -- else, it goes up
end

for i=1,y                      -- iterate on the range 1..y
do
  x=y%i<1                      -- if i is a divisor of y
      and x+1                  -- increment x
    or x
end

for i=1,13                     -- iterate on the range 1..13
do                             -- no need to go further for the christmas numbers
  d=y==i^3+2*i^2+2             -- if y is a christmas number
      and 0                    -- set d
    or d                       -- else let d as it is
end
print(a..                      -- output "Name has been"
      (x==#s                   -- if y's divisor==length of input
        and"nice"              -- append "nice"
      or(d                     -- else, if d is not set
          and""                
        or b..                 -- append "very"
          (z>0                 -- and if the raising ladder doesn't raise
             and""
          or b))..             -- append a second "very"
        r))                    -- append "naughty"

이전 371 바이트 솔루션

function f(s)a,b,c,d,e,r,g,s=s.." has been ","very ",0,0,0,"naughty",math.pow,s:lower()for i=1,#s 
do if 32<s:byte(i)then e,d=i>1 and(s:byte(i)<s:byte(i-1)and e-1 or e+1)or e,d-96+s:byte(i)end end
for i=1,d do c=d%i>0 and c or c+1 end if c==#s then return a.."nice"end 
for i=1,13 do if g(i,3)+2*g(i,2)+2==d then return a..r end end
return e>0 and a..b..r or a..b..b..r end

Ungolfed 버전 :)

function f(s)
  a,b,c,d,e,r,g,s=s.." has been ","very ",0,0,0,"naughty",math.pow,s:lower()
  for i=1,#s
  do
    if 32<s:byte(i)
    then
      --sum of the char's order in the alphabet
      d=d-96+s:byte(i)
      --raising ladder
      e=i>1 and(s:byte(i)<s:byte(i-1)and e-1 or e+1)or e
    end
  end
  for i=1,d
  do
    -- number of d's divisors
    c=d%i>0 and c or c+1
  end
  if c==#s then return a.."nice" end
  for i=1,13
  do
    --Christmas number are equals n^3+2n^2+2 as @Mauris said 
    if g(i,3)+2*g(i,2)+2==d then return a..r end
  end
  --is he very naughty or very very naughty?
  return e>0 and a..b..r or a..b..b..r 
end

1

정말 138 바이트

" has been ",;' @-û╗+╝╜`O8ª@-`MΣ;2┐w`iXu`Mπ╜l=`"nice"╛+.éó`╬é03┐2└3╤1x`;;⌐**⌐`MíuY3└+3┐╜Ok0)p)`p;(@)-s@)+(`╬l>Y(Xu3└*"naughty"@"very "*+╛+

육각 덤프 :

2220686173206265656e20222c3b2720402d96bb2bbcbd604f38a6402d604de43b32bf7760695875604de3bd6c3d60226e69636522be2b2e82a260ce823033bf32c033d13178603b33405e29a6e7326be4604da1755933c02b33bfbd4f6b3029702960703b2840292d7340292b2860ce6c3e5928587533c02a226e6175676874792240227665727920222a2bbe2b

온라인으로 사용해보십시오

복잡한 흐름 제어가 얼마나 어려운지 때문에 이것을 효과적으로 골프화하기는 어렵습니다. 레지스터를 사용하지 않고 함수를 중첩하는 기능이 도움이됩니다. (저장된 기능을 신중하게 사용하여 이미 다소 단축 될 수 있다고 생각하지만 그러한 스파게티 코드로 인해 시도해 볼 마음이 없습니다.)

설명:

" has been "                                  push this string
,                                             read input
;' @-û╗                                       copy, remove space, uppercase, put in reg0
+╝                                            put '<input> has been ' in reg1
╜                                             bring back the processed input
`O8ª@-`MΣ                                     convert letters to numbers and sum
;2┐                                           store a copy of the sum in reg2
w`iXu`Mπ                                      compute the number of divisors
╜l                                            get processed input length
=                                             check if they're equal
`"nice"╛+.éó`╬                                if so, run this function that retrieves the 
                                              list we made earlier, appends "nice",
                                              prints it, empties the stack
                                              and immediately exits
é                                             empty the stack (it contains a 1)
03┐                                           put a 0 in reg3
2└                                            call back the letter sum from reg2
3╤1x                                          push [1,...1000]
`;;⌐**⌐`M                                     plug each number into x^3+2x^2+2
í                                             check if the letter sum is there
uY                                            make a 1 if it is not, 0 if it is
3└+3┐                                         add this number to reg3
╜Ok                                           convert the processed input into char codes
0)                                            put a zero behind it
p)                                            pop the first char code to bottom of stack
`p;(@)-s@)+(`╬                                Until the list of char codes is empty,
                                              subtract each one from the previous one,
                                              accumulating the signums
l                                             turn the leftover empty list into a 0
>Y                                            put a 1 if the accumulated signs are
                                              >=0 (not rising), else 0 (rising)
(X                                            clean up the last char code
u                                             increment to make 0 into 1 and 1 into 2
3└*                                           bring back the value from reg3
                                              which is 0 if *only* naughty, else 1
                                              and multiply it with preceding test result;
                                              this turns a very into a very very if this
                                              test failed, but leaves plain and single
                                              very naughty alone
"naughty"@                                    put "naughty" below the 'very' count

"very "*                                      put "", "very ", or "very very "
+                                             append the "naughty"
╛+                                            bring back the string in reg1 and append
                                              the constructed suffix

1

파이썬 2, 249 바이트

i=input()
g=[ord(c)-96for c in i.lower()if' '!=c]
s=sum(g)
S=0
a=g.pop()
while g:b=a;a=g.pop();S+=(a<b)-(b<a)
r=range(1,14+s)
print i+' has been '+[['very '*(1+(S<1)),''][s in[x**3+2*x**2+2for x in r]]+'naughty','nice'][sum(s%x<1for x in r)==len(i)]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.