Skat의 점수 카운터


11

당신의 임무는 Skat 손의 점수를 세는 작은 프로그램을 작성하는 것입니다. Skat 데크에는 7-10 개의 카드, Jack, Queen, King 및 Ace (Unter, Ober, König 및 Daus)가 있습니다. 우리는 클럽, 스페이드, 하트 및 다이아몬드 대신에 도토리, 나뭇잎, 하트 및 벨이있는 독일 슈트를 사용합니다. 포인트는 카드 번호로 결정됩니다.

  • 7, 8, 9는 0 점입니다
  • 운 터는 2 점입니다
  • 오버는 3 포인트입니다
  • 코니 그는 4 점입니다
  • 10은 10 점입니다
  • Daus는 11 점입니다.

입출력

입력 형식은 두 개의 기호로 구성되며 첫 번째 기호는 값을 나타내고 두 번째 기호는 해당 값을 나타냅니다.

  • 7, 8, 9는 그들 스스로를 의미합니다
  • 0은 10을 나타냅니다.
  • Unter, Ober, König 및 Daus는 첫 글자 (U, O 및 D)의 이름을 따서 명명되었습니다.
  • 도토리, 잎, 하트 및 배 (A, L, H 및 B)에 대해서도 동일

입력은 단일 공백으로 구분 된 단일 라인의 카드입니다. 어디에서나 입력을받을 수 있으며 명령 행 인수도 괜찮습니다. 출력은 손의 값으로 인쇄되거나 종료 코드로 반환됩니다. 손에 카드가 두 번 나타나면 프로그램 출력에 오류가 표시되어야합니다. (따라서 7A 0L 7A대신 오류를 반환해야합니다 10). 프로그램이 결과를 출력하는 기본 방법 인 경우 오류를 표시하는 대신 종료 코드 255로 종료해도됩니다.

  • 7A 8A 9A UA OA KA 0A DA 7L 8L 9L UL OL KL 0L DL 7H 8H 9H UH OH KH 0H DH 7B 8B 9B UB OB KB 0B DB120을 준다
  • 7A 8L 0K DB 8L 오류를 준다
  • UA OB DL KH20을 준다

규칙

  • 코드 골프 : 가장 짧은 코드 승리
  • 일반적인 코드 골프 규칙이 적용됩니다
  • 이 프로그램은 예제뿐만 아니라 모든 손을 위해 작동해야합니다.
  • GIGO : 입력이 유효하지 않으면 출력이 임의적 일 수 있습니다

stderr에 대한 추가 출력 (예 : 경고)이 정상입니까?
Ventero

@Ventero : 그렇습니다. 오류를 범하는 방법은 괜찮지 만 오류가 있음을 사용자에게 명확하게 표시해야합니다.
FUZxxl

Jack, Queen, Ace는 Unter, Ober, King , Daus? 왕이 거기에 있어야합니까?
Ry-

@minitech 아니요, 그렇지 않습니다.
FUZxxl

2
"벨리"가 아니라 "벨"을 의미한다고 생각합니다. 매우 다릅니다.
boothby

답변:


2

APL ( 54 48)

카드 값을 선택하는 짧은 방법이,하지만 난 그것을 볼 수 없습니다.

(+/12-'D0.....KOU.'⍳⊃¨A)÷A≡∪A←↓A⍴⍨2,⍨2÷⍨⍴A←⍞~' '

당신은 얻을 DOMAIN ERROR중복 카드가 있다면.

설명:

  • A←⍞~' ': 공백 없이 ( ) 를 사용자 입력 줄 ( )에 저장 하십시오.A~
  • 2,⍨2÷⍨⍴A: ( ) 의 길이를 ( ) 2 A로 나눈 ÷⍨다음 ( ,⍨)의 숫자 2를 포함하는 2 요소 목록 . (따라서 입력이 UA OB DL KH목록 인 경우 (4, 2)).
  • ↓A⍴⍨: A의 값을 포함하는 목록의 차원으로 행렬 ( )을 정의합니다 . 그런 다음 행의 요소를 함께 결합하여 ( ) 목록 목록을 제공합니다 ['UA','OB','DL','KH'].
  • A←:이 목록을 A에 저장하십시오.
  • A≡∪A: ∪A는 A의 고유 한 요소 목록입니다. A와 같으면 중복이없고 1을 반환하고, 그렇지 않으면 0을 반환합니다.
  • ÷: 왼쪽에있는 것을 (실제 계산을 수행하는) 등식 테스트의 결과로 나눕니다. 따라서 중복이 없으면 점수는 변경되지 않으며 중복이 있으면 DOMAIN ERROR0으로 나누기 때문에 a를 얻습니다 .
  • ⊃¨A: A 의 각 요소 ( ¨)의 첫 번째 요소 ( )를 제공하는 목록 입니다. 따라서 점수 문자를 남기고 적합한 문자를 삭제합니다. ( UODK)
  • 'D0.....KOU.'⍳:이 문자열에서 각 점수 문자의 색인을 제공하고 문자열에없는 값에 대해 12를 리턴합니다. ( 10 9 1 8)
  • +/12-: 12에서 모두 빼고 함께 더합니다. ( 2 + 3 + 11 + 4 = 20)


