CodeGolf-머리 또는 꼬리


26

명령

알 수없는 입력 문자열을 감안할 때 i하나의 값이 머리 또는 꼬리를 반환 1하기위한 헤드-1에 대한 꼬리 짧은 코드.

골프 코드가 아닌 샘플 (55b) :

if(i == "heads"){
    print(1);
}else{
    print(-1);
}

골프 코드 샘플 (16b) :

print("t">i||-1)


Javascript가 예제에 사용되었지만 필수는 아닙니다 . 대부분의 사용자에게 너무 단순하면 개선 될 수 있습니다.


14
PPCG에 오신 것을 환영합니다! 이것은 흥미로운 도전이 되기에는 너무 간단합니다. 앞으로는 샌드 박스에 도전 과제를 게시하는 것이 좋습니다. 여기서 도전 과제를 게시하기 전에 피드백을받을 수 있습니다.
Alex A.

1
6 답변, 그렇게 나쁘지 않은 도전. 다시 시도
edc65

4
4 upvotes와 5 downvotes에서 귀하의 질문은 실제로 인기가 없었습니다. 방금 혼합 리뷰를 받았습니다. 당면한 과제는 약간 기본이지만, 잘 정의되어 있으며 지금까지 몇 가지 다른 접근 방식을 갖춘 7 가지 답변이 있습니다. 첫 번째 시도에는 그렇게 나쁘지 않습니다.
Dennis

7
어제 -4, 지금 +4로 혼란스러워서 이것이 확실하지 않습니다 : P
Juan Cortés

10
나는 이처럼 짧은 도전을 오랫동안 기다리고 있었다. 대부분의 도전은 나처럼 초보자에게는 너무 길고 복잡하다.
Sean Latham

답변:


11

CJam, 4 바이트

I'e#

CJam에서 유효한 식별자가 아니기 I때문에 변수 가 입력을 보유 한다고 가정합니다 i.

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

이것은 JavaScript 코드와 동일합니다 I.indexOf('e').


이 도전에 아마도 무적입니다.
Alex A.

1
나는 요구 사항을 충분히 이해하지 못하고이 질문으로 자신을 바보로 만들었습니다. 돌아가서 숨길 게요
Juan Cortés

여기에 왜 포함하지 p않습니까? CJam의 표준이 아닌가?
Tim

@Tim CJam은 항상 프로그램의 스택 내용을 자동으로 인쇄합니다.
마틴 엔더

2
@Tim : 질문은 1 또는 -1 을 반환 한다고 말 하므로 스택에 숫자를 남겨 두는 것이 좋을 것이라고 가정했습니다. p필요하지 않다는 것을 보여주기 위해 퍼머 링크를 편집했습니다 .
Dennis

17

C, 18 바이트

꽤 쉽지만 재미를 위해서만 해보자 ...

puts("-1"+*i/8%2);

문자열은 줄 바꿈과 함께 char *i1에 대해 heads-1을 인쇄합니다 tails.

설명

C에서 "-1" + 11 문자 앞으로 가리 키므로와 같습니다 "1". 첫 번째 문자를 살펴 보겠습니다.

"heads"[0] = 'h' = 104 = 0b01101000
"tails"[0] = 't' = 116 = 0b01110100

우리가 0부터 시작에서 가장 오른쪽 비트를 계산하는 경우, (3)의 1 비트 heads에 0 tails이 합계량 : "-1"올바른 문자열을 준다. 다음과 같이 보입니다 :

"-1" + ((i[0] >> 3) & 1)

이제, 대체 i[0]*i전원 - 중 - 두 부문과 오른쪽 시프트는 몇 바이트를 저장합니다. 쓸모없는 괄호도 제거하십시오.

"-1" + (*i / 8 & 1)

이제 & 1로 대체 할 수 있습니다 % 2. 문자 수는 동일하지만 모듈러스의 우선 순위가 더 높으므로 괄호를 삭제할 수 있습니다. 공백을 제거하십시오.

"-1"+*i/8%2

보너스

