ヒントを計算する


16

あなたと友人がバーに入ってきます。バーテンダーはあなたを上手に扱っているので、あなたは彼にチップを渡すことにします。それで、あなたはあなたの信頼できるポケットコンピュータを引き出して、あなたにあなたのためのヒントを計算するための簡単なプログラムを書きます。ちょっと待って!演算子キーが壊れています!あなたの仕事は、与えられた入力量に対して20%のチップを計算することです。テスト入力はxx.xxの形式(20.96など)になります。ルールは次のとおりです。

  • 数学形式の演算子では以下を使用しません:+ - * / %(Wally Westに感謝)
  • 組み込みパーセント関数またはAPIの使用なし
  • ネットワークにアクセスできません
  • 使用なしevalまたは類似
  • Windows計算機はありません(はい、以前に答えたことがあります)
  • ヒント関数は組み込まれていません(どの言語にも含まれていません)

出力は小数点以下2桁に切り上げてください。

スコアはバイト単位の長さに基づいています。

プログラムが任意のチップ量を受け入れられる場合、-20%。金額の入力はxxの形式で与えられます(例:0.35ではなく35)


5
@mniip:ヒントとは、公式価格に含まれていないレストランで支払うと予想される奇妙な余分な金額です。彼らがロシアでそうするかどうかはわかりません。
user2357112は

5
ああ、その新しい世代...数字を5で割ることができない場合は、紙とペンを使います。
VisioN14年

4
@VisioN注:5で除算することは、10で除算してから2で乗算することと同等であり、両方とも非常に簡単なメンタルオペレーションでなければなりません。
user12205 14年

1
誰かがルールを明確にすることができます:それらの演算子を使用しない場合、禁止された操作を使用できますか?使用しない場合、乗算は許可されます*か?
Ypnypn 14年

2
@TheDoctorは本当に重複していますか?追加されていないからです。
ミロ14年

回答:


18

Javascript 81

編集:結果は現在、実際の丸めであり、切り捨てられていません。

使用しないでくださいANYここでは数学、単に文字列操作とビット演算子を。
すべての+文字は文字列の連結、または文字列から浮動小数点への変換です。
(x)x.xx形式の任意のxx.xx入力および出力に対応

s='00'+(prompt().replace('.','')<<1);(+s.replace(/(.*)(...)/,'$1.$2')).toFixed(2)

トリックの説明:20%を10で割って2を掛けます。

  • ドットを左に移動して10で割る(文字列操作)
  • ビットを左に移動して各部分を2倍します(ビット単位の操作)

入力がの場合99.99、これはを返す19.998ので、OPのように「小数点以下2桁に切り上げられません」。
Geobits 14年

2
うーん、これは長い解決策ですが、12の賛成票があります。コードゴルフの投票はどうなっていますか?
ジャスティン

@Quincunxはい、あなたはその人気のないコンテストです!
ムクルクマール

それはコードゴルフなので、おそらく勝つことはないでしょうが、これは人々が私のソリューションを好きになれないという意味ではありません...多くの場合、コードゴルフの勝者は最も賛成票を持っている人ではありません。
マイケルM.

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳、絶対に!これを指摘していただきありがとうございます。今すぐ修正:)
マイケルM.

6

J(9文字)

Jの短い答え:

^.(^.2)^~ 32

1
...そして私はJを話せません。それは何と言っていますか?
いとこコカイン14年

それは言う:32のべき乗を計算log(2); 通常、指数は右側にあります^が、ここで~は順序を逆にする必要があることを示しています。(^.2)はlog(.2)で、^.最後に実行されるイニシャルは、以前に計算されたすべての対数です。したがって、log(32 ^ log(.2))
トーマス

4

ピュアバッシュ、50 43文字

これは確実に解決されますが、ここから始めましょう。

