Năm nay bạn có đẹp không


31

Giới thiệu

Santa có quá nhiều tên để xử lý, và cần sự giúp đỡ của bạn! Anh ta cần bạn để viết một chương trình hoặc một chức năng, trong đó kết quả đầu ra nice, naughty, very naughtyhoặc very very naughty. Để xác định ai đó tốt bụng hay nghịch ngợm, Santa đã phát triển một thuật toán:

Nice ( , ):

Trước hết, chúng tôi có được một số từ tên bằng cách thêm tất cả các chữ cái lên ( khoảng trắng bị bỏ qua ). Ví dụ:

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

Nếu số lượng ước tính bằng độ dài của tên, người đó được xem xét nice. Điều này có nghĩa là chương trình của bạn sẽ xuất ra [name] has been nice. Ở đây, các ước của 94là:

Divisors of 94: 1, 2, 47, 94

4ước số, nhưng tên có độ dài 8( bao gồm khoảng trắng ). Kết luận, Doorknobđã không được tốt đẹp. Vì vậy, chúng tôi tiếp tục cuộc hành trình của chúng tôi:


Nghịch ngợm ( , ):

Santa đã phát triển một chuỗi mới, số Giáng sinh . Đầu tiên, chúng ta sẽ xem xét các cây Giáng sinh sau:

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

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

  5            18             47             98

Số lượng dấu hoa thị xác định số Giáng sinh. Trình tự diễn ra như sau : 5, 18, 47, 98, 177, ....

Từ đây, chúng ta có thể kết luận rằng đó 94không phải là một số Giáng sinh. Điều đó có nghĩa là Doorknobkhông chỉ nghịch ngợm.


Rất nghịch ngợm ( ):

Đối với điều này, chúng ta cần tìm hiểu nếu Doorknoblà một chuỗi thang nâng . Đây được xác định bởi các ký tự trong tên với A = 1, B = 2, C = 3, v.v .:

Đầu tiên chúng ta sẽ xem xét chữ cái đầu tiên , D. Điều này có giá trị 4. Đây là điểm khởi đầu của chúng tôi. Bức thư tiếp theo là o. Giá trị 15này cao hơn giá trị trước đó của chúng tôi, vì vậy chúng tôi sẽ tiến lên một bước cao hơn trên thang. Giá trị tiếp theo cũng là một o. Điều này là giống nhau, vì vậy chúng tôi không làm gì cả. Nếu giá trị tiếp theo cao hơn giá trị hiện tại, chúng tôi sẽ tiến lên một bước cao hơn. Nếu giá trị tiếp theo thấp hơn giá trị hiện tại, chúng tôi sẽ hạ giá trị thấp hơn. Nếu nó giống nhau, chúng ta sẽ ở cùng một bước. Điều này được hình dung cho 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

Bạn có thể thấy rằng Doorknobkết thúc cao hơn vị trí bắt đầu. Vì vậy Doorknob has been very naughty. Martin ButtnerAlex Akhông được cao hơn điểm xuất phát. Vì vậy, họ là cả hai very very naughty.

Các trường hợp thử nghiệm

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

Quy tắc

  • Bạn cần cung cấp một chương trình hoặc một chức năng nhận đầu vào (bao gồm ít nhất một chữ cái).
  • Đầu vào sẽ bao gồm chữ hoa , chữ thườngdấu cách . Không gian được bỏ qua trong quá trình, ngoại trừ chiều dài của đầu vào.
  • Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!

15
Btw, cách thích hợp để viết Büttner mà không có âm sắc là Buettner, không phải là Buttner.
Dennis

3
Các số Giáng sinh được tạo ra bởi n^3 + 2n^2 + 2, btw.
Lynn

2
Được rồi Sau đó, "điểm" tối đa cho một tên là ZZZ...Z = 26 * 99 = 2574, có nghĩa là bạn chỉ cần kiểm tra số Giáng sinh tối đa và bao gồm n=13. (Thông tin hữu ích cho những người chơi golf khác.)
Lynn

23
Santa has been very very naughty. Đợi đã, cái gì?
tay nắm cửa

5
@Doorknob - Bạn không có tên đầy đủ của anh ấy : Santa Claus has been very naughty. Cũng nên thử Saint Nick, Saint Nicholas, St. Nick, St. Nicholas, Kris Kringle, Father Christmas, Pere Noel, và tất cả các bí danh khác của anh ấy - có lẽ một trong số họ sẽ hoạt động? Mặc dù tại sao một anh chàng "tốt bụng" lại cần nhiều bí danh như vậy nhưng lại rất đáng nghi ngờ ...
Darrel Hoffman

Câu trả lời:


5

86 byte

Rõ ràng tôi đã rất tốt trong năm nay ...

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

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

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 byte

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

Hãy thử trực tuyến.

Giải trình

Một lời giải thích đầy đủ sẽ phải đợi đến sau này, nhưng đây là đoạn mã được chia thành các phần khác nhau:

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 Tôi đã đánh cắp điều đó từ nhận xét của Doorknob.
Martin Ender

Tôi cũng 1 bình luận của anh ấy.
Rɪᴋᴇʀ

"Santa đã rất rất nghịch ngợm"
ASCIIThenANSI

4

MATL , 117 byte

Chương trình MATL dài nhất của tôi cho đến nay :-) :-(

Sử dụng bản phát hành hiện tại của ngôn ngữ, sớm hơn thử thách này.

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

Ví dụ

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

Giải trình

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

Lua, 371 284 byte

Tôi chắc chắn có chỗ để cải thiện, tôi muốn cắt bỏ một số nếu có.

Chỉnh sửa: 4 tháng sau, tôi đã học được rất nhiều về lua và muốn quay lại bài nộp này, tôi đã làm tốt: cắt ra 87 byte!

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

Ung dung

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"

Giải pháp cũ 371 byte

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

Phiên bản 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

Nghiêm túc, 138 byte

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

Bãi rác Hex:

2220686173206265656e20222c3b2720402d96bb2bbcbd604f38a6402d604de43b32bf7760695875604de3bd6c3d60226e69636522be2b2e82a260ce823033bf32c033d13178603b33405e29a6e7326be4604da1755933c02b33bfbd4f6b3029702960703b2840292d7340292b2860ce6c3e5928587533c02a226e6175676874792240227665727920222a2bbe2b

Dùng thử trực tuyến

Thật khó để đánh golf một cách hiệu quả vì lý do kiểm soát dòng chảy phức tạp khó khăn như thế nào. Khả năng lồng các chức năng mà không cần sử dụng các thanh ghi sẽ giúp ích. (Tôi tưởng tượng điều này có thể đã được rút ngắn phần nào thông qua việc sử dụng hợp lý các chức năng được lưu trữ, nhưng nó sẽ dẫn đến mã spaghetti như vậy tôi không có tâm huyết để thử nó.)

Giải trình:

" 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

Python 2, 249 byte

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)]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.