CodeGolf - Başlar veya Kuyruklar


26

Talimatlar

Bilinmeyen bir giriş dizesi Verilen iya değeriyle başları veya kuyrukları iade 1için kafaları veya -1için kuyrukları kısa kodu ile.

Örnek golf kodu değil (55b):

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

Örnek golf kodu (16b):

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


Örnek için Javascript kullanılmıştır, ancak bu bir gereklilik değildir . Üzgünüm çoğu kullanıcı için çok basitse, geliştirilebilir.


14
PPCG'ye Hoşgeldiniz! Bu ilginç bir meydan okuma olamayacak kadar basit. Gelecekte, lütfen yayınlamadan önce geri bildirim alabilecekleri Sandbox'a gönderdiğiniz zorlukları göz önünde bulundurun .
Alex A.

1
6 cevap, aslında fena bir meydan okuma değil. Tekrar deneyin
edc65

4
4 oyunda ve 5 oyunda, sorunuz gerçekten popüler değildi; Sadece karışık yorumlar var. Eldeki görev biraz temel olsa da, iyi tanımlanmış ve şu ana kadar birkaç farklı yaklaşıma sahip 7 yanıt aldı. İlk girişim için o kadar da kötü değil.
Dennis,

7
Şu anda kafam çok karışık, dün -4, şimdi +4, bu kesinlikle
Juan Cortés

10
Uzun zamandır bunun gibi kısa bir mücadeleyi bekliyorum, zorlukların çoğu benim gibi bir acemi için çok uzun ve karmaşık.
Sean Latham

Yanıtlar:


11

CJam, 4 bayt

I'e#

Değişkenin Igirişi tuttuğunu, çünkü iCJam’de geçerli bir tanımlayıcı olmadığını varsayar.

Çevrimiçi deneyin.

Bu, JavaScript koduna eşdeğerdir I.indexOf('e').


Muhtemelen bu meydan okuma için rakipsiz.
Alex A.

1
Üzgünüm gereksinimleri yeterince anlamadım ve bu soruyu kendimi kandırdım. Geri dönüp şimdi saklanacağım
Juan Cortés

Bunu neden dahil etmiyorsunuz p? CJam’da standart değil midir?
Tim

@Tim CJam, programdaki yığın içeriğini daima otomatik olarak yazdırır.
Martin Ender,

2
@Tim: Soru diyor dönmek 1 veya -1, ben iyi olurdu yığın numarasını bırakarak varsaydıkları bu yüzden. Gerekmediğini göstermek için kalıcı bağlantıyı düzenledim p.
Dennis,

17

C, 18 bayt

Oldukça kolay, ama hadi sadece eğlenmek için yapalım ...

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

Dizeye bakıldığında char *i1 headsve -1 için basar tails, sonunda yeni satır olur.

açıklama

C'de "-1" + 11 karakter ileri, bu yüzden aynıdır "1". İlk karakterlere bir göz atalım:

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

Bitleri sıfırdan başlayarak en sağdakiden sayarsak, bit 3 1 in headsve 0 tailsindir: onu "-1"doğru dize verir. Bu gibi görünüyor:

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

Şimdi, yerine i[0]ile *ive güç-iki bölümü ile sağa kaydırma bazı bayt kaydedin. Ayrıca gereksiz parantezleri kaldırın:

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

Şimdi, & 1ile ikame edilebilir % 2. Karakter sayısı aynı, ancak modül daha yüksek önceliğe sahip ve parantezleri düşürmeye izin veriyor. Boşluğu kaldırın:

"-1"+*i/8%2

Bonus

Bir tamsayı 1 veya -1 (bir dize değil) C almak için en kısa yol olduğunu düşünüyorum:

18-*i/6

Açıklama:

'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
Güzel, sevdim
Juan Cortés

11

Ruby, 8 (6 çıkış olmadan)

p ?t<=>i

Roket operatörü!


Açıkçası iş için doğru alet.
primo

9

PHP - 11 Bayt

<?=1-$i^=F;

Bu, çünkü bir tamsayı olarak yazıldığında 'tails' ^ 'F''2've 'heads' ^ 'F'→ çalışır .'.'0

