CodeGolf - Kepala atau Ekor


26

Instruksi

Mengingat string input yang tidak diketahui idengan nilai baik kepala atau ekor , kembali 1untuk kepala atau -1untuk ekor dengan kode terpendek.

Contoh bukan kode golf (55b):

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

Contoh kode golf (16b):

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


Javascript digunakan untuk contoh tetapi itu bukan keharusan . Maaf jika terlalu sederhana untuk sebagian besar pengguna, ini dapat ditingkatkan.


14
Selamat datang di PPCG! Ini terlalu sederhana untuk menjadi tantangan yang menarik. Di masa mendatang, harap pertimbangkan untuk mengirimkan tantangan ke Sandbox , tempat mereka bisa mendapatkan umpan balik sebelum mempostingnya secara langsung.
Alex A.

1
6 jawaban, memang bukan tantangan yang buruk. Coba lagi
edc65

4
Pada 4 upvotes dan 5 downvotes, pertanyaan Anda tidak terlalu populer; baru saja mendapat ulasan beragam. Sementara tugas yang ada sedikit mendasar, tugas ini didefinisikan dengan baik dan menarik 7 jawaban sejauh ini yang menampilkan beberapa pendekatan berbeda. Tidak terlalu buruk untuk upaya pertama.
Dennis

7
Saya sangat bingung sekarang, kemarin -4, sekarang +4, ini pasti bukan stackoverflow: P
Juan Cortés

10
Saya sudah menunggu tantangan singkat seperti ini selama berabad-abad, sebagian besar tantangan terlalu panjang dan rumit untuk pemula seperti saya.
Sean Latham

Jawaban:


11

CJam, 4 byte

I'e#

Diasumsikan bahwa variabel Imenyimpan input, karena ibukan pengidentifikasi yang valid di CJam.

Cobalah online.

Ini setara dengan kode JavaScript I.indexOf('e').


Mungkin tidak terkalahkan untuk tantangan ini.
Alex A.

1
Maaf saya tidak cukup memahami persyaratan dan mempermalukan diri sendiri dengan pertanyaan ini. Saya akan kembali dan bersembunyi sekarang
Juan Cortés

Mengapa Anda tidak memasukkannya ke pdalam ini? Apakah standar di CJam tidak?
Tim

@Tim CJam selalu mencetak isi tumpukan di program secara otomatis.
Martin Ender

2
@ Tim: Pertanyaannya mengatakan untuk mengembalikan 1 atau -1, jadi saya berasumsi meninggalkan nomor di tumpukan akan baik-baik saja. Saya telah mengedit permalink untuk menunjukkan bahwa ptidak diperlukan.
Dennis

17

C, 18 byte

Cukup mudah, tapi mari kita lakukan hanya untuk bersenang-senang ...

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

Mengingat string char *iyang dicetaknya 1 untuk headsdan -1 untuk tails, dengan mengekor baris baru.

Penjelasan

Di C, "-1" + 1arahkan ke 1 karakter ke depan, jadi itu sama dengan "1". Mari kita lihat karakter pertama:

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

Jika kita menghitung bit dari yang paling kanan mulai dari nol, bit 3 adalah 1 in headsdan 0 in tails: menjumlahkannya untuk "-1"memberikan string yang tepat. Ini terlihat seperti ini:

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

Sekarang, gantikan i[0]dengan *idan pergeseran kanan dengan kekuatan dua divisi untuk menghemat beberapa byte. Juga hapus tanda kurung yang tidak berguna:

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

Sekarang, & 1bisa diganti dengan % 2. Hitungan karakter sama, tetapi modulus memiliki prioritas lebih tinggi, memungkinkan untuk menjatuhkan tanda kurung. Hapus spasi putih:

"-1"+*i/8%2

Bonus

Saya pikir cara terpendek untuk mendapatkan integer 1 atau -1 (bukan string) di C adalah:

18-*i/6

Penjelasan:

'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
Cantik, cinta itu
Juan Cortés

11

Ruby, 8 (6 tanpa output)

p ?t<=>i

Operator Rocketship!


Jelas alat yang tepat untuk pekerjaan itu.
Primo

