CodeGolf - голівки або хвости


26

Інструкції

З огляду на невідомий рядок введення iзі значенням ні головок, ні хвостів , поверніться 1для голів або -1для хвостів з найкоротшим кодом.

Зразок коду для гольфу (55b):

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

Зразок коду для гольфу (16b):

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


Для прикладу використовувався Javascript, але це не є вимогою . Вибачте, якщо це занадто просто для більшості користувачів, його можна вдосконалити.


14
Ласкаво просимо до PPCG! Це занадто просто, щоб бути цікавим викликом. Надалі врахуйте, як опублікувати виклики в « Пісочниці» , де вони зможуть отримати зворотній зв'язок, перш ніж надсилати їх наживо.
Олексій А.

1
6 відповідей, не дуже поганий виклик. Спробуйте ще раз
edc65

4
У 4 upvotes та 5 downvotes ваше запитання було не дуже популярним; він просто отримав неоднозначні відгуки. Хоча завдання, яке знаходиться під рукою, є мало базовим, воно чітко визначене і на сьогодні отримало 7 відповідей, які містять кілька різних підходів. Не так вже й погано для першої спроби.
Денніс

7
Я так розгублений зараз, вчора -4, зараз +4, це точно не є стартовим потоком: P
Хуан Кортес

10
Я чекав такого короткого виклику протягом століть, більшість викликів занадто довгі та складні для такого, як я.
Шон Латем

Відповіді:


11

CJam, 4 байти

I'e#

Припускає, що змінна Iмістить вхід, оскільки iне є дійсним ідентифікатором у CJam.

Спробуйте в Інтернеті.

Це еквівалентно коду JavaScript I.indexOf('e').


Напевно, непереборний для цього виклику.
Олексій А.

1
Вибачте, що я недостатньо зрозумів вимоги і змусив себе дурити це питання. Я повернусь назад і сховаюся зараз
Хуан Кортес

Чому ви не включаєте pв це? Це стандарт у CJam не робити?
Тім

@Tim CJam завжди автоматично друкує вміст стеку в програмі.
Мартін Ендер

2
@Tim: У питанні сказано повернути 1 або -1, тому я припускав, що залишити номер у стеку буде добре. Я відредагував постійну посилання, щоб показати, що pце не потрібно.
Денніс

17

C, 18 байт

Досить просто, але давайте зробимо це просто заради задоволення ...

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

Враховуючи рядок, char *iвона друкує 1 для headsта -1 для tails, із заднім рядком.

Пояснення

В C "-1" + 1вказує на 1 символ вперед, тому він такий самий, як "1". Давайте розглянемо перші персонажі:

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

Якщо ми порахуємо біти від правого правого, починаючи з нуля, біт 3 дорівнює 1 дюйму, headsа 0 в tails: підсумовуючи його, "-1"дає правильний рядок. Це виглядає приблизно так:

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

Тепер замініть i[0]на *iі правильний зсув діленням потужності двох, щоб зберегти кілька байт. Також видаліть непотрібні дужки:

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

Тепер, & 1можна замінити на % 2. Кількість символів однакова, але модуль має більший пріоритет, що дозволяє скидати дужки. Видаліть пробіл:

"-1"+*i/8%2

Бонус

Я думаю, що найкоротший спосіб отримати ціле число 1 або -1 (не рядок) у C:

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
Красиво, люблю це
Хуан Кортес


9

PHP - 11 байт

<?=1-$i^=F;

Це працює тому, що 'tails' ^ 'F''2'і 'heads' ^ 'F''.', які при введенні як ціле число є 0.

Ви можете протестувати це рішення (або будь-яке з наведених нижче) наступним чином:

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

Ideone Link


Альтернативи

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


З короткою версією я завжди отримую 1, будьте обережні, щоб пояснити, що це стосується XOR?
Хуан Кортес

@ JuanCortés Я додав пояснення та посилання на Ideone.
примо

2
Тепер це мислення поза коробкою!
Денніс

6

TI-BASIC, 9-10 байт