나는 당신의 대답이 가장 짧다는 것을 완전히 놓쳤다.
FUZxxl

10

루비 1.9, 52 자

명령 행 인수를 통해 입력하십시오. 중복 카드가있을 때 오류 메시지가 중요하지 않다고 가정하므로 eval / type 변환 오류에 대해서만 불평합니다.

p eval$*.uniq!||$*.map{|i|"..UOK#$<.0D"=~/#{i}?/}*?+

사용법 예 :

$ ruby1.9 skatscore.rb 7A 8A 9A UA OA KA 0A DA 7L 8L 9L UL OL KL 0L DL 7H 8H 9H UH OH KH 0H DH 7B 8B 9B UB OB KB 0B DB
120

$ ruby1.9 skatscore.rb 7A 7A
skatscore.rb:1:in `eval': can't convert Array into String (TypeError)
    from skatscore.rb:1:in `<main>'

한편으로 중복 카드에 대한 정의되지 않은 변수 오류는 다소 불충분하다고 생각합니다. 다른 한편으로는 규칙을 어 기지 않기 때문에 다소 영리합니다.
Igby Largeman 2016 년

1
@Charles : 스펙 오류 만 요구하기 때문에 어떤 오류가 거의 관련이없는 것으로 생각합니다. 그리고 오류를 생성하는 짧은 방법이 있다면 괜찮을 것 같습니다.
Joey

6

스칼라, 87 82 자

args.distinct(args.size-1);println(args.map(a=>1+" UOK     0D".indexOf(a(0))).sum)

반복 된 카드에서 예외가 발생합니다.


4

하스켈, 122 108 107 자

import List
main=interact$f.words
f x|nub x==x=show$sum$map(maybe 0 id.(`elemIndex`"  UOK     0D").head)x

error""보다 짧습니다 undefined. 을 사용하여 하나의 문자를 저장하십시오 interact.
FUZxxl

@ FUZxxl : interact그것을 사용 하면 줄 바꿈이 인쇄되지 않으므로 그것이 허용되는지 확실하지 않습니다. 그러나, 대신에 불완전한 패턴을 사용하여 더 많은 비용을 절약 할 수있었습니다 undefined.
hammar

개행이 필요하다고 어디에서 말했습니까? 기억이 안나
FUZxxl

2

GolfScript 54 53 52

편집 1 :

방금 코드에서 오류를 발견했습니다. 중복이 입력에서 처음 두 개인 경우 중복 카드를 감지하지 못했습니다 ( 첫 번째 루프에 대해 각 연산자가 *아닌 접기 연산자를 사용했기 때문에 /).

이제 코드를 수정하고 프로세스에서 1 문자를 제거했습니다. 새 버전은 다음과 같습니다.

' '/{1$1$?){]?}{\+}if}/2%{"UOK0D"\?).0>+.4>5*+}%{+}*

입력은 지정된 형식으로 문자열로 스택에 있어야합니다 (예 :) '7A UA DA'.

입력이 유효하면 프로그램은 총 카드 값을 인쇄합니다.

중복 카드가 하나 이상있는 경우 프로그램에서 다음 예외가 발생합니다.

(eval):1:in `block in initialize': undefined method `class_id' for nil:NilClass (NoMethodError)

편집 2 :

본 후 메타 사이트에서이 기사를 , 나는 코드에 대한 설명을 게시하기로 결정했다. 또한 오류를 찾고 수정하는 데 도움이되었습니다. 그래서 여기에 간다 :

# Initially, we epect the input string to be on the stack
# Example: "7A UA DA"

' '/            # split the input string by spaces
                # now we have on the stack an array of strings
                # (in our example: ["7A" "UA" "DA"])

# {1$1$?)!{\+}{]?}if}/  -> this piece of code checks for duplicate cards
#
# The trailing symbol (/) is the 'each' operator, meaning that the 
# preceding code block (enclosed in curly brackets) will be executed 
# for every cards in the previous array.
#
# Before each execution of the code block, the current card value
# is pushed on the stack.
#
# Basically what this code does is concatenate cards into a string
# and checks whether the current card is contained in the accumulated
# value.
#
# So, for each card, this is what we execute:

1$              # copies the concatenated string on top of the stack
                # (initially this is an empty string)

1$              # copies the current card on top of the stack

?               # returns (places on the stack) the 0-based index where 
                # the current card is found in the concatenated string
                # or -1 if not found

)               # increments the topmost stack value
                # Now we have 0 if the card is not a duplicate
                # or a value greater than 0 otherwise

{]?}{\+}if      # if the current stack value is non-0 (duplicate)
                # then execute the first code {]?} (generates an error)
                # Otherwise, if the card is valid, execute the {\+} block.
                # What this code does is essentially concatenate the current 
                # card value:
                #    \ -> swaps the two topmost stack values; now we have
                #         the concatenated string and the current card value
                #    + -> this is the concatenation operator