a=$[10#${1/.}<<1]
echo ${a%???}.${a: -3:2}

コメントによると:

  • /ここでは除算演算子ではなく、パターン置換パラメーター展開の一部です
  • % ここではモジュロ演算子ではなく、パラメータ展開の一部です
  • - ここでは減算演算子ではなく、否定であり、コメントに従って許可されました

出力:

$ ./20pct.sh 0.96
.19
$ ./20pct.sh 20.96
4.19
$ ./20pct.sh 1020.96
204.19
$ 

私はそこにスラッシュが見えると思います。
ミロ14年

@Milo /は、bashパラメーター展開の一部であり、除算演算子ではありません。許可されているかどうか
デジタル外傷14年

1
私はそれが...この場合、数学的な演算子ではありません、それを可能にする
WallyWest

1
-3は減算ではなく否定として機能します... @Milo、これらの演算子を数学的な同等物とは別に使用できる否定やその他の方法を考慮する必要があります。たとえば、+はJavaScriptで連結子として使用できます。 ..提案をすることはできますか?変更し、「次の演算子なし使用:+ - * /%」「彼らの数学的な形で次の演算子なし使用:+ - * /%」
WallyWest

2
@WallyWest悪魔の擁護者を演じるために、ここでの否定はまだ数学的な演算子です。おそらく、「単項ではない数学的形式で次の演算子を使用しない:+-* /%」 ;-)
デジタルトラウマ

4

Python 98 * 0.8 = 78.4

d=`len('X'*int("{}{:>02}".format(*(raw_input()+".0").split('.')))*2)`;print'%s.%s'%(d[:-3],d[-3:])

Python 74(ボーナスなし)

d=len('X'*int(raw_input().replace('.',''))*2);print'%s.%s'%(d[:-3],d[-3:])

注意

  • + 文字列の連結に使用されます
  • * 文字列のコピーを作成するために使用

非ゴルフ

def tip():
    amount = raw_input()
    #Add an extra decimal point so that we can accept integer
    #amount
    amount += ".0"
    #Split the integer and decimal part
    whole, frac = amount.split('.')
    #Multiply amount by 100 :-)
    amount = "{}{:>02}".format(whole, frac)
    #Create amount copies of a character
    st = 'X'*amount
    #Double it
    st *= 2
    #Calculate the Length
    d = len(st)
    #Display the result as 3 decimal fraction
    print'%s.%s'%(d[:-3],d[-3:])

注意

質問の精神では、質問のすべてのルールに従っているが、次の解決策は虐待であると信じています

Python 41

print __import__("operator")(input(),0.2)

最後に

あなたは数学記号が禁止されていると主張する場合、彼女は90文字のソリューションです

Python 90(数学記号なし)

print' '.join(str(int(raw_input().replace(".",""))<<1)).replace(' ','.',1).replace(' ','')

1
すでに述べたように言った、*+(あなたがそれらを使用するものは何でも)KEYSが壊れています。
トーマスバルチェル14年

2
@ברוכאל: No use of the following in mathematical form operators: + - * / % (Thanks Wally West)。言い換えれば、質問を言い換える必要があります。そして、私は数学的な形式でそれらを使用していない
Abhijit

わかりましたが、その場合、APLソリューションのダウン投票は本当に公平ではありませんでした。その理由で、他のソリューションはダウン投票されていないからです。
トーマスバルチェル14年

あなたの答えは、例えば、わずかな金額に問題があるでしょう0.05
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

`input`代わりに(バックティックを含む)を使用できますraw_input
nyuszika7h 14年

4

APL(9文字、7文字の新しいコード、13文字で修正)

指定された金額の20%を計算します。

{⍟⍵*⍨*.2} 32

APLでは*、指数演算子です。

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

しかし、なぜそのために関数を使用するのですか?この新しいバージョンをご覧ください:

⍟(*.2)* 32

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

ダウン投票する前に*、キーとして禁止されていません。ここでは乗算を意味しません。

OK、ここではバージョンを小数点以下2桁に丸めています(Dyalog APL):

⎕PP←2⋄⍟(*.2)* 32.01

2
べき乗は依然として数学的操作であり*、挑戦の規則に従って、数学的な形式では許可されていません。
トニーエリス14年

指数はここで*は禁じられておらず、他のソリューションでは実際に使用されますが、数学的な意味としてではなく、キーとして禁じられているという事実については正しいです。
トーマスバルチェル14年

@Tony H.他のソリューションのコメントはすべて、最初のリストで禁止されている数学演算に使用されていない限り、最終的にそのようなキーを受け入れるように見えるので、ダウン投票を削除してください。
トーマスバルチェル14年

