PPCG Claus가 선물을 전달하도록 도와주세요!


15

PPCG Claus가 선물을 전달할 수 있도록 도와주세요

개요

PPCG Claus는 요즘 선물을 전달하는 데 늦었습니다. 요즘 우리에게는 많은 이상한 꼬마들이 있기 때문입니다. 이로 인해 PPCG Claus가 모든 선물을 정확한 장소에 가져 오기가 훨씬 어렵습니다. 당신의 도전은 그가 선물을 올바르게 전달하도록 돕는 것입니다.

복잡성

배달 할 아이들을 나타내는 대문자로 된 이름 목록과 숫자로 표현 된 선물 목록이 있다면, 자녀들에게 선물을 배포하는 방법을 알아 내야합니다. 물론 캐치가 있습니다 ....

요즘 아이들이 까다로워지고 있습니다. 만약 kiddo가 이상한 사람이라면 (처음 이니셜은 ASCII 코드가 홀수입니다) 그는 이상한 선물을 원합니다! 그가 짝수 인 경우 (첫 번째 이니셜은 ASCII 코드라도 짝수 임) 분명히 짝수이어야합니다! 그러나 3으로 나눌 수있는 모든 어린이는 장난 꾸러기 장난 꾸러기이므로 PPCG Claus는 내년에 행동하게하려면 완전히 무시해야합니다. 그의 길을 성공으로 생각하기 위해서는 모든 선물을 그 가치가있는 모든 어린이들에게 전달해야하며 한 아이에게 너무 많은 선물을주지 않아야합니다. 어떤 어린이도 동료보다 선물을 3 개 이상 더 많이받는다면 내년에 장난 꾸러기 아이가 될 위험이 있습니다. 어떤 경우에도 좋은의 아이가 선물을받을 수 있었다 다른 때 좋은의 아이는, 그 또한 그 아이의 악을 설정 것하지 않았다.

아이들은 다음과 같습니다.

Kids = ["Amy", "Betty", "Clyde", "Dave", "Francine"] = [A,B,C,D,F] = [65,66,67,68,70]

  • 베티는 인류의 약점이며, 분명히 숫자 3과 일치합니다.
  • 에이미와 클라이드는 태어 났을 때 기이 한 일이었으며 심지어 선물을받는 것을 싫어했습니다.
  • 데이브와 프랜신은 정상적인 아이들입니다. 그들은 심지어 선물을 받아야합니다!

선물은 다음과 같습니다.

Presents = [1,2,3,4,5,6,7,8,9,10,11,12,13,14]

가능한 출력은 다음과 같습니다.

[
    ['Amy',[1,3,5]],
    ['Betty',[]],
    ['Clyde',[7,9,11,13]],
    ['Dave',[2,4,6,8]],
    ['Francine',[10,12,14]]
]

예외 시나리오

그러나 PPCG Claus가 준비되어 있고 기꺼이 있다고해서 PPCG Claus가 할 수있는 것은 아닙니다. 다음은 PPCG Claus에게 나쁜 소식을 전해야하는 예외 시나리오 목록입니다.

PPCGmas is cancelled!

다음과 같은 시나리오에서는 크리스마스가 취소됩니다.

  • 자녀가 없습니다.
    • [],[1,2,3] -웰프.
  • 좋은 아이들은 없습니다.
    • ["Betty"],[1,2,3] -정말, 베티 나사
  • 좋은 아이들보다 선물이 적거나 선물이 적습니다.
    • ["Amy","Charles"],[] -하나 이상의 선물이 없습니다.
    • ["Amy","Charles"],[1] -하나 이상의 선물이 없습니다.
  • 모든 좋은 아이들을 만족시키기 위해 홀수 / 짝수 선물은 없습니다.
    • ["Amy","Dave"],[2,4,6] 에이미가 망 쳤어

PPCGmas에 영향을 미치지 않아야하는 시나리오 목록은 다음과 같습니다.

  • 남은 선물 (모든 어린이는 최대량의 선물을 받아야합니다).
    • ["Amy","Dave"],[2,4,6,8,10,12,14,7,9] = [["Amy",[7,9]],["Dave",[2,4,6,8]]]

반복되는 주요 규칙

  1. 좋은 아이들은 첫 이니셜에 따라 짝수 또는 홀수입니다.
  2. 나쁜 아이들은 처음에는 3으로 나눌 수 있습니다.
  3. 모든 좋은 아이들은 적어도 하나의 선물을 받아야합니다.
  4. 좋은 아이는 다른 좋은 아이보다 2 개 이상의 선물을받을 수 없습니다.
  5. 남은 선물이있는 경우, 4를 위반하지 않고 최대한 배포해야합니다.
  6. 나쁜 아이들은 선물을 전혀받지 않아야합니다.
  7. 이 중 하나라도 위반하면 정확히 출력해야합니다 PPCGmas is cancelled!.

