10,000 명의 명성을 얻은 것을 축하합니다!


19

@ MartinBüttner가 정확히 10,000 점의 명성을 얻은 후 , 이제 사용자 페이지 에 10k 사용자로 구성된 3 개의 전체 행이 있습니다 ! 이제 우리는 모두 프로그래머이므로 수동으로 작업하는 대신 자동화하는 것을 좋아합니다. 새로운 10k 사용자를 자동으로 축하하는 프로그램을 작성해야합니다.

사양

입력

입력은 n공백으로 구분 된 숫자 라인입니다. 원하는 경우 공백으로 구분 된 숫자를 쉼표로 구분 한 단일 목록으로 만들 수도 있습니다 (예 : 코드가 더 짧아 질 경우).

10 20 30 40 50
15 25 35 45 55
20 30 40 50 60

또는:

10 20 30 40 50,15 25 35 45 55,20 30 40 50 60

각 숫자 목록은 하루에 사용자의 평판 값 목록을 나타냅니다.

산출

출력은 같은 양의 n줄 (또는 같은 길이의 쉼표로 구분 된 목록)이됩니다. 각 광고 항목 / 목록 항목은 다음과 같습니다.

  • :D 평판이 10,000보다 큰 사용자가있는 경우
    • :D10,000 명의 담당자 수를 충족하거나 통과 한 여러 사용자가있는 경우 여러 개의 공백으로 구분 됩니다. 예를 들어, :D :D :D3 명의 신규 10k 사용자의 경우.
  • :( 입력이 모호하거나 불가능한 경우 추가 출력을 중지합니다 (다음 섹션에서 자세히 설명).
  • 이러한 조건 중 어느 것도 해당되지 않으면 아무 것도 아닙니다.

모호

입력이 모호 할 수 있습니다. 이 도전의 목적을 위해 다음과 같이 가정합니다.

  • 평판 상한은 하루에 200이며, 도전을 위해 수락 및 바운티 등을 무시합니다.
  • 사용자는 명성을 잃지 않을 수 있습니다 (단순성과 도전으로 인해).

어떤 평판 값이 어떤 사용자에 해당하는지 판별 할 수없는 경우 입력이 모호한 것으로 간주됩니다. 예를 들어 입력 10 20,30 40에서 10 인 사용자가 30 인 사용자인지 40 인 사용자인지 알 수 없습니다.

하루의 사용자가 다음 날의 사용자가 될 수없는 경우 입력이 불가능한 것으로 간주됩니다. 예를 들어, 입력 10 20,310 320에서 사용자가 하루에 300 개의 명성을 얻지 못했기 때문에이 상황은 명확하게 불가능합니다. 평판을 잃는 사용자도 불가능합니다.

가장자리 케이스

  • 초기 평판 값은 무엇이든 시작할 수 있습니다 (예 : 사용자는 1337 평판으로 시작할 수 있음).
  • 첫 번째 라인 /리스트 항목에 대한 출력이 없습니다.
  • 입력은 항상 구문 적으로 유효합니다. 즉, 평판 값은 항상 양의 정수이며 라인 / 목록 항목 당 항상 같은 양의 평판 값이 있습니다.
  • 평판 값은 정렬되지 않습니다. 그들은 어떤 순서로든있을 수 있습니다.

테스트 사례

입력 : 9900,10000
출력 ::D

입력 : 9900 9950 9910,10100 9950 9910,10300 10150 10110
출력 ::D,:D :D

입력 : 10 20 30,42 10 20,10 242 20,442 42 10,0 0 0,442 42 10
출력 :,,,:(

입력 : 10 20,15 25,15 25
출력 :,,

입력 : 9999 9998 9997,10000 9998 9997,10000 10000 9997,10300 10000 10000
출력 ::D,:D,:(

입력 : 100,90,80,70
출력 ::(

입력 : 10000 10000 10000 9999,10000 10000 10000 10000,10010 10020 10030 10040
출력 ::D,:(

입력 : 9999 9998 9997 9996,10196 10197 10198 10199,10399 10199 10197 10196
출력 ::D :D :D :D,


@ MartinBüttner 아, 눈치 채지 못했습니다. 고정
도어 손잡이

이 예의 첫 번째 단계도 모호합니다.
Martin Ender

1
예제 4는 모호하지 않습니다.
Martin Ender

(i.e. a user can start with 1337 reputation). 나는 내 담당자였던이 coz를 좋아했습니다 ... 5 분 전 누군가가 내 답변 중 하나를 xvoted 때까지 xD
Teun Pronk

예 5, 단계 2도 모호합니다 (어떤 10k 사용자가 어느 것입니까?). 예를 들어 7과 같습니다 (동일한 담당자를 식별하는 규칙이 중요하지 않다는 규칙을 추가하지 않는 한, 나중에 다른 사람과 연결 한 경우 어느 사용자가 첫날에 어떤 사용자인지 어떻게 알 수 있습니까?)
Martin Ender

답변:


12

루비, 209 바이트

편집 : Ruby로 전환하여 약 30 % 단축했습니다. 원래 Mathematica 버전의 편집 기록을 참조하십시오. 루비 permutation가 동일한 요소의 전환 위치를 무시하지 않고 (Mathematica를 속이는) 주요 절약 효과가 있다고 가정합니다 .

이것은 개행으로 분리 된 형식을 사용합니다.

gets.split('
').map{|s|s.split.map &:to_i}.each_cons(2){|a,b|a.permutation.map{|q|q.zip(b).map{|x,y|y-x}}.reject{|d|d.any?{|x|x<0||x>200}}.size!=1?abort(':('):(puts':D '*(a.count{|d|d<1e4}-b.count{|d|d<1e4}))}

요지는 이것입니다 :

  • 연속 된 일 쌍을 모두 가져옵니다.
  • 전날의 모든 순열을 가져 와서 현재 날짜에서 각 빼기를 빼십시오.
  • 음수 또는 200보다 큰 차이를 포함하는 모든 결과를 버립니다.
  • 나머지 순열 수가 1이 아닌 경우을 출력 :(합니다.
  • 그렇지 않으면, :D새로운 10k 사용자가있는만큼 출력하십시오 .
  • 마지막으로 첫날 이후 모든 날짜를 삭제하십시오 :(.

적은 골프 :

gets.split("\n").map{|s|
  s.split.map &:to_i
}.each_cons(2){|a,b|
  a.permutation.map{|q|
    q.zip(b).map{|x,y|
      y-x
    }
  }.reject{|d|
    d.any?{|x|
      x<0||x>200
    }
  }.size!=1 ? abort(':(') : (puts ':D '*(a.count{|d|d<1e4}-b.count{|d|d<1e4}))
}

나는 그것이 하나의 아름다운 열거 자 체인이라고 생각합니다. :)

추신 : 내가 이것에 대한 답변을 처음 제출 한 것이 이상 합니까?


8
나는 그것이 이상하다고 생각하지 않습니다. 뭔가 당신이 홈 필드 이점을 가지고 말해;)
캘빈의 취미

그래서 이것은 질문의 예 중 일부를 실패 할 것입니다.
Cruncher

@Cruncher 스펙에 따라 잘못되었다고 생각하는 사람들은 실패합니다 (주석에서 언급했듯이). Doorknob이 예제를 수정하는 대신 사양을 변경하기로 결정하면이 작업을 다시 수행해야한다고 생각합니다.
Martin Ender

@ MartinBüttner 그것이 내가 생각한 것입니다. 그냥 확인 :)
Cruncher

6

하스켈 254 249 244 232 228

import Data.List
t=m(9999<)
p(a:b:r)=(a,b,r)%(filter(all(`elem`[0..200]))$nub$m(zipWith(-)b)$permutations a)
p _=""
(a,b,r)%(_:[])=(concat$m(const":D ")$t b\\t a)++'\n':p(b:r)
_%_=":("
m=map
main=interact$p.m(m read.words).lines

약간의 설명 : 알고리즘은 MartinBüttner가 사용하는 알고리즘과 매우 유사하지만 nub몇 가지 생각을했습니다. n 일에 비해 n + 1 일에 얼마나 많은 평판 값이 10000 이상인지를 계산하는 데 목록 차이가 사용됩니다.t b\\t a .

또한 사양 해석에 대해 MartinBüttner와 동의하며 위의 예 중 일부는 예 # 2가 잘못되었다는 점까지 잘못되었습니다 ( :().


별명을 사용하지 map않습니까?
자랑스런 Haskeller

1
맞습니다 (2 바이트 절약). 그러나 다른 10 바이트는 z접두사를 만들고로 대체 replicate (length l) x하여 저장할 수 있습니다 map (const x) l. Haskell은 환상적이지 않습니까?
TheSpanishInquisition

그것은 확실하다. 좋은 골프! 기능 응용 프로그램이 가장 높은 우선 순위를 가지고 있기 때문에 그 메모에서, 당신은 단축 할 수 있어야 (t b)\\(t a)t b\\t a4 바이트 이상을 골프.
자부심을 가진 haskeller

코드를 자동으로 줄일 수있는 위치를 찾기위한 코드가 있다면 좋을 것입니다 ...하지만 약간 큰 프로젝트 인 것 같습니다.
자부심을 가진 haskeller

당신은 바로 @proudhaskeller입니다. 그 paretheses는 불필요했습니다. 감사.
TheSpanishInquisition
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.