C에서 정수 1 또는 -1 (문자열 아님)을 얻는 가장 짧은 방법은 다음과 같습니다.

18-*i/6

설명:

'h' = 104
't' = 116

('h' + 't') / 2 = 110
110 - 'h' =  6
110 - 't' = -6

(110 - 'h') / 6 =  1
(110 - 't') / 6 = -1

Apply distributive property (integer division):
18 - 'h' / 6 =  1
18 - 't' / 6 = -1

1
아름답고 사랑합니다
Juan Cortés


9

PHP-11 바이트

<?=1-$i^=F;

이것은 정수로 입력 할 때 'tails' ^ 'F''2''heads' ^ 'F'→ 이기 때문에 작동합니다 .'.'0

이 솔루션 (또는 아래 중 하나)을 다음과 같은 방법으로 테스트 할 수 있습니다.

<?php foreach(['heads', 'tails'] as $i): ?>
 <?=1-$i^=F;
endforeach; ?>

이데온 링크


대안

15 : <?=1-md5($i)%3;
16 : <?=md5($i)[5]-5;
16 :<?=-crc32($i)%5;


짧은 버전을 사용하면 항상 1을 얻습니다 .XOR의 기능에 대해 설명해 주시겠습니까?
Juan Cortés

@ JuanCortés 나는 설명과 Ideone에 대한 링크를 추가했습니다.
primo

2
이제 상자 밖에서 생각하고 있습니다!
Dennis

6

TI-BASIC, 9-10 바이트