Bu çözümü (veya aşağıdakilerden herhangi birini) aşağıdaki şekilde test edebilirsiniz:

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

İdeone Bağlantısı


Alternatifler

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


Kısa versiyon ile her zaman 1 alıyorum, XOR ile ne yaptığını açıklamak ister misiniz?
Juan Cortés

@ JuanCortés Bir açıklama ve Ideone'a bir bağlantı ekledim.
primo

2
Şimdi bu kutunun dışında düşünüyor!
Dennis,

6

TI-BASIC, 9-10 bayt

cos(πʳinString(Ans,"t

Basit. "t", "kuyruklar" ın 1 konumunda, ancak "t" "heads" dizesinde değil, bu nedenle inString (kuyruklar için 1, başlıklar için 0 döndürür.

Hesap makineniz radyan modundaysa (herhangi bir matematikçinin olması gerektiği gibi), yalnızca dokuz bayt alır:

cos(πinString(Ans,"t

TI hesaplayıcılarının adlandırılmış dizgelere sahip olmadığına dikkat edin, bu nedenle giriş hesap makinesinin cevap değişkenindedir. Ayrıca küçük harflerin her birinin iki bayt olduğunu unutmayın, bu nedenle bu çözüm aslında "kafalar" kelimesinden daha az bellek harcar.


Bu harika. . Sizin bayt sayısı aslında 8-9 bayt yüzden (π ve radyan sembol, hepsi tek bir bayt olan rağmen-- çünkü kapalı
MI Wright

1
tVe inString(her iki bayt.
lirtosiast

Oh, küçük harflerin iki bayt olduğunu unutmuşum. Boş ver, öyleyse.
MI Wright,

5

Fisyon , 26 21 Bayt

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

Martin (ve onun mükemmel cevabı burada ) hızlı bir golf daha yeni bir dil ve ne daha iyi bir yer edinmek için beni ikna? Bu neredeyse kesinlikle en uygun değil, ama hey, eğlenceliydi! Kendimi iyi hissettiğimde istenirse bir tür açıklama yapabilirim.



4

Pyth - 4 bayt


 xz"e

Kafaları veya kuyrukları ile çalıştırın . Olarak iolduğu intPyth, bu kullanımlarda z, her kullanıcı girdisini içeren değişken adı olarak. Python'a eşdeğerdir print(z.find("e")), bu nedenle @ Dennis'in yöntemini kullanır.


4

VBA (Excel), 12 bayt

Harika bir golf sahası değil, ama VBA ile uygun bir programlama diline yaklaşmak için denemek eğlenceli ...

?13-asc(i)/6

i, dizgedir ve ilk karakterin ASCII değerini kullanır, 6'ya bölünür ve 13'ten 1'e veya 1'e -1 vermek üzere çıkarılır. Çok basit.

Hemen pencerede çalışan örnek (giriş değişkenini ayarlamak için 10 bayt):

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

4

C, 22 bayt

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

Krediler bana bundan bahsettiği için @ TheE'ye gidiyor !

Açıklama:

Dizenin ilk karakteri büyükse 'h', dizge "-1"yazdırılır. Aksi takdirde, dize "1"yazdırılır. Bu yaklaşımın izleyen bir yeni satır karakteri ile geldiğini unutmayın.


Eski versiyon (25 bayt):

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

Açıklama:

Dizenin ilk karakteri daha büyükse 'h', -1 basılır. Aksi takdirde, 1 yazdırılır.


** i / 16 - (1 -) i sadece T önce, gerçek tanım, bu dönüş gibi 1byte ile aşacaktır türü char olarak kullanılması ile bahsedilen
Abr001am

@ Agawa001, Ama bu 6 için hve 7 için döndürür t.
Spikatrix

oh unuttum, güç kullanmalıyım: p
Abr001am

Cool adam ne yazık ki C böyle bir aritmetik işlem yapmaz, bu nedenle -1 * pow (-1, * i / 16) kullanmak zorunda kalırsınız, bu da daha uzun süre
bekletir

1
@CoolGuy kullanmak puts(*i>'h'?"-1":"1");daha iyi olmaz mıydı? (22 bayt)
euanjt

4

Tr: 17 13 karakter

(Ya da sadece argümanları sayarsanız 14 10…)

tr -s ta-s -1

Örnek çalışma:

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

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

Kısa açıklama:

tr transliterat anlamına gelir, yani, ilk argümanda bulunan girişin her karakterini ikinci argümanda aynı konumdaki karakterle değiştirir:

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

İlk bağımsız değişken daha uzunsa, ikinci bağımsız değişkende konum eşleşmeyen karakterler ikinci bağımsız değişkenin son karakteriyle değiştirilir:

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

Ne zaman -s( --squeeze-repeats) seçeneği kullanılır, aynı karakterle konacak ardışık karakterleri bir kerede değiştirilir:

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

Bu yüzden, tüm karakterleri "kuyruklarda" sıralarsak, ihtiyacımız olanı elde ederiz:

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

“Kafalar” için de aynıdır, ancak eksi (eksi olarak alfabetik olarak sıralanan karakterler) tüketmek için “t” yi önünde tutması gerekir:

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

“Yazıların” ve “kafaların” tüm benzersiz karakterlerini tek bir ilk argümanla birleştirmek, önünde “t” yi tutmak son çözüme yol açar:

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

Karakterleri, bir aralık numaralandırma önlemek için gelen - için formatında yerine kullanılabilir.


Açıklamak ister misin?
Juan Cortés

BSD / GNU’yu varsayar tr. POSIXly:tr -s ta-s '-[1*]'
sch

4

8088 derleme, IBM PC DOS, 17 bayt

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

unassembled:

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

Açıklama:

İlk karakterin bir çift ​​sayısının (çift sayısının ) veya bir (çift sayısının ) 'h'olup olmadığını belirlemek için CPU'nun parite bayrağını kullanın . Bu, ASCII'deki karakteri karşılaştırarak bir bayttan tasarruf sağlar.1't'1

Komut satırından giriş, konsola çıkış.

Giriş çıkış:

enter image description here



4

Kabuk (taşınabilir / POSIX), 16 bayt

expr $i : he - 1

Çevrimiçi Deneyin!
Sayesinde @ StéphaneChazelas içinde unix.stackexchange.com

Denenen diğer çözümler:
echo $[30#$i%7-1] # 17 bytes but only in bash, zsh. Çevrimiçi Deneyin!
echo $((30#$i%7-1)) # 19 bytes but only bash,ksh,zsh. Çevrimiçi Deneyin!
he=2;echo $[${i%a*}-1] # 22 bytes But only in bash,zsh . Çevrimiçi Deneyin!
a=${i%h*};echo ${a:+-}1 # 23 . taşınabilir . Çevrimiçi Deneyin!
he=2;echo $((${i%a*}-1)) # 24 bytes . taşınabilir . Çevrimiçi Deneyin!
IFS=h;set $i;echo ${1:+-}1 # 26 (change IFS) . taşınabilir . Çevrimiçi Deneyin!
(IFS=h;set $i;echo ${1:+-}1) # 28 (subshell) . taşınabilir . Çevrimiçi Deneyin!
(IFS=h;set $i;echo $(($#*2-3))) # 31 bytes . taşınabilir . Çevrimiçi Deneyin!

Not: dashPortatif bir kabuk test cihazının makul bir benzetimi olarak kullanılması .

  • expr $i : he - 1Birçok karakter eşleşmesi nasıl sayımı ile çalışır heile $i : he. Bir headsmaç 2ve tailsmaç 0 (yok) .Sonra substracting 1ile - 1.

  • $[30#$i%7-1]dizeyi bir tamsayıya dönüştürerek çalışır. Baz 30 ve mod 7'ye, headsve arasında 2'lik bir fark elde etmek üzere seçildi tails. Sonra 1 çıkarma, sayıları 1ve 'ye dönüştürür -1.
    Bir unutmayın $[...]aritmetik ifade arkaik bir formudur $((...))sadece bazı kabukları içinde geçerlidir.

  • he=2;echo $[${i%a*}-1]Bir değerin değişkenini yaparak ve ardından bu değişkeni genişletmek için Aritmetik Genişletme kullanarak çalışır (metin değerinden). ${i%a*}Dönüştürür headsiçin heve tailsiçin t(diğer bir deyişle, bir değişken olarak, 0 arasında bir değere sahiptir).

  • IFS=h;set $i;echo ${1:+-}1iki adımda çalışır. IFS Ayar hsonları tırnaksız $iiçinde set $ikarakterin bölü bölüme h, headsiçin ayrılmıştır ''ve 'eads'böylece ayar, $1null. tailbölünmez h, dolayısıyla $1eşitlenir tails. Daha sonra, ${1:+-}bir oluşturur -değeri ise $1(deki gibi boş olmayan tails(null ile olduğu gibi) ya da başka bir şey $1). Bu işaret (ya da hiçbir şey) ile birleştirilmiştir 1.

  • (IFS=h;set $i;echo $(($#*2-3)))benzer şekilde çalışır ancak $#dizenin $iiçine girdiği parçaların sayısını ( ) kullanın .


3

Python 2,17 bayt

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

'heads'daha küçük olduğundan 't', True == 1ilk karakterden sonra dizeyi değerlendirir ve yazdırır. 'tails'büyüktür 't', dolayısıyla değerlendirir False == 0ve dizenin tamamı yazdırılır.

Bunu komut satırından yapıyorsak, örtük baskı ile, sadece olur:

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

... 12 bayt için, ancak çıktıya tek tırnak ekler.


3

QBasic, 11 bayt

Bu şimdiye kadar yazdığım en kısa QBasic parçası olmalı.

c=i>"t
?c^c

Açıklama:

Yukarıdaki bazı oldukça ağır golf QBasic. Otomatik biçimlendirici bir kez geçince, şöyle görünecek:

c = i > "t"
PRINT c ^ c

İlk satır, dizeyi iile karşılaştırır "t". Eğer ibir "heads", i > "t"sahte ve c = 0. Eğer ibir "tails",i > "t" doğrudur ve c = -1. Evet, -1QBasic'te true olan boolean için varsayılan değer!

İkinci satır eşler -1için -1ve 0hiç 1bir matematik hilesi yoluyla: (-1)^(-1) == 1/(-1) == -1ve0^0 , döner olsa teknik olarak matematiksel olarak tanımlanmamış 1.

Bu kod iaçıkça bir dize değişkeni olarak bildirilmesini gerektirir ; Aksi takdirde, olması gerekirdi i$. Tam test programı ( QB64'te test edilmiştir ):

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 bayt

'eI(

Dennis'in CJam cevabına benzer şekilde e, giriş dizesindeki indeksini bulur.

Girişin, yeterli yığın değeri yoksa otomatik olarak argüman olarak kullanıldığını farketmediğimden bir bayt kaydedildi

Nasıl çalışır

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

Çevrimiçi Deneyin!


3

Bash , 22

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

2. harfi alır ( eveya a) ve altıgen rakam (14 veya 10) olarak yorumlar, sonra 2'ye bölün ve doğru cevapları almak için 6'yı çıkarır.

Çevrimiçi deneyin!


Müthiş hile, ödünç
alacağım

1
Bash için, kullanın: echo $[30#$i%7-1]sadece 17 bayt. :-)
Isaac

3

ed , 27 25 21 bayt

edbana bir baş ağrısı verdi. Sonunda @ed1conftwitter ve bazı dikizlemelerin yardımı ile çözdü unix.se. Bir şeyleri eşleştiremezsiniz s/re/newtext/, gaksi halde edüzücü bir paketle öneklemelisiniz. "Çimenimden çık" diyen, 50 yıllık huysuz bir unix programı gibi.

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

Çevrimiçi deneyin!

-2 nihai bırakarak bayt /s
-4 (kimin & @manatwork sayesinde bayt sedcevabı i aşırma)
Eski sürümü:
g/t/s//- g/\w\+/s//1 wq .


1
Fakat 2. numara asla başarısız olmayacağından, sadece 1. komut için adres numarasına ihtiyacınız vardır. Ve açıkça q, hiçbir şey yapamayacağınız zaman, kendiliğinden istifa edecek. Ve sadece onlardan sonra yeni bir satıra ihtiyacınız var, “.” (Veya “roblogic”…) gereksizdir. Çevrimiçi deneyin!
Manatwork

Ahh teşekkürler, eve geldiğimde önerilerinizi deneyeceğim. Barda şimdi 👍🏼
roblogic

2

Python, 20 bayt

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

Bu Falsedeğilse ve Truedeğilse döner . Python'da Falseve 0aynıdır ve Trueve 1de bulunmaktadır.

Yani:

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)

Muhtemelen şu an düşünmediğim bazı püf noktaları kullanarak biraz daha golf oynayabiliriz. ( eski sürüm için geçmişe bakınız ) Girdiyi taşıyarak writeve iforadaki ifadeyi yok sayarak 5 karakter kurtardı . İsteğe bağlı parantez yok sayılarak iki karakter daha kaydedildi find. Bu, yani başarısız koşullara (için değil girişi kontrol etmez kafaları veya kuyrukları ).

Bir Lua eşdeğeri olacaktır

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

2

Haskell, 18 bayt

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

Harfle başlayan her dize diğerlerine heşlenir .1-1


2

Sed: 16 karakter

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

Örnek çalışma:

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

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

Güzel, regex'ini edçözümüm için kullandım , ama hala 23 bayt aldı, çünkü edyaşlı ve huysuz!
roblogic

\wve \+GNU uzantıları olsa.
sch




2

dc , 8 bayt

?z2*1r-p

dc, bunları okumaktan başka dizelerle anlamlı bir şey yapamaz ve değerlendirmeyi denemez. Bunu yaparak, "kafalar" uygulanmayan komutlar ve boş yığılmış, boşverdiğimiz bazı uyarılar çıkarır, ancak önemli olarak yığın boş kalır. "kuyruklar", son "ls" nin s yazmacından yığına bir değer yüklediği önemli istisna dışında neredeyse aynı şey yapar.

Daha sonra yığın uzunluğunu elde etmek için "z" yi kullanırız ve doğru cevapları bulmak için aritmetik olarak harcıyoruz.

Çevrimiçi deneyin!


2

Üçgen , 10 bayt

F.~%.7/-_<

Çevrimiçi deneyin!

Bir karakter girişinin ASCII değerini 7'ye böler. Bölmeyi 15'ten çıkarır. IP program alanının dışında kaldığında yürütme durur. Bu işe yarıyor, çünkü Üçgen yalnızca tamsayıyı yönetebiliyor. Uygun olarak, "h", tamsayı 7'ye bölündüğünde 14 olan 104 değerine sahiptir; "t", tamsayı 7'ye bölündüğünde 16 olan 116'dır.

Ungolfed / Açıklama:

   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

Önceki sürüm (14 bayt):

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

Girişten bir karakter okuyun; Bu karakterin ASCII değeri 8'e bölünmüşse, kalanı varsa, -1 yazılır, aksi takdirde 1 yazılır.


2

Fıçı ,8 12 8 bayt

_d=2*1-.

Çevrimiçi deneyin!

Açıklama (sözdizimsel olarak geçersiz)

_        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 sayesinde -4 bayt


Bazı TIO tercüman sürüm farkı olabilir mi? Görünüşe göre "kafaları" ya da "kuyrukları" işlemiyor.
Manat çalışması

Şimdi programı düzelttim.
Bir

Bazı TIO tercüman sürüm farkı olabilir mi? Girdiyi dolaylı olarak alır ve var olmayan verileri işleme girişimi yapmaksızın tersine çevirir ^.
Manat çalışması

BTW, “d” veya “l” ifadesi hangi girişi aldığınızı belirleyene kadar “t” ye kadar 4 karakteri atmanıza gerek yoktur. Sadece açıkça çıktı vermeniz gerekir, böylece işlenmemiş girdiyi yığında bırakabilir: Çevrimiçi deneyin! .
Manat çalışması

Sanırım hala "Reg" e geçerek -1 bayt olabilir: TIO!
Bir

1

Vitsy , 13 bayt

Ne yani, partiye geç kaldım. ¯ \ _ (ツ) _ / ¯

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.