9

PHP - 11 Bytes

<?=1-$i^=F;

Ini berfungsi karena 'tails' ^ 'F''2'dan 'heads' ^ 'F''.', yang ketika diketik sebagai integer 0.

Anda dapat menguji solusi ini (atau salah satu di bawah ini) dengan cara berikut:

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

Tautan Ideone


Alternatif

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


Dengan versi singkatnya, saya selalu mendapat angka 1, mau menjelaskan apa fungsinya dengan XOR?
Juan Cortés

@ JuanCortés Saya telah menambahkan penjelasan, dan tautan ke Ideone.
Primo

2
Nah, itu berpikir di luar kotak!
Dennis

6

TI-BASIC, 9-10 byte

cos(πʳinString(Ans,"t

Mudah. "t" ada di posisi 1 dari "tails", tetapi "t" tidak ada dalam string "head", jadi inString (mengembalikan 1 untuk tails dan 0 untuk head.

Jika kalkulator Anda dalam mode radian (seperti yang seharusnya dilakukan oleh seorang ahli matematika), hanya dibutuhkan sembilan byte:

cos(πinString(Ans,"t

Perhatikan bahwa kalkulator TI tidak memiliki nama string, sehingga inputnya ada dalam variabel jawaban kalkulator. Juga perhatikan bahwa huruf kecil masing-masing dua byte, jadi solusi ini sebenarnya membutuhkan lebih sedikit memori daripada kata "kepala".


Ini luar biasa. Hitungan byte Anda tidak aktif, karena-- cos (, π dan simbol radian semuanya satu byte, jadi sebenarnya 8-9 byte.
MI Wright

1
The tdan inString(masing-masing dua byte.
lirtosiast

Oh, saya lupa tentang huruf kecil menjadi dua byte. Lupakan saja.
MI Wright

5

Fission , 26 21 Bytes

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

Martin (dan jawabannya yang luar biasa di sini ) meyakinkan saya untuk belajar bahasa baru, dan tempat apa yang lebih baik daripada golf cepat? Ini hampir pasti tidak optimal, tapi hei, itu menyenangkan! Setelah saya merasa baik tentang itu, saya dapat memberikan beberapa bentuk penjelasan jika diminta.



4

Pyth - 4 byte


 xz"e

Jalankan dengan kepala atau ekor . Seperti iyang intdi Pyth, menggunakan ini zsebagai nama variabel, yang berisi setiap input pengguna. Ini sama dengan Python print(z.find("e")), jadi gunakan metode @ Dennis.


4

VBA (Excel), 12 byte

Bukan golf yang fantastis, tapi menyenangkan untuk mencoba dengan VBA untuk mendekati bahasa pemrograman yang tepat ...

?13-asc(i)/6

i adalah string, dan itu hanya mengeksploitasi nilai ASCII dari karakter pertama, dibagi 6 dan dikurangi dari 13 untuk memberikan 1 atau -1. Sangat sederhana.

Contoh dijalankan di jendela langsung (10 byte tambahan untuk mengatur variabel input):

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

4

C, 22 byte

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

Kredit pergi ke @TheE karena memberitahuku tentang ini !

Penjelasan:

Jika karakter pertama dari string lebih besar daripada 'h', string "-1"dicetak. Jika tidak, string "1"akan dicetak. Perhatikan bahwa pendekatan ini dilengkapi dengan karakter baris baru.


Versi lama (25 byte):

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

Penjelasan:

Jika karakter pertama dari string lebih besar dari 'h', -1 dicetak. Kalau tidak, 1 dicetak.


saya hanya mengatakan t sebelumnya, gunakan saya sebagai tipe char, definisi sebenarnya akan melebihi 1byte seperti pengembalian ini - (- 1) ** i / 16
Abr001am

@ Agawa001, Tapi itu mengembalikan 6 untuk hdan 7 untuk t.
Spikatrix

oh saya lupa, saya harus menggunakan kekuatan: p
Abr001am

Cool guy sayangnya C tidak memiliki operasi aritmatika sehingga Anda harus menggunakan -1 * pow (-1, * i / 16) yang membuatnya lebih lama, di sisi lain, penggunaan python dan matlab ** dan ^
Abr001am

1
@ CoolGuy akan menggunakan menempatkan puts(*i>'h'?"-1":"1");tidak lebih baik? (22 byte)
euanjt

4

Tr: 17 13 karakter

(Atau 14 10 jika Anda hanya menghitung argumen ...)

tr -s ta-s -1

Contoh dijalankan:

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

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

Penjelasan singkat:

tr singkatan transliterate, yang berarti, menggantikan setiap karakter dari input yang ditemukan dalam argumen pertama dengan karakter pada posisi yang sama dalam argumen kedua:

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

Jika argumen pertama lebih panjang, karakter tanpa kecocokan posisional dalam argumen kedua diganti dengan karakter terakhir argumen kedua:

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

Ketika opsi -s( --squeeze-repeats) digunakan, karakter berturut-turut yang akan diganti dengan karakter yang sama diganti sekaligus:

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

Jadi jika kita menghitung semua karakter dalam "ekor", kita mendapatkan apa yang kita butuhkan:

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

Sama untuk "kepala", tetapi kita harus menjaga "t" di depan untuk mengkonsumsi minus (karakter diurutkan menurut abjad untuk creepiness):

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

Menggabungkan semua karakter unik "ekor" dan "kepala" dalam satu argumen pertama, menjaga "t" di depan mengarah ke solusi akhir:

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

Untuk menghindari penghitungan karakter, interval dalam format dari - ke dapat digunakan sebagai gantinya.


Mau jelaskan itu?
Juan Cortés

Itu mengasumsikan BSD / GNU tr. POSIXly:tr -s ta-s '-[1*]'
sch

4

Perakitan 8088, IBM PC DOS, 17 byte

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

Belum dirakit:

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

Penjelasan:

Gunakan flag parity CPU untuk menentukan apakah karakter pertama adalah 'h'(bahkan jumlah biner 1) atau 't'(jumlah ganjil dari biner 1). Ini menghemat satu byte dibandingkan membandingkan char di ASCII.

Input dari baris perintah, output ke konsol.

Input output:

masukkan deskripsi gambar di sini



4

shell (portable / POSIX), 16 byte

expr $i : he - 1

Cobalah secara Online!
Terima kasih kepada @ StéphaneChazelas di unix.stackexchange.com

Solusi lain mencoba:
echo $[30#$i%7-1] # 17 bytes but only in bash, zsh. Coba Online!
echo $((30#$i%7-1)) # 19 bytes but only bash,ksh,zsh. Cobalah secara Online!
he=2;echo $[${i%a*}-1] # 22 bytes But only in bash,zsh . Cobalah secara Online!
a=${i%h*};echo ${a:+-}1 # 23 . portabel. Cobalah secara Online!
he=2;echo $((${i%a*}-1)) # 24 bytes . portabel. Cobalah secara Online!
IFS=h;set $i;echo ${1:+-}1 # 26 (change IFS) . portabel. Cobalah secara Online!
(IFS=h;set $i;echo ${1:+-}1) # 28 (subshell) . portabel. Cobalah secara Online!
(IFS=h;set $i;echo $(($#*2-3))) # 31 bytes . portabel. Cobalah secara Online!

Catatan: Menggunakan dashsebagai perumpamaan wajar dari shell tester portabel.

  • expr $i : he - 1berfungsi dengan menghitung jumlah karakter yang cocok hedengan $i : he. A headsmatch 2and a tailsmatch 0 (tidak ada). Lalu kurangi1 dengan - 1.

  • $[30#$i%7-1]bekerja dengan mengonversi string ke integer. Basis 30 dan mod oleh 7 dipilih untuk mendapatkan perbedaan 2 antara headsdan tails. Kemudian kurangi 1 mengkonversi angka menjadi 1dan -1.
    Perhatikan bahwa a$[...] adalah bentuk kuno dari ekspresi aritmatika yang $((...))hanya valid di beberapa shell.

  • he=2;echo $[${i%a*}-1]bekerja dengan membuat variabel dari beberapa nilai dan kemudian menggunakan Ekspansi Aritmatika untuk memperluas variabel itu (dari nilai teks). The ${i%a*}bertobat headsuntuk hedan tailsuntuk t(yang, sebagai variabel, memiliki nilai 0).

  • IFS=h;set $i;echo ${1:+-}1bekerja dalam dua langkah. Pengaturan IFS untuk histirahat yang kuotasi $idi set $idalam bagian-bagian dibagi dengan karakter h, headsdibagi untuk ''dan 'eads', dengan demikian pengaturan $1untuk null. tailtidak dibagi dengan h, sehingga $1sama dengan tails. Kemudian, ${1:+-}menghasilkan a -jika nilai $1non-null (seperti dalam tails) atau tidak sama sekali (seperti dengan nol $1). Tanda itu (atau tidak sama sekali) digabungkan dengan 1.

  • (IFS=h;set $i;echo $(($#*2-3)))bekerja dengan cara yang serupa tetapi menggunakan jumlah bagian ( $#) yang $idipecah oleh string .


3

Python 2, 17 byte

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

'heads'kurang dari 't', jadi ini mengevaluasi ke True == 1, dan mencetak string setelah karakter pertama. 'tails'lebih besar dari 't', jadi dievaluasi menjadiFalse == 0 dan seluruh string dicetak.

Jika kita melakukan ini dari baris perintah, dengan pencetakan implisit, itu hanya menjadi:

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

... untuk 12 byte, tetapi ia menambahkan tanda kutip tunggal ke output.


3

QBasic, 11 byte

Ini harus menjadi bagian terpendek dari QBasic yang pernah saya tulis.

c=i>"t
?c^c

Penjelasan:

Di atas adalah beberapa QBasic cukup golf. Setelah autoformatter menyelesaikannya, akan terlihat seperti ini:

c = i > "t"
PRINT c ^ c

Baris pertama membandingkan string idengan "t". Jika iis "heads", i > "t"false dan c = 0. Jika ibenar "tails", i > "t"itu benar dan c = -1. Ya, -1apakah nilai default untuk boolean benar dalam QBasic!

Baris kedua peta -1untuk -1dan 0untuk 1melalui trik matematika: (-1)^(-1) == 1/(-1) == -1, dan 0^0, meskipun secara teknis matematis terdefinisi, pengembalian 1.

Kode ini mengharuskan yang idinyatakan secara eksplisit sebagai variabel string; jika tidak, itu harus terjadi i$. Program uji penuh (diuji pada 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 byte

'eI(

Mirip dengan jawaban Dennis 'CJam , menemukan indeks edalam string input

Disimpan satu byte karena saya tidak menyadari input secara otomatis digunakan sebagai argumen jika tidak ada nilai stack yang cukup

Bagaimana itu bekerja

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

Cobalah secara Online!


3

Bash , 22

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

Mengambil huruf ke-2 ( eatau a) dan menafsirkannya sebagai digit hex (14 atau 10), kemudian bagi dengan 2 dan kurangi 6 untuk mendapatkan jawaban yang benar.

Cobalah online!


Trik yang luar biasa, aku akan meminjamnya :)
roblogic

1
Untuk bash, gunakan: echo $[30#$i%7-1]hanya 17 byte. :-)
Isaac

3

ed , 27 25 21 byte

edmemberi saya sakit kepala. Akhirnya menemukan jawabannya dengan bantuan dari @ed1confdi twitter dan beberapa mengintip unix.se. Anda tidak bisa hanya mencocokkan hal-hal dengan s/re/newtext/, Anda harus awalan dengan paket gjika tidak edsedih. Ini seperti program unix 50 tahun pemarah yang mengatakan "turun dari halaman saya".

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

Cobalah online!

-2 bytes dengan menjatuhkan final /s
-4 bytes berkat @manatwork (& yang sedjawabannya dijiplak)
Versi lama:
g/t/s//- g/\w\+/s//1 wq .


1
Tetapi Anda memerlukan trik alamat hanya untuk perintah 1, karena ke-2 tidak akan pernah gagal. Dan tidak perlu secara eksplisit q, itu akan berhenti dengan sendirinya ketika tidak ada yang tersisa untuk dilakukan. Dan Anda hanya perlu baris baru setelah mereka, "." (Atau "roblogic" ...) tidak perlu. Cobalah online!
manatwork

Ahh terima kasih saya akan mencoba saran Anda ketika saya pulang. Di pub sekarang 👍🏼
roblogic

2

Python, 20 byte

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

Ini akan kembali Falsejika tidak, dan Truejika ya. Dalam python Falsedan 0sama, dan Truedan1 juga.

Begitu:

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)

Mungkin bisa bermain golf lagi dengan menggunakan beberapa trik yang saya tidak pikirkan saat ini. (lihat riwayat untuk versi lama) Menyimpan 5 karakter dengan memindahkan input ke writedan mengabaikan ifpernyataan di sana. Dua karakter lagi disimpan dengan mengabaikan tanda kurung opsional aktif find. Itu tidak memeriksa kondisi gagal (yaitu, input yang bukan kepala atau ekor ).

Setara Lua akan

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

2

Haskell, 18 byte

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

Setiap string yang dimulai dengan surat hdipetakan ke 1, semua yang lain -1.


2

Sed: 16 karakter

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

Contoh dijalankan:

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

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

Bagus, saya menggunakan regex Anda untuk edsolusi saya , tetapi masih butuh 23 byte, karena edsudah tua dan pemarah!
roblogic

\wdan \+merupakan ekstensi GNU.
sch




2

dc , 8 byte

?z2*1r-p

dc tidak dapat melakukan sesuatu yang bermakna dengan string selain membacanya dan berusaha untuk mengevaluasinya. Melakukan ini, "kepala" menampilkan beberapa peringatan tentang perintah yang tidak dilaksanakan dan tumpukan kosong, yang kita abaikan, tetapi yang penting tumpukan tetap kosong. "tails" melakukan hampir sama dengan pengecualian penting bahwa "ls" terakhir memuat nilai dari register s ke stack.

Kami kemudian menggunakan "z" untuk mendapatkan panjang tumpukan dan biola secara acak untuk mendapatkan jawaban yang benar.

Cobalah online!


2

Segitiga , 10 byte

F.~%.7/-_<

Cobalah online!

Membagi nilai ASCII dari input karakter oleh 7. Kurangi hasil bagi dari 15. Eksekusi berhenti ketika IP kehabisan ruang program. Ini berfungsi karena Triangular hanya dapat mengelola divisi integer. Mudahnya, "h" memiliki nilai 104, yaitu 14 ketika integer dibagi dengan 7; "t" adalah 116, yaitu 16 ketika integer dibagi dengan 7.

Tidak Disatukan / Penjelasan:

   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

Versi sebelumnya (14 byte):

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

Baca karakter dari input; jika nilai ASCII karakter yang dibagi 8 memiliki sisa, cetak -1, jika tidak cetak 1.


2

Tong ,8 12 8 byte

_d=2*1-.

Cobalah online!

Penjelasan (tidak valid secara sintaksis)

_        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 byte berkat manatwork


Bolehkah ada beberapa perbedaan versi TIO interpreter? Sepertinya itu tidak menangani "kepala" atau "ekor".
manatwork

Sekarang saya memperbaiki program.
Sebuah

Bolehkah ada beberapa perbedaan versi TIO interpreter? Tampaknya memerlukan input secara implisit dan membalikkannya pada setiap upaya untuk memproses data yang tidak ada, membuatnya bekerja tanpa ^.
manatwork

BTW, Anda tidak perlu membuang 4 karakter sampai "t" sebagai yang ke-2 "d" atau "l" sudah mengidentifikasi input mana yang Anda dapatkan. Hanya perlu output secara eksplisit sehingga dapat meninggalkan input yang tidak diproses pada stack: Coba online! .
manatwork

Saya pikir saya masih dapat -1 byte dengan beralih ke "Reg": TIO!
A

1

Vitsy , 13 byte

Jadi apa, saya terlambat ke pesta. ¯ \ _ (ツ) _ / ¯

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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.