I / O 형식 요구 사항

  • 첫 번째 입력은 첫 번째 이니셜뿐만 아니라 배열 / 목록 / 쉼표로 구분 된 전체 이름 문자열이어야합니다.
  • 두 번째 입력은 양의 정수로 구성된 배열 / 목록 / 쉼표로 구분 된 문자열이어야합니다.
  • 결과는 이해하기 쉬운 선물을 어떻게 배포했는지에 대한 표시 일 수 있습니다. 또는 PPCGmas is Cancelled!.

당첨 기준 :

TL; DR : 베티는 바보입니다. 경쟁하지 마십시오.


예를 들어 왜 Betty가 이해가되지 3않습니까? 편집 : "베티 나사"해야한다면 왜 그녀는 전혀 도전에 있습니까?
NoOneIsHere 여기

@SeeOneRhino B = 66, 66 % 3 = 0, 66은 0으로 나눌 수 있으며, Betty는 못됩니다.
Magic Octopus Urn

답변:


4

APL, 171 바이트

{D←{⍵=1:⊂⍺⋄0~⍨¨↓⍵↑⍉↑⍺⊂⍨1=⍵|⍳⍴⍺}⋄e←⍺~o←⍺/⍨2|⍺⋄(0=≢G)∨0∊≢¨P←P↑⍨¨(2+⌊/R)⌊R←≢¨P←(o D≢O),e D≢E←G~O←G/⍨2|⎕A⍳⊃¨G←⍵/⍨×3|⊃∘⎕UCS¨⍵:'PPCGmas is cancelled!'⋄(O,E,B),[⍟4]P,(≢B←⍵~G)↑⊂⍬}

이것은 선물을 왼쪽 인수로, 자식을 오른쪽 인수로 취하고 첫 번째 열에는 자식의 이름이 포함되고 두 번째 열에는 선물이 포함 된 행렬이 반환됩니다.

테스트 케이스 :

      P←{D←{⍵=1:⊂⍺⋄0~⍨¨↓⍵↑⍉↑⍺⊂⍨1=⍵|⍳⍴⍺}⋄e←⍺~o←⍺/⍨2|⍺⋄(0=≢G)∨0∊≢¨P←P↑⍨¨(2+⌊/R)⌊R←≢¨P←(o D≢O),e D≢E←G~O←G/⍨2|⎕A⍳⊃¨G←⍵/⍨×3|⊃∘⎕UCS¨⍵:'PPCGmas is cancelled!'⋄(O,E,B),[⍟4]P,(≢B←⍵~G)↑⊂⍬}
      (⍳14) P 'Amy' 'Betty' 'Clyde' 'Dave' 'Francine'
┌────────┬─────────┐
│Amy     │1 5 9 13 │
├────────┼─────────┤
│Clyde   │3 7 11   │
├────────┼─────────┤
│Dave    │2 6 10 14│
├────────┼─────────┤
│Francine│4 8 12   │
├────────┼─────────┤
│Betty   │         │
└────────┴─────────┘
      1 2 3 P ⍬
PPCGmas is cancelled!
      1 2 3 P ⊂'Betty'
PPCGmas is cancelled!
      ⍬ P 'Amy' 'Charles'
PPCGmas is cancelled!
      (,1) P 'Amy' 'Charles'
PPCGmas is cancelled!
      2 4 6 P 'Amy' 'Dave'
PPCGmas is cancelled!
      2 4 6 8 10 12 14 7 9 P 'Amy' 'Dave'
┌────┬───────┐
│Amy │7 9    │
├────┼───────┤
│Dave│2 4 6 8│
└────┴───────┘

Ungolfed 버전은 여기입니다.


당신이 ungolfed 버전에서 말하는이 "크리스마스"는 무엇입니까 : P?
Magic Octopus Urn

4

자바 스크립트 (ES6), 525 492 454 453 바이트

@Guedes 덕분에 -71 바이트 @Jake Cobb 덕분에 -1 비트

P=(K,p)=>{y='charCodeAt';n=(C)=>C[y](0)%3>0;N=(C)=>C[y](0)%3<1;E=(C)=>C[y](0)%2>0;O=(C)=>C[y](0)%2<1;f=(U)=>U%2<1;F=(U)=>U%2;M=(U,C)=>C%s==S;s=S=0;a=new Array();G='filter';e=p[G](f);o=p[G](F);J=K[G](n);r=J[G](O);L='length';i=J[G](E);s=r[L];for(S=0;S<r[L];S++){a.push([r[S],e[G](M)]);}s=i[L];for(S=0;S<i[L];S++){a.push([i[S],o[G](M)]);}K=K[G](N);for(S=0;S<K[L];S++){a.push(K[S],[]);}return(e[L]<r[L]||o[L]<i[L]||(r[L]+i[L])<1)?"PPCGmas is Cancelled!":a;}

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

골퍼가 아닌 버전

더 골프를 칠 수 있다고 생각합니다 방금 골퍼가 아닌 버전을 그대로 번역했습니다.

이것은 이제 "산타"를 구성하는 CharCode의 합보다 짧습니다 (115 + 97 + 110 + 116 + 97 = 535). 예이