cos(πʳinString(Ans,"t

Прямо. "t" знаходиться в позиції 1 "хвости", але "t" не в рядку "heads", тому inString (повертає 1 для хвостів і 0 для head.

Якщо ваш калькулятор знаходиться в радіальному режимі (як і будь-який математик), він займає лише дев'ять байтів:

cos(πinString(Ans,"t

Зверніть увагу, що калькулятори TI не мають іменних рядків, тому вхід знаходиться у змінній відповіді калькулятора. Також зауважте, що малі літери - це два байти кожен, тому це рішення фактично займає менше пам'яті, ніж слово "голови".


Це круто. Хоча кількість байтів вимкнено - cos (, π і радіанський символ - це один байт, тож насправді це 8-9 байт.
М. І. Райт,

1
Кожен tі inString(є кожен два байти.
ліртосіаст

О, я забув про те, що прописні літери складають два байти. Неважливо, значить.
М. І. Райт

5

Fission , 26 21 байт

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

Мартін (і його чудова відповідь тут ) переконав мене вивчити нову мову, а що кращого місця, ніж швидкий гольф? Це майже точно не оптимально, але ей, це було весело! Після того, як я почуваюся добре з цього приводу, я можу надати певну форму пояснення, якщо воно буде просити.



4

Pyth - 4 байти


 xz"e

Бігайте з головами або хвостами . Як iі intв Pyth, це використовує zім'я змінної, яка містить будь-які дані користувача. Він еквівалентний Python print(z.find("e")), тому використовує метод @ Денніса.


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.


я тільки що сказав раніше, використовую i як char типу, фактичне визначення перевищить би на 1 байт, як це повернення - (- 1) ** i / 16
Abr001am

@ Agawa001, але це повертає 6 для hі 7 для t.
Spikatrix

о, я забув, я повинен використовувати владу: p
Abr001am

Прохолодний хлопець, на жаль, не має таких арифметичних операцій, тому вам доведеться використовувати -1 * pow (-1, * i / 16), що робить його більш довгим, з іншого боку, використання пітона та
матлаба

1
@CoolGuy міг би використовувати путівки puts(*i>'h'?"-1":"1");не краще? (22 байти)
euanjt

4

Тр: 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

Те ж саме для "head", але wee потрібно тримати "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

Щоб уникнути перерахування символів, натомість можна використовувати інтервал у форматі від - до .


Хочете пояснити це?
Хуан Кортес

Це передбачає 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

Пояснення:

Використовуйте прапор парності центрального процесора, щоб визначити, чи є перша знаком 'h'(парне число двійкових)1 ) або 't'(непарна кількість двійкових 1). Це економить один байт при порівнянні знаків в ASCII.

Введення з командного рядка, вихід на консоль.

Введення-виведення:

введіть тут опис зображення



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 - 1працює підрахунок , скільки символів збігаються heз $i : he. headsМатч 2і tails(немає) .Потім віднімаючи матч 0 1з - 1.

  • $[30#$i%7-1]працює шляхом перетворення рядка в ціле число. База 30 і мод на 7 були обрані для отримання різниці в 2 між headsі tails. Потім віднімання 1 перетворює числа в 1і -1.
    Зауважимо, що а $[...]- архаїчна форма арифметичного вираження, що $((...))діє лише в деяких оболонках.

  • he=2;echo $[${i%a*}-1]працює, створюючи змінну деякого значення, а потім використовуючи Арифметичне розширення для розширення цієї змінної (з текстового значення). У ${i%a*}звернених headsдо heі tailsдо t(що, як змінна, має значення 0).

  • IFS=h;set $i;echo ${1:+-}1працює в два етапи. Установка IFS в hперервах некотируваних $iв set $iна частини розділені за характером h, headsділиться на ''і 'eads', таким чином , встановивши $1в нуль. tailне ділиться на h, таким чином, $1дорівнює tails. Тоді, ${1:+-}генерує a, -якщо значення не $1є null (як in tails) або нічого (як у null $1). Цей знак (або нічого) поєднується з 1.

  • (IFS=h;set $i;echo $(($#*2-3)))працює аналогічно, але використовуйте кількість частин ( $#), в які попадається рядок $i.


3

Python 2, 17 байт

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

'heads'менше 't', тому він оцінює до True == 1та друкує рядок після першого символу. 'tails'більше ніж 't', тому воно оцінює доFalse == 0 та друкується весь рядок.

Якщо ми робимо це з командного рядка, з неявним друком, воно просто стає:

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

... на 12 байт, але це додає єдині лапки до виводу.


3

QBasic, 11 байт

Це має стати найкоротшим твором QBasic, який я коли-небудь писав.

c=i>"t
?c^c

Пояснення:

Наведене вище - це дуже сильно гольф QBasic. Як тільки автоформат пройде через нього, він виглядатиме так:

c = i > "t"
PRINT c ^ c

Перший рядок порівнює рядок iз "t". Якщо iє "heads", i > "t"помилково і c = 0. Якщо iє "tails", i > "t"то правда і c = -1. так,-1 це значення за замовчуванням для boolean true у QBasic!

Другий рядок відображає -1на -1і 0з 1допомогою математичного трюку: (-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

Гая , 5 4 байти

'eI(

Подібно до відповіді Дженніса CJam , знаходить індекс eу вхідному рядку

Збережений один байт, оскільки я не розумів, що введення автоматично використовується як аргумент, якщо недостатньо значень стека

Як це працює

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

Спробуйте в Інтернеті!


3

Баш , 22

echo $[0x${1:1:1}/2-6]

Бере 2-ту букву ( eабоa ) і інтерпретує її як шістнадцяткову цифру (14 або 10), потім ділиться на 2 і віднімає 6, щоб отримати правильні відповіді.

Спробуйте в Інтернеті!


Чудовий трюк, я позичу його :)
roblogic

1
Для bash використовуйте: echo $[30#$i%7-1]всього 17 байт. :-)
Ісаак

3

ред. , 27 25 21 байт

edзавдав мені головного болю. Нарешті з’ясував це за допомогою @ed1confтвіттера та деяких поглядів unix.se. Ви не можете просто порівнювати речі s/re/newtext/, вам доведеться префіксувати їх gінакше edсумними пакетами. Це схоже на бурхливу 50-річну програму Unix, яка говорить "зійди з мого газону".

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

Спробуйте в Інтернеті!

-2 байти, скинувши кінцеві /s
-4 байти завдяки @manatwork (& чию sedвідповідь я плагіат)
Стару версію:
g/t/s//- g/\w\+/s//1 wq .


1
Але вам потрібен адресний трюк лише для 1-ї команди, оскільки 2-а ніколи не вийде з ладу. І не потрібно явно q, вона відмовиться сама, коли нічого не залишиться робити. І вам потрібен лише новий рядок після них, "." (Або "roblogic" ...) зайвий. Спробуйте в Інтернеті!
манатура

Ах, дякую, я спробую ваші пропозиції, коли повернусь додому. У пабі зараз 👍🏼
roblogic

2

Пітон, 20 байт

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

Це повертається, Falseякщо його немає, і Trueякщо воно є. В пітоніFalse і 0такі самі, і Trueі1 є.

Так:

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

2

гольфлуа 25 20 18

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

Напевно, можна було б пограти в гольф, скориставшись трюками, про які я зараз не замислююся. (див. історію для старої версії) Збережено 5 символів, перемістивши вхід до writeта ігноруючиif там заяву. Ще два символи було збережено, ігноруючи необов’язкові дужки find. Він не перевіряє невдалі умови (тобто вхід, який не є головами або хвостами) ).

Еквівалент Луа був би

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

2

Haskell, 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рішення, але він все-таки займав 23 байти, тому що edвін старий і бурхливий!
roblogic

\wі \+є розширеннями GNU.
sch




2

постійного струму , 8 байт

?z2*1r-p

dc не може нічого важливого зробити з рядками, крім того, щоб прочитати їх і намагатися оцінити їх. Роблячи це, "heads" видає попередження про нездійснені команди та порожній стек, які ми ігноруємо, але важливо, що стек залишається порожнім. "хвости" робить майже те саме, що є важливим винятком того, що остаточний "ls" завантажує значення з регістру s в стек.

Потім ми використовуємо "z" для отримання довжини стека і арифметично скрипку, щоб отримати правильні відповіді.

Спробуйте в Інтернеті!


2

Трикутний , 10 байт

F.~%.7/-_<

Спробуйте в Інтернеті!

Ділить значення ASCII символьного введення на 7. Віднімає коефіцієнт з 15. Виконання зупиняється, коли ІР закінчується з програмного простору. Це працює, тому що трикутний може керувати лише цілим поділом. Зручно, що "h" має значення 104, що становить 14, коли ціле число ділиться на 7; "t" дорівнює 116, що становить 16, коли ціле число ділиться на 7.

Недоліковані / Пояснення:

   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

-4 байти завдяки маневреній роботі


Чи може бути різниця у версії інтерпретатора TIO? Схоже, він не справляється ні з «головами», ні з «хвостами».
манатура

Тепер я виправив програму.

Чи може бути різниця у версії інтерпретатора TIO? Здається, він бере вхід неявно і повертає його при будь-якій спробі обробити неіснуючі дані, змусивши його працювати без ^.
манатура

До речі, вам не потрібно відміняти 4 символи, поки "t", оскільки 2-е "d" або "l" вже не визначить, який вхід ви отримали. Просто потрібно явно вивести, щоб можна залишити необроблений вхід у стеці: Спробуйте в Інтернеті! .
манатура

Я думаю, що я можу ще -1 байт, перейшовши на "Reg": TIO!

1

Віци , 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.