1
@ברוכאל数学的な意味に関係するアスタリスクの使用は、累乗を含めて禁止されていることは私の理解です。これまでのところ、指数を使用する他のすべての答えは、その^ような演算子にキャレット()を使用する言語であるか、関数呼び出しが使用されます。*乗算のコンテキストで使用される場合にのみ許可されるOPによる仕様はありません。OPがこれを支配し、誰が挑戦の規則を誤って解釈しているかを解決し、混乱を解消することができれば役立つと思います。
トニーエリス

1
おそらく、×および÷許可されて、それらは表示されません。
マリヌ14年

4

R、30 27 36 34

小数点以下2桁に丸めるように更新されました

plannapusのおかげで2文字を保存しました

0からxまでのベクトルを作成し、2番目の要素を取ります。

a=function(x)round(seq(0,x,l=6)[2],2)

例:

> a(20.36)
[1] 4.07

詳細な説明:

seq(0,x,len=6)

0から入力値xまでの長さ6のベクトルを作成します。値は等間隔になります。

> seq(0,5,len=6)
[1] 0 1 2 3 4 5

最初の値は0%、2番目の値は20%、3番目の値は40%などです。


待って…何?Rを知らない人(私のような)にどのように機能するかについて詳しく説明してください。
Michael M.

@Michaelはコードを説明するために私の答えを更新しました
リフト

ソリューションは丸めを行いません。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳あなたは正しいです(しかし、ほとんどのソリューションは何も丸めていません)。9個の余分な文字は「通常の」丸めを行います。唯一の...道難しいだろう切り上げ
リフト

@Rift:いくつかの回答(ほとんどの場合Python、JS、Perl、簡単に入手できるため)をテストしましたが、それらのほとんどは丸めを行います。しかし、私がテストしたものはどれも切り上げません。
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

3

dc + sed + pipes(44文字)

私の3番目の答え(1つのAPL、1つのJ、そして今や古いものと由緒あるDCを持つもの)。

dc -e 5o?p|sed -e 's/\(.\)$/.\1/'|dc -e 5i?p

INTEGER入力を要求し、トリッキーな方法で20%を計算します。入力は基数5に変換されます(他の多くのツールで簡単に実行できますが、お待ちください...)。最後の桁の前にsedでドットが追加され(残念ながら、dcは文字列をうまく処理できません)、そして、dcは浮動小数点数の基数5から逆変換します(すべてのツールがそれを実行できるわけではありません)。


1
「整数入力」が仕様を満たしていません。sed式を変更することで修正できると思います:dc -e 5o?p|sed 's/\(.\)\./.\1/'|dc -e 5i?p。これでseds を削除する-eと42になります。しかし、結果はまだ仕様ではありません(小数点以下2桁ではありません)
Digital Trauma

@DigitalTrauma。あなたが正しいです。しかし、この解決策は実際には概念の証明であり、dc(およびbc)の基本変換の異常な性質に興味がありました。sedでのコメントと修正に感謝します。
トーマスバルチェル14年

2

Python、88

これはどこにでも近いものではありませんが、これは通常の精神分裂を5で行う方法を示しています。これは、入力がxx.xxの形式でなければならないことを前提としています

import math
a,b=raw_input().split('.')
print'%.2f'%math.ldexp(float(a[0]+'.'+a[1]+b),1)

または、任意の長さの入力には、3文字の追加が必要です。

import math
a,b=raw_input().split('.')
print'%.2f'%math.ldexp(float(a[:-1]+'.'+a[-1]+b),1)

説明:入力を文字列として受け取り、小数点を1つ前に移動します(10で除算)。次に、それをfloatにキャストし、ldexp関数を使用して2を乗算します。

この回答では、+は文字列連結演算子であり、%はをフォーマットするために使用されることに注意してくださいprint

これらの文字のいずれも使用しないことを主張する場合、159文字のソリューションを次に示します。

import math
a,b=raw_input().split('.')
l=[a[0]]
l.append('.')
l.append(a[1])
l.append(b)
c=str(math.ldexp(float(''.join(l)),1))
print ''.join([c[0:2],c[2:4]])

すでに他の多くの答えを言ったが、私は本当にそれを考えていない+-キーが壊れているので、(彼らは、コードのあなたの部分に意味何でも)許可されています。
トーマスバルチェル14年

@ברוכאל:私の答えにあなたのコメントに私の応答を参照してください
Abhijit