C[0]대신 C.charCodeAt(0)11 바이트 를 절약합니다. 또한 속성이 여러 번 반복되면 이름을으로 저장하고 대신 L='length'사용할 수 있습니다 . i[L]i.length
Washington Guedes

2
그건 그렇고, PPCG에 오신 것을 환영합니다!
Washington Guedes

조언 감사합니다! :디. C.charCodeAt (0) (repl.it의 최신 파이어 폭스 브라우저) 대신 C [0]을 사용해 보았으며 첫 번째 확인시 "PPCGmas가 취소되었습니다"를 반환합니다. 두 번째로, 그것은 바이트 덕분에 잘 작동합니다 :)
ColdK

1
이것은 좋은 아이들이 모두 짝수 또는 모두 홀수 인 경우 실패하는 원래의 대답과 같은 버그를 가지고 있습니다.P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Jake Cobb

사실이야! 마지막 확인 중 하나에서 "+"대신 "&&"를 사용했기 때문입니다. 덕분 에이 문제는 이제 수정되었으며 1 바이트를 얻었습니다.
ColdK

4

파이썬 2, 334 355 354 바이트

k,p=input()
z=zip
l=len
e=[];o=[];g=[];b=[];q=[];r=[]
for x in k:[g,b][ord(x[0])%3<1]+=x,
for x in g:[e,o][ord(x[0])&1]+=x,
for x in p:[q,r][x&1]+=x,
v=l(e)
w=l(o)
t=v and l(q)/v
u=w and l(r)/w
if u:t=min(t,u+2)
if t:u=min(u,t+2)
if l(g)*(t or v<1)*(u or w<1)<1:exit('PPCGmas is cancelled!')
print z(e,z(*[iter(q)]*t))+z(o,z(*[iter(r)]*u))+z(b,[()]*l(b))

짝수 또는 홀수 아이의 경우를 처리하기 위해 21 바이트가 손실되었습니다.

@TuukkaX 덕분에 1 바이트를 절약했습니다.


하지 작업을 수행 ord('A')%3==0입니다 False1-ord('A')%3입니다 -1.
Jake Cobb

네, 맞습니다. 사과드립니다. %3<1작동해야합니다.
Yytsi

2

자바 스크립트 (ES6) 218 216 바이트

(a,b)=>{c={};a.forEach(d=>c[d]=[]);e=f=0;while(!e){e=g=1;a.forEach(h=>(j=h.charCodeAt())%3?(k=b.findIndex(l=>l%2==j%2))<0?g=0:c[h][f+1]?0:e=0&c[h].push(b.splice(k,1)[0]):0);f+=!e&g}return f?c:"PPCGmas is cancelled!"}

출력 (오류 문자열이 아닌 경우)은 키가 어린이 이름 인 객체입니다. 가치는 아이가받는 선물의 배열입니다.

중복 괄호가 있음을 깨달았을 때 2 바이트를 절약했습니다.

언 골프 버전 :

(names, gifts) => {

  // Initialize result. Set every child's gift array to empty
  var result = {};
  names.forEach(name =>
    result[name] = [];
  );

  // Initialize external loop values
  var done = false;
  var leastNumberOfPresentsAmongGoodChildren = 0;

  // Give the gifts
  while (!done) {

    // Initialize internal loop values
    done = true;
    var everyGoodChildGotGift = true;

    // Try to give at most one gift to every good child
    names.forEach(name => {
      var nameCode = name.charCodeAt(0);

      // Ignore bad children
      if ((nameCode % 3) != 0) {

        // Try to find an appropriate gift
        var giftIndex = gifts.findIndex(gift => (gift % 2) == (nameCode % 2));

        // If there is no gift, set the flag
        if (giftIndex < 0)
          everyGoodChildGotGift = false;

        // Make sure we don't give too many gifts
        else if (result[name].length < leastNumberOfPresentsAmongGoodChildren + 2) {

          // Remove the gift from the gifts array (we can't give it again)
          var giftToGive = gifts.splice(giftIndex, 1)[0];

          // Give the gift to the child
          result[name].push(giftToGive);

          // If at least one child got a gift, try to give more gifts
          done = false;
        }
      }
    }); // end forEach

    // If we're done, that means we couldn't give a gift to any good child
    if (done)
      everyGoodChildGotGift = false;

    // If every good child got a gift, then increase the count
    if (everyGoodChildGotGift)
      leastNumberOfPresentsAmongGoodChildren++;

  } // end while

  // If every good child gets at least one gift, return who gets what
  if (leastNumberOfPresentsAmongGoodChildren != 0)
    return result;
  else
    return "PPCGMas is cancelled!"; // IT'S ALL YOUR FAULT, BETTY. YOU'VE RUINED PPCGMAS.
}

안녕하세요, PPCG에 오신 것을 환영합니다! 게시물 형식이 어떻게 지정되었는지 이해하게되어 기쁩니다. 행복한 코드 골프!
ATaco

@ATaco 감사합니다! 나는 숨어
Ian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.