cos(πʳinString(Ans,"t

똑바로. "t"는 "tails"의 1 번 위치에 있지만 "t"는 "heads"문자열에 없으므로 inString (꼬리의 경우 1, 머리의 경우 0을 반환합니다.

계산기가 라디안 모드 인 경우 (수학자의 경우처럼) 9 바이트 만 걸립니다.

cos(πinString(Ans,"t

TI 계산기에는 명명 된 문자열이 없으므로 입력 값은 계산기의 응답 변수에 있습니다. 또한 소문자는 각각 2 바이트이므로이 솔루션은 실제로 "heads"라는 단어보다 적은 메모리를 사용합니다.


대단해. 그러나 바이트 수는 꺼져 있습니다. cos (, π 및 라디안 기호는 모두 1 바이트이므로 실제로는 8-9 바이트입니다.
MI Wright

1
tinString(각 두 바이트입니다.
lirtosiast

아, 소문자가 2 바이트 인 것을 잊었습니다. 그럼 신경 쓰지 마
MI Wright

5

핵분열 , 26 21 바이트

O/';'1
"S@]_"-
R? <tL

마틴 (그의 훌륭한 대답 여기가 ) 빠른 골프보다 새로운 언어, 무엇을 더 나은 곳으로 배우고 나를 설득? 이것은 거의 최적이 아니지만 재미있었습니다! 기분이 좋으면 요청이있을 경우 어떤 형태의 설명을 제공 할 수 있습니다.



4

Pyth-4 바이트


 xz"e

머리꼬리로 달린다 . 마찬가지로 i이다 intPyth이 용도에 z사용자 입력을 포함하는 변수의 이름 등. Python과 동일 print(z.find("e"))하므로 @Dennis의 메소드를 사용합니다.


4

VBA (Excel), 12 바이트

환상적인 골프는 아니지만 VBA를 사용하여 적절한 프로그래밍 언어와 가까운 곳으로 가면 재미 있습니다 ...

?13-asc(i)/6

i는 문자열이며 첫 번째 문자의 ASCII 값을 6으로 나눈 다음 13에서 빼서 1 또는 -1을 제공합니다. 매우 간단합니다.

즉시 창에서 실행 예제 (입력 변수를 설정하기 위해 10 바이트 추가) :

i="Heads":?13-asc(i)/6
 1

4

C, 22 바이트

puts(*i>'h'?"-1":"1");

크레딧은 이것에 대해 말해 주셔서 @TheE 로갑니다 !

설명:

문자열의 첫 문자가보다 크면 'h'문자열 "-1"이 인쇄됩니다. 그렇지 않으면 문자열 "1"이 인쇄됩니다. 이 방법에는 줄 바꿈 문자가 붙어 있습니다.


이전 버전 (25 바이트) :

printf("%d",*i>'h'?-1:1);

설명:

문자열의 첫 문자가보다 크면 'h'-1이 인쇄됩니다. 그렇지 않으면 1이 인쇄됩니다.


나는 방금 전에 t를 말했고, char 유형으로 i를 사용하면 실제 정의는 다음과 같이 1 바이트를 초과합니다.-(-1) ** i / 16
Abr001am

@ Agawa001,하지만 6에 대해 h7을 반환 합니다 t.
Spikatrix

오, 잊어 버렸습니다. 전원을 사용해야합니다 : p
Abr001am

멋진 남자 불행히도 C는 그런 산술 연산을하지 않으므로 -1 * pow (-1, * i / 16)을 사용해야하므로 파이썬과 matlab을 더 오래 사용할 수 있습니다 **와 ^
Abr001am

1
@CoolGuy는 puts를 사용하는 puts(*i>'h'?"-1":"1");것이 더 좋지 않을까요? (22 바이트)
euanjt

4

TR : 17 13 자

(또는 인수 만 세면 14 10…)

tr -s ta-s -1

샘플 실행 :

bash-4.3$ tr -s ta-s -1 <<< heads
1

bash-4.3$ tr -s ta-s -1 <<< tails
-1

간단한 설명 :

tr 음역을 의미합니다. 즉, 첫 번째 인수에서 찾은 입력의 각 문자를 두 번째 인수에서 같은 위치의 문자로 바꿉니다.

tr ta -1 <<< tails         # replaces t ⇢ -, a → 1
⇒ -1ils

첫 번째 인수가 더 길면 두 번째 인수에서 위치가 일치하지 않는 문자가 두 번째 인수의 마지막 문자로 바뀝니다.

tr tals -1 <<< tails       # replaces t ⇢ -, a → 1, l → 1, s → 1
⇒ -1i11

-s( --squeeze-repeats) 옵션을 사용, 같은 문자로 대체 될 것이다 연속 문자는 한 번에 교체 :

tr -s tals -1 <<< tails    # replaces t ⇢ -, a → 1, l+s → 1
⇒ -1i1

따라서 모든 문자를 "꼬리"로 열거하면 필요한 것을 얻습니다.

tr -s tails -1 <<< tails    # replaces t ⇢ -, a+i+l+s → 1
⇒ -1

"heads"와 동일하지만 마이너스 (소름 순으로 정렬 된 문자)를 사용하려면 "t"를 앞에 두어야합니다.

tr -s taedhs -1 <<< heads   # replaces h+e+a+d+s → 1
⇒ 1

“t”를 앞에두고 첫 번째 인수로“꼬리”와“머리”의 모든 고유 문자를 병합하면 최종 솔루션이됩니다.

tr -s tadehils -1 <<< tails # replaces t → -, a+i+l+s → 1
⇒ -1

tr -s tadehils -1 <<< heads # replaces h+e+a+d+s → 1
⇒ 1

문자에서 간격 열거 피하려면 에서 - 형식 대신 사용할 수 있습니다.


설명 할까?
Juan Cortés

BSD / GNU라고 가정합니다 tr. POSIXly :tr -s ta-s '-[1*]'
sch

4

8088 어셈블리, IBM PC DOS, 17 바이트

00000000: b402 0826 8200 7a04 b22d cd21 b231 cd21  ...&..z..-.!.1.!
00000010: c3

미 조립 :

B4 02           MOV  AH, 02H        ; DOS API display char function     
08 26 0082      OR   DS:[82H], AH   ; set parity flag from input 
7A 04           JPE  HEADS          ; if even, heads - display just '1'
B2 2D           MOV  DL, '-'        ; otherwise first display a '-''
CD 21           INT  21H            ; output DL to console
            HEADS: 
B2 31           MOV  DL, '1'        ; display the '1'
CD 21           INT  21H            ; output DL to console
C3              RET

설명:

CPU의 패리티 플래그를 사용하여 첫 번째 문자가 'h'(이진 수의 짝수 1) 또는 't'(홀수의 이진 수 )인지 판별하십시오 1. 이것은 문자를 ASCII로 비교하는 것보다 1 바이트를 절약합니다.

명령 행에서 입력하고 콘솔로 출력합니다.

입출력:

여기에 이미지 설명을 입력하십시오



4

쉘 (휴대용 / POSIX), 16 바이트

expr $i : he - 1

온라인으로 사용해보십시오!
덕분에 @를 StéphaneChazelas 에서 unix.stackexchange.com

다른 솔루션 시도 :
echo $[30#$i%7-1] # 17 bytes but only in bash, zsh. 온라인 사용해보십시오!
echo $((30#$i%7-1)) # 19 bytes but only bash,ksh,zsh. 온라인으로 사용해보십시오!
he=2;echo $[${i%a*}-1] # 22 bytes But only in bash,zsh . 온라인으로 사용해보십시오!
a=${i%h*};echo ${a:+-}1 # 23 . 휴대용. 온라인으로 사용해보십시오!
he=2;echo $((${i%a*}-1)) # 24 bytes . 휴대용. 온라인으로 사용해보십시오!
IFS=h;set $i;echo ${1:+-}1 # 26 (change IFS) . 휴대용. 온라인으로 사용해보십시오!
(IFS=h;set $i;echo ${1:+-}1) # 28 (subshell) . 휴대용. 온라인으로 사용해보십시오!
(IFS=h;set $i;echo $(($#*2-3))) # 31 bytes . 휴대용. 온라인으로 사용해보십시오!

참고 : dash휴대용 쉘 테스터의 합리적인 직유로 사용하십시오 .

  • expr $i : he - 1he와 일치하는 문자 수를 계산하여 작동합니다 $i : he. heads일치 2tails일치하는 0 (없음) 그 때는의 substracting 1- 1.

  • $[30#$i%7-1]문자열을 정수로 변환하여 작동합니다. 베이스 (30)와 모드 7을 7로 선택하여 heads및 사이의 차이 2를 수득 하였다 tails. 그런 다음 1을 빼면 숫자가 1및 로 변환 -1됩니다.
    a $[...]$((...))일부 쉘에서만 유효한 구식 산술 연산 식 입니다.

  • he=2;echo $[${i%a*}-1]일부 값의 변수를 만든 다음 산술 확장을 사용하여 텍스트 값에서 해당 변수를 확장합니다. ${i%a*}변환 headshetailst(즉, 변수로서, 0의 값을 갖는다).

  • IFS=h;set $i;echo ${1:+-}1두 단계로 작동합니다. 에 IFS 설정 h휴식 인용 부호로 둘러싸이지 않은 $i에서이 set $i문자로 나눈 부분으로를 h, heads로 나누어 져 있습니다 '''eads'따라서 설정, $1null로. tail로 나누지 h않으므로 $1같게됩니다 tails. 그런 다음 의 값이 null이 아니 거나 (와 같이) 아무것도없는 경우 ( null이 ${1:+-}있는 -경우 )를 생성합니다 . 그 부호 (또는 아무것도 없음)는와 연결되어 있습니다.$1tails$11

  • (IFS=h;set $i;echo $(($#*2-3)))비슷한 방식으로 작동하지만 $#문자열 $i이 들어간 부분 수 ( )를 사용하십시오 .


3

파이썬 2, 17 바이트

print'-1'['t'>i:]

'heads'보다 작 't'으므로로 평가 True == 1하고 첫 문자 뒤에 문자열을 인쇄합니다. 'tails'보다 크므로으로 't'평가되고 False == 0전체 문자열이 인쇄됩니다.

암시 적 인쇄로 명령 행에서이 작업을 수행하면 다음과 같이됩니다.

'-1'['t'>i:]

... 12 바이트의 경우 출력에 작은 따옴표를 추가합니다.


3

Q 기본, 11 바이트

이것은 내가 쓴 QBasic의 가장 짧은 부분이어야합니다.

c=i>"t
?c^c

설명:

위는 꽤 많이 골프를 친 QBasic입니다. 자동 포맷터가 완성되면 다음과 같습니다.

c = i > "t"
PRINT c ^ c

첫 번째 줄은 문자열 비교 i와를 "t". iis "heads"인 경우 i > "t"false 및 c = 0입니다. 경우 i이며 "tails", i > "t"사실입니다 c = -1. 예, -1QBasic에서 부울 true의 기본값입니다!

두 번째 라인은 매핑 -1-101: 수학 트릭을 통해 (-1)^(-1) == 1/(-1) == -1, 그리고 0^0, 수익을하지만 기술적으로 수학적으로 정의되지 1.

이 코드는이 i를 명시 적으로 문자열 변수로 선언 해야 합니다. 그렇지 않으면이어야 i$합니다. 전체 테스트 프로그램 ( QB64에서 테스트 ) :

DIM i AS STRING
DATA heads, tails

FOR x = 1 TO 2
READ i

c=i>"t
?c^c

NEXT x

3

Gaia , 5 4 바이트

'eI(

Dennis의 CJam answer 와 유사하게 e입력 문자열에서 인덱스를 찾습니다.

스택 값이 충분하지 않으면 입력이 자동으로 인수로 사용되었음을 인식하지 못하여 1 바이트를 절약했습니다.

작동 원리

'e  Push e
I   Index of e in the the input. 2 if heads, 0 if tails
(   Subtract One
Stack gets automatically outputted

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



3

ed , 27 25 21 바이트

ed나에게 두통을 주었다. 마지막으로 @ed1conf트위터의 도움 과 일부 엿봄 으로 알아 냈습니다 unix.se. 당신은 가진 것을 일치시킬 수없는 s/re/newtext/당신이 그것을 앞에해야한다, g그렇지 않으면 ed팩 슬픈합니다. 그것은 "나의 잔디밭을 벗어 라"고 말하는 심술 50은 50 세의 유닉스 프로그램과 같습니다.

g/t/s//-
,s/\w\+/1
w

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

@manatwork 덕분에 최종 /s
-4 바이트를 삭제하여 -2 바이트 (및 그 sed대답은 plagiarised)
Old version :
g/t/s//- g/\w\+/s//1 wq .


1
그러나 두 번째는 결코 실패하지 않으므로 첫 번째 명령에만 주소 트릭이 필요합니다. 그리고 명시 적으로 할 필요가 q없습니다. 남은 작업이 없을 때 자체적으로 종료됩니다. 그리고 그 뒤에는 줄 바꿈 만 있으면됩니다.“.”(또는“roblogic”…)은 불필요합니다. 온라인으로 사용해보십시오!
manatwork

고마워 집에 갈 때 제안을해볼 게 술집에서 지금 👍🏼
roblogic

2

파이썬, 20 바이트

print(('h'in i)*2-1)

False그렇지 않은 경우 반환 합니다 True. 파이썬에서 False0동일하고, True그리고 1도 있습니다.

그래서:

True (1) * 2 -1 = 2-1 = 1
False (0) * 2 - 1 = 0-1 = -1

2

golflua 25 20 18

w(I.r():f'h'&1|-1)

아마도 내가 생각하지 않는 몇 가지 트릭을 사용하여 골프를 더 할 수 있습니다. ( 이전 버전의 히스토리 참조 ) 입력을 이동 write하고 if명령문을 무시하여 5자를 저장 했습니다. 에 선택적 괄호를 무시하여 두 문자를 더 절약했습니다 find. 실패한 조건 (예 : 머리 또는 꼬리 가 아닌 입력)은 검사하지 않습니다 .

루아에 해당하는 것은

io.write(io.read():find('h') and 1 or -1)

2

하스켈, 18 바이트

f('h':_)=1
f _= -1

문자 h로 시작하는 모든 문자열 은에 매핑되고 1다른 모든 문자열 은에 매핑 됩니다 -1.


2

sed : 16 자

s/t/-/
s/\w\+/1/

샘플 실행 :

bash-4.3$ sed 's/t/-/;s/\w\+/1/' <<< 'heads'
1

bash-4.3$ sed 's/t/-/;s/\w\+/1/' <<< 'tails'
-1

니스, 나는 내 ed솔루션에 정규식을 사용 했지만 ed오래되고 심술 났기 때문에 여전히 23 바이트가 걸렸습니다 !
roblogic

\w\+GNU 확장 생각이다.
sch




2

dc , 8 바이트

?z2*1r-p

dc는 문자열을 읽고 평가하는 것 외에 다른 의미있는 작업을 수행 할 수 없습니다. 이렇게하면 "heads"는 구현되지 않은 명령과 빈 스택에 대한 경고를 출력하지만 무시해도되지만 스택은 비어 있습니다. "꼬리"는 마지막 "ls"가 s 레지스터에서 스택으로 값을로드한다는 중요한 예외를 제외하고 거의 동일합니다.

그런 다음 "z"를 사용하여 스택 길이를 구하고 올바른 답을 얻기 위해 산술적으로 바이올린을칩니다.

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


2

삼각형 , 10 바이트

F.~%.7/-_<

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

문자 입력의 ASCII 값을 7로 나눕니다. 15에서 몫을 뺍니다. IP에 프로그램 공간이 부족하면 실행이 중지됩니다. Triangular는 정수 나누기 만 관리 할 수 ​​있기 때문에 작동합니다. 편리하게, "h"는 104의 값을 가지며, 이는 정수를 7로 나눈 14이고; "t"는 116이며, 정수를 7로 나눈 경우 16입니다.

언 골프 / 설명 :

   F
  . ~
 % . 7
/ - _ <
---------------------------------------------------------------
F                 - Push 15 to Top of Stack
 ~                - Read a character from input, push its value to ToS
   7              - Push 7 to ToS
     <_           - Change directions, then pop ToS-1 and ToS, push their integer quotient
        -         - Pop ToS-1 and ToS, push their difference
          %       - Print ToS as an integer

이전 버전 (14 바이트) :

~\81|m/,!<.>i%

입력에서 문자를 읽습니다. 해당 문자의 ASCII 값을 8로 나눈 나머지가 있으면 -1을 인쇄하고 그렇지 않으면 1을 인쇄하십시오.


2

,8 12 8 바이트

_d=2*1-.

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

설명 (구문 적으로 유효하지 않음)

_        Take input and discard the last item
 d=      If the top of the stack is d:
   2*    Re-set the top of the stack as 2
     1-  Decrement the top of the stack by 1
       . Explicitly output the top of the stack

manatwork 덕분에 -4 바이트


TIO 인터프리터 버전 차이가 있습니까? "머리"나 "꼬리"를 처리하지 않는 것 같습니다.
manatwork

이제 프로그램을 수정했습니다.
A̲̲

TIO 인터프리터 버전 차이가 있습니까? 암시 적으로 입력을 받고 존재하지 않는 데이터를 처리하려고 할 때 입력을 되돌려 서없이 작동 ^합니다.
manatwork

BTW, 두 번째 "d"또는 "l"은 이미 입력 한 내용을 식별하므로 "t"까지 4자를 버릴 필요가 없습니다. 처리되지 않은 입력을 스택에 남겨 둘 수 있도록 명시 적으로 출력해야 합니다. 온라인으로 시도하십시오! .
manatwork

"Reg": TIO
A̲̲

1

Vitsy , 13 바이트

그래서, 나는 파티에 늦었다. ¯ \ _ (ツ) _ / ¯

zv&v'h'=)i1rN
z             Grab all input.
 v            Capture the top item (h or t) as a temp variable.
  &           Generate new stack, move to it.
   v'h'=      Test if the variable is h.
        )i    If it isn't, push -1.
          1   Push 1.
           r  Reverse the stack.
            N Print out the top item as a number.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.