ご使用.split('.')私の答えでは、1文字のみじん切り
user80551

2

dc + sed-45 * 0.8 = 36

(に触発答えによってברוכאל

  • 任意のチップ量(整数またはフロート)を処理します

実行例(STDINを介して入力が受け入れられます):

$ dc -e 5o?.0+p|sed 's/\(.\)\./.\1/'|dc -e 5i?p
42
8.400
$ dc -e 5o?.0+p|sed 's/\(.\)\./.\1/'|dc -e 5i?p
20.96
4.1920

.0+アイデアは素晴らしいです。私は私のものに触発されたあなたのソリューションに賛成票を投じましたが、一部は追加を使用していると言うかもしれません。おそらくいくつかの回避策?試しましたdc -e 9k5o?v2^pが、2文字以上です。
トーマスバルシェル14年

@ברוכאלこの文脈でも+が追加として適格であるかもしれないことに気づきませんでした。
devnull

@ברוכאלこれを削除します。を変更して、フロートを処理し、資格を得るように要求してください-20%
devnull

2

Mathematica、19

Log[(E^.2)^Input[]]

算術演算子を用いない+-*/、または%。対数のプロパティを使用して答えを計算します。式を単純化すると、.2*Input[]

ボーナスあり(30 * 0.8 = 24):

Log[((E^.01)^Input[])^Input[]]

最初に割合を入力し、次に金額を入力します。

式を単純化すると、が得られInput[]*Input[]*.01ます。

おかげברוכאלコードを短縮して助けを求めて。


3
本当に単純化できないのですか?私に、Log[E^2]またはLog[E^Input[]]もっとすぐに書くことができます。10^-1書くこともできます.01(私はMathematicaを使用しませんが、できると確信しています)。全体の表現(E^10^-1)^Log[E^2]はのようなもののようE^.2ですね。
トーマスバルチェル14年

1

TI-89ベーシック-39 * 0.8 = 31.2

Input y:Input x:Disp ln(((e^y)^.01)^x))

2つの数値を入力し、対数プロパティを使用して計算しx * y / 100ます。

グローバル変数xおよびの配置からの入力を想定できる場合y、スコアは17 * 0.8 = 13.6のため、はるかに短くなります。

ln(((e^y)^.01)^x)

ボーナスなし(12):

ln((e^.2)^x)

しかし、関数でラップする必要がある場合、これは機能します(38文字、30.4の場合):

:f(x,y):Func:ln(((e^y)^.01)^x):EndFunc

他のソリューション(Mathematica)に対する私のコメントをご覧ください。このコードは本当に単純化できます。
トーマスバルチェル14年

Input x,y??? 83/84で動作します。
ティムテック14年

@Timtechは89では動作しませんが、多分私は次のようなことができますInput{x,y}(83/84はありlnますか?)
ジャスティン

@Quincunxはい、私の新しい答えをご覧ください。
ティムテック14年

žr¹msmžr.n-05AB1Eへのこのコードの恥知らずな移植。
魔法のタコ

1

PHP 107 * .8 = 85.6

PHPでコードゴルフを実行することはできませんが、少なくとも文字列を操作することはできます。コマンドライン引数として両方の数値を受け入れます。

<? @$r=strrev;unset($argv[0]);echo$r(substr_replace($r(str_replace('.','',array_product($argv)))),'.',2,0);

