CodeGolf-頭または尾


26

説明書

未知の入力文字列を考えるとiいずれかの値を持つ、復帰1のためのヘッドまたは-1のための最短のコードとを。

ゴルフされていないコード(55b)のサンプル:

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

サンプルのゴルフコード(16b):

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


この例ではJavascriptが使用されましたが、これは要件ではありません。ほとんどのユーザーにとって単純すぎる場合は申し訳ありませんが、改善できます。


14
PPCGへようこそ!これは単純すぎて、興味深い課題にはなりません。将来、チャレンジをSandboxに投稿することを検討してください。チャレンジをライブで投稿する前にフィードバックを得ることができます。
アレックスA.

1
答えは6つで、それほど悪い挑戦ではありません。再試行
-edc65

4
4回のアップ投票と5回のダウン投票で、あなたの質問はあまり人気がありませんでした。レビューがまちまちだった。手元のタスクは少し基本的ですが、明確に定義されており、これまでにいくつかの異なるアプローチを特徴とする7つの回答を集めました。最初の試みとしてそれほど悪くはありません。
デニス

7
昨日は-4、今は+4、今はとても混乱しています。これは確かにスタックオーバーフローではありません:P
フアン・コルテス

10
私は長年にわたってこのような短い挑戦を待っていました。ほとんどの挑戦は私のような初心者にとって長すぎて複雑です。
ショーンレイサム

回答:


11

CJam、4バイト

I'e#

CJamの有効な識別子ではないIため、変数が入力を保持しているiと仮定します。

オンラインでお試しください。

これはJavaScriptコードと同等ですI.indexOf('e')


おそらく、この挑戦​​に対して無敵です。
アレックスA.

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" + 11文字先を指すため、と同じ"1"です。最初の文字を見てみましょう:

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

ゼロから始まる右端のビットをカウントすると、ビット3は1 in headsと0 in になり、tails合計して"-1"正しい文字列が得られます。次のようになります。

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

さて、代替i[0]*iし、いくつかのバイトを保存するために2のべき乗の部門と右シフト。無駄な括弧も削除します。

"-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
美しい、それを愛する
フアンコルテス

11

Ruby、8(出力なしの6)

p ?t<=>i

ロケット船オペレーター!


仕事に最適なツールであることは明らかです。
プリモ

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で何を行うのかを説明してください
フアンコルテス

@JuanCortés説明とIdeoneへのリンクを追加しました。
プリモ

2
今、それは箱の外で考えています!
デニス

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ライト

1
tそしてinString(、各2バイトです。
リルトシアスト

ああ、小文字が2バイトであることを忘れていました。じゃあ心配しないで。
MIライト

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 hと7を返しますt
Spikatrix

ああ忘れてしまった、私は力を使用する必要があります:p
Abr001am

男クール残念ながらCは、このようにuは(-1 * I / 16)-1を使用する*捕虜を持っている**一方、PythonとMATLABを使用して、それはwaaay長くなり、^そのような演算を持っているdoesntの
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 は、文字変換を表します。つまり、最初の引数で見つかった入力の各文字を、2番目の引数で同じ位置にある文字で置き換えます。

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

最初の引数が長い場合、2番目の引数に位置が一致しない文字は、2番目の引数の最後の文字に置き換えられます。

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

文字の列挙を回避するには、代わりにfrom - to formatの間隔を使用できます。


それを説明する気?
フアンコルテス

これは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のcharと比較して1バイト節約できます。

コマンドラインからの入力、コンソールへの出力。

入出力:

ここに画像の説明を入力してください



4

シェル(ポータブル/ POSIX)、16バイト

expr $i : he - 1

オンラインでお試しください!
おかげで@のStéphaneChazelasunix.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マッチ2tails一致0(なし).Thenのsubstracting1有します- 1

  • $[30#$i%7-1]文字列を整数に変換することで機能します。7によってベース30とMODは、間に2の差を得るために選択されたheadstails。次に、1を引く1と、数値がとに変換され-1ます。
    ことに注意してください$[...]は、$((...))一部のシェルでのみ有効な算術式の古風な形式である。

  • he=2;echo $[${i%a*}-1]ある値の変数を作成し、算術展開を使用してその変数を(テキスト値から)展開します。to とto の${i%a*}変換(つまり、変数としての値は0)。headshetailst

  • IFS=h;set $i;echo ${1:+-}12つのステップで動作します。IFSを設定するh休憩クォートされていない$iset $i、文字で割った部分にはhheadsに分割される'''eads'、これ設定$1nullに。tailはで割られずh、したがってに$1等しくなりtailsます。次いで、${1:+-}生成-の値があれば$1非ヌル(のようであるtails)、または何も(ヌルと同様に$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。はい、-1QBasicのブール値trueのデフォルト値です!

2行目は、マッピングさ-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

ガイア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

ed27 25 21バイト

ed頭痛がした。最後@ed1confにtwitterの助けを借りてそれを見つけ出し、いくつかののぞき見をした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
ただし、2番目のコマンドが失敗することはないため、1番目のコマンドに対してのみアドレストリックが必要です。そして、明示的qにする必要はありません。何もすることがない場合、自動的に終了します。そして、あなたはそれらの後に改行を必要とするだけで、「。」(または「roblogic」…)は不要です。オンラインでお試しください!
マナトワーク

ああ、ありがとう。家に帰ったらあなたの提案を試すよ。👍🏼今パブで
roblogic

2

Python、20バイト

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

FalseそうでないTrue場合、およびそうである場合、これは戻ります。PythonでFalse0同じであり、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)

現時点では考えていないトリックを使用することで、おそらくもう少しゴルフができるでしょう。(古いバージョンの履歴を参照)入力を移動writeし、ifそこでステートメントを無視することで5文字を保存しました。上のオプションの括弧を無視することにより、さらに2つの文字が保存されましたfind。失敗した条件(つまり、headsまたはtailsでない入力)をチェックしません。

Luaに相当するものは

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ソリューションに正規表現を使用しましたedが、古くて気難しいので、まだ23バイトかかりました!
ロブログ

\wそして\+もののGNU拡張です。
SCH




2

dc、8バイト

?z2*1r-p

dcは、文字列を読み取って評価する以外に、文字列に対して意味のあることはできません。これを行うと、「heads」は未実装のコマンドと空のスタックに関する警告を出力しますが、無視しますが、重要なのはスタックが空のままであることです。「tails」は、最後の「ls」がsレジスタからスタックに値をロードするという重要な例外を除いてほぼ同じです。

次に、「z」を使用してスタックの長さを取得し、算術的に調整して正しい答えを取得します。

オンラインでお試しください!


2

三角、10バイト

F.~%.7/-_<

オンラインでお試しください!

文字入力のASC​​II値を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

マナトワークのおかげで-4バイト


TIOインタープリターのバージョンに違いがありますか?「頭」も「尾」も処理しないように見えます。
マナトワーク

今、私はプログラムを修正しました。
A̲̲

TIOインタープリターのバージョンに違いがありますか?暗黙的に入力を受け取り、存在しないデータを処理しようとすると入力を反転し、なしで動作するよう^です。
マナトワーク

ところで、2番目の文字「d」または「l」が取得した入力を既に識別するため、「t」まで4文字を破棄する必要はありません。明示的に出力するだけで、未処理の入力をスタックに残すことができます。オンラインで試してください!
マナトワーク

「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.