# After the previous code block finishes execution (in case the input is)
# valid, we end up having the concatenated card values on the stack
# In our example, this value is "DAUAUB7A".

# The next code fragment is the one that computes the card values
# This is the code: 2%{"UOK0D"\?).0>+.4>5*+}%{+}*

# And this is how it can be broken down:

2%              # takes only the even indexed chars from the existing string 
                # in our case, "DAUA7A" -> "DU7"
                # Only these characters are important for determining the 
                # card values.

# The following piece of code is:
# {"UOK0D"\?).0>+.4>5*+}%

# This code performs a map; it takes the individual chars,
# computes the corresponding numeric value for each of them and outputs an
# array containing those values

# This is achieved using the map operator (%) which evaluates the preceding 
# code block, delimited by curly braces, so, essentially this is the code that 
# computes the value for a card:
# "UOK0D"\?).0>+.4>5*+
# It can be broken down like this:

"UOK0D"         # pushes the "UOK0D" string on the stack
\               # swaps the two topmost stack values
                # Now, these values are: "UOK0D" and "l" 
                # (where "l" represents the current letter
                # that gives the card its value: U,O,K,0,D,7,8...)

?               # Find the index of the card's letter in the
                # "UOK0D" string.
                # Remember, this is 0-based index, or -1 if not found.

)               # increment the index value
                # Now we have the following value:
                #     1 if the card is U
                #     2 if the card is O
                #     3 if the card is K
                #     4 if the card is 0
                #     5 if the card is D
                #     0 if it is anything else

.0>+            # if the current value is greater than 0,
                # add 1 to it.

.4>5*+          # if the current value is greater than 4,
                # add 5 to it.

# Passing through these steps, we now have the following value:
#     2  if the card is U
#     3  if the card is O
#     4  if the card is K
#     10 if the card is 0
#     11 if the card is D
#     0  if it is anything else
# This is the exact value we were looking for.

# Now we have an array containing the value of each card.
# in our example, [0, 2, 11]
# The next piece of code is easy:

{+}*            # uses the * (fold) operator to add up all the
                # values in the array.

# This leaves the total value of the cards on the stack,
# which is exactly what we were looking for (0+2+11=13).

# Golfscript is awesome! :-)

1

파이썬, 114 자

i=input().split();print(sum(int(dict(zip('7890UOKD','000A234B'))[x[0]],16)for x in i)if len(i)<=len(set(i))else'')

불행히도, index파이썬에서리스트 의 메소드는 음수 값을 반환하는 대신 요소를 찾을 수 없으면 오류를 발생시키고 가져 오기 defaultdict는 저장하는 것보다 더 많은 문자를 필요로합니다.


1

eTeX, 201 자 (두 개의 관련없는 줄 바꿈은 제외)

\def~#1#2{\catcode`#113\lccode`~`#1\lowercase{\def~}##1 {\ifcsname
#1##1 ~\D\fi\if\csname#1##1 ~\fi+"#2}}~70~80~90~0A~U2~O3~K4~DB\def
\a[#1]{\let~\endcsname\write6{^^J \the\numexpr#1 }\end}\expandafter\a

로 사용됩니다 etex filename.tex [UA OB DL KH]. 인수를 괄호로 묶어야합니다. 그렇지 않으면 eTeX에서 인수 목록의 끝에 도달했는지 확인할 방법이 없습니다.

편집 : 질문 문에 허용 된대로 잘못된 입력으로 인해 오류가 발생할 수 있습니다. 예를 들어, 유효한 색상이 아니기 etex filename.tex [OK]때문에 끔찍하게 충돌 K합니다.


내 컴퓨터에서 작동하지 않습니다.
FUZxxl

@FUZxxL. 출력은 etex -v무엇입니까? 오류 메시지는 무엇입니까? 코드는 파일에 (name filename.tex또는 다른 것으로 끝나는 .tex) 파일에 넣고 명령 행에서 해당 이름을 사용해야합니다 etex filename.tex [<argument>]. (같은 댓글을 다시 게시해서 죄송합니다. " @FUZxxl"를 잊어 버렸습니다 )
Bruno Le Floch

여기를보십시오 : hpaste.org/48949
FUZxxl

@FUZxxL. 의견을 보내 주셔서 감사합니다. K유효한 색상이 아니며 X예제에서이 색상을 바꾸면 오류가 제거됩니다 ( K해당 문자는 다른 의미 인 King이 있기 때문에 충돌합니다 ). \string각 앞에 추가하여 오류를 덜 끔찍하게 만들 수 ##1있지만 12 문자가 더 필요합니다.
Bruno Le Floch

죄송합니다. 예제를 잘못 입력했습니다. 지금 작동합니다. 죄송합니다.
FUZxxl

1

PowerShell, 79 80

($a=$args|sort)|%{$s+=(10,11+4..0)['0DKOU'.IndexOf($_[0])]}
$s/("$a"-eq($a|gu))

카드가 두 번 나타날 경우»0으로 나누려고했습니다.

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