-2を使用できないため、2回逆にする必要がありました:(


1

Python、 81 80 89文字

a,b=map(str,raw_input().split('.'));c=str(int(a+b)<<1).zfill(4);print c[:-3]+'.'+c[-3:-1]

説明

x = raw_input()       # say 20.96
a , b = x.split('.')  # a = 20 , b = 96
c = a + b             # c = '2096'      # string concatenation , multiplying by 100
d = int(c)<<1         # multiply by 2 by bitshift left , c = 4096
e = str(d).zfill(4)   # zfill pads 0's making the string 
                      # atleast 4 chars which is required 
                      # for decimal notation next

#     divide by 1000 (4) + . (4.) + fraction rounded to 2 decimals (4.09)
print        e[:-3]      +   '.'  +              e[-3:-1]

技術的には、これは端数を切り捨てるのではなく小数点以下2桁に切り捨てられるため不正です。


[-3:]代わりにできると思います[-3:-1]
ジャスティン

@Quincunxできません。-1は小数点以下2桁に切り捨てられます。
user80551

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳うん、修正した。
user80551

1

JavaScript 251(強制制限:いかなる方法でも+、-、*、?、または%なし)

私はこれが勝てないことを知っていますが、私は非常に厳格なアプローチをとることでブラウニーポイントを獲得しようとし、どのような形や形式でも制限された演算子を使用することさえ考えないだろうと思いました...その結果、私は思いつきましたこの美しさ...

A=(x,y)=>{for(;x;)b=x^y,x=(a=x&y)<<1,y=b;return y};D=(x,y,i=x,j=0)=>{for(;i>=y;)i=A(i,A(~y,1)),j=A(j,1);return j};alert(parseFloat((x="00".concat(String(D(prompt().replace(".",""),5)))).substr(0,A(x.length,y=A(~2,1))).concat(".").concat(x.substr(y))))

ビット演算を使用して、Add関数を作成しました Aし、そこからチェーンを開始しました。

整数除算関数Dは、一連の否定加算(A(x,A(~y,1)ループ上での減算)を使用しました。残りは、+連結演算子の使用を避けるための文字列操作と連結です...

これを機能させるには、数値を小数点以下2桁の10進数形式で指定する必要があります...


私は、新しいルールを守る必要があった場合けれどもああ、それは今...、私はそれを拡張しなければならなかったでしょう... 251今バイト...
WallyWest

1

Perl、50 60バイト

$_=<>;s|\.||;$_<<=1;$_="00$_";m|\d{3}$|;printf'%.2f',"$`.$&"

入力はSTDINで行われます。小数点以下2桁の小数点記号が含まれている必要があります。出力はSTDOUTに書き込まれます。

更新:このステップ$_<<=1は先行ゼロを削除します。したがってm|\d{3}$|、請求書<1には一致しません。したがって、10バイト$_="00$が追加されました。0.00機能します。

例:

  • 入力: 20.96、出力:4.19
  • 入力:12.34、出力:2.47

ゴルフされていないバージョン:

$_=<>;
s|\.||; # multiply by 100
$_ <<= 1; # multiply by 2
$_="00$_";
m|\d{3}$|; # divide by 1000
printf '%.2f'," $`.$&"

まず、STDINから番号が読み取られます。次に、小数点が削除され、100が乗算されます。次に、シフト演算子によって金額が2倍になります。次に、小数点が再挿入され、結果が出力され、2桁の10進数に丸められます。

請求書≥1の場合は50バイト

場合x.xxより大きい又はより等しい1.00、次に10のバイトを除去することができます。

$_=<>;s|\.||;$_<<=1;m|\d{3}$|;printf'%.2f',"$`.$&"

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳:ありがとう、今修正。
ヘイコOberdiek 14年

1

JavaScript(ES6)(正規表現)142

正規表現は素晴らしく、多くのことができます。数学もできます!

a=('x'.repeat(prompt().replace('.', ''))+'xxxx').match(/^((x*)\2{99}(x{0,99}))\1{4}x{0,4}$/);c=a[3].length;alert(a[2].length+'.'+(c<10?'0'+c:c))

読み取り可能なバージョン:

function tip(m) {
    var s = 'x'.repeat(m.replace('.', '')) + 'xxxx';
    var a = s.match(/^((x*)\2{99}(x{0,99}))\1{4}x{0,4}$/);
    var c = a[3].length;
    if (c < 10) c = '0' + c;
    return a[2].length + '.' + c;
}

このtip()関数は、NumberではなくString引数を想定しています。

すべてのインスタンスは*/+数学演算に関連していません。

  • + 使用されるすべてのインスタンスでの文字列連結です。
  • * RegExp構文の一部です
  • / RegExpリテラルの区切り文字です

入力.小数点として使用する必要あり、小数点の後に2桁が必要です。

スタックスニペット

<button onclick = "a=('x'.repeat(prompt().replace('.', ''))+'xxxx').match(/^((x*)\2{99}(x{0,99}))\1{4}x{0,4}$/);c=a[3].length;alert(a[2].length+'.'+(c<10?'0'+c:c))">Try it out</button>


0

Haskell 32文字-20%= 25.6文字

t y x=log $(^x)$(**0.01)$ exp y

指数が対数の乗算になるという事実を悪用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.