事後アクセサリー!


10

この課題は数学に触発されて事実です。プログラミングではありません。


階乗、またはファクトの数学的表記は感嘆符!です。感嘆符も、not多くのプログラミング言語で共通の記号です。

チャレンジ:

数字と文字を含む文字列+ !を入力として受け取り、以下を出力します。

感嘆符の前にあるものはすべて数式として評価されるべきであり、そう2+2なります4。

単一感嘆符の後にすべてが付属品として追加されなければならないので、その前にあるものは何でもへ:2+2!5与えるべきである45、なぜなら2+2=4、および5アクセサリーです。2+2!5+5与える必要があります410。

ので!意味もnot、だ何もない事実の後に付属品はすべきではない追加されます。だから、2+2!!5与えるべきで4あるため、5付属品ではありません。さて、与えるnot(not(true))==trueので。を与える必要があります:、次に、階乗とが続きます。最初は事実ではありませんが、別の感嘆符の後にあり、したがって、これも事実です。2+2!!!5452+2!!5!5+54102+2=4!5!5+555+5

明確化:

  • 感嘆符は+どちらの側にも隣接しません。
  • +数字の先行はありません(それは5、ではありません+5)。
  • 最初のの前の式の結果である場合は、オプションで先行ゼロを含めることができます!。両方とも4、04入力として受け入れられる出力:0+0!4

エグゼクティブサマリー:各合計を評価します(!区切り記号として扱います)。次に、!(文字列の先頭から数えて)偶数個の後に現れるすべての数字を破棄します。次に、すべて削除します!。

テストケース:

!
   <- Empty string

5
5

12!
12

!87
87

!!5
   <- Empty string

5+5!2+2
104

5+5!!2+2
10

1!2!3!4!5!6!7!8!9
12468

10+10!!2+2!!3+3!4+4
208

2!!3!5
25

2!!3!5!7
25

10!!!!!!!5
105

これはので、バイト数(各言語で)が最も短いコードが優先されます!説明を強くお勧めします!


うーん... 2が3であるとしましょう!
— officialaimm

3
@officialaimmです25(追加のテストケースを参照)。さらに重要なの2!!3!5!7は25、の!残りの数が偶数であるため、がまだ与え7られることです(そのため、数値の前にある実行を数えるだけでなく、その!左側すべてを数えます)。
— マーティンエンダー

出力はMathematicaになりRowますか?
— ngenisis 2017

ええと...この挑戦は実際に階乗とは何の関係もないのですか?
— DLosc 2017

回答:



5

JavaScript(ES6)、58 56バイト

Martin Enderのおかげで2バイト節約されました。

let f =
x=>x.replace(/[^!]+/g,eval).replace(/!(\d*)!?\d*/g,"$1")
<input value="2+2!5+5" oninput="try{O.value=f(value)}catch(e){}"><br>
<input id=O value="410" disabled>

どういうわけか改善されるかもしれない...


への関数引数の適切な使用replace。
— Neil

@ニールありがとう、しかし私はより良い方法を見つけました:-)
— ETHproductions 2017

あなたのコードスニペットは私に間違った答えを与えています1+1!5。あなたevalは少し前のことを忘れていたと思います!。
— バリューインク

@ValueInkああ、それを修正する簡単な方法はないと思います。
— ETHproductions 2017

2

ゼリー、16バイト

ṣ”!µḢW;m2$VṾ$L¡€

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

説明

ここでの重要な観察は、「順不同」のステップを実行できることです。合計を評価してから不要なものを無視する代わりに、無効な位置の合計を無視して、残りを評価できます。

ṣ”!µḢW;m2$VṾ$L¡€
ṣ”!                Split input on '!'
   µ               Set as the new default for missing arguments
    Ḣ              Take the first element, removing it from the default
     W;  $         Cons with
       m2            every odd-numbered element of {the tail of the !-split input}
               €   For each remaining element
          VṾ$      Evaluate and de-evaluate it
             L¡      a number of times equal to its length

のよう"10+10"に合計を評価すると、それが数値に20評価されます"20"。そのプロセスを繰り返しても、追加の効果はありません(べき等)。したがって、長さがゼロであるため未評価のままであるnull文字列を除いて、文字列のすべての要素を効果的に評価します。


これは、各項目を条件付きで評価するための優れたトリックです。どういうわけか、各項目とそのeval-deval'd値の論理ANDをとることができますか?(私は空の文字列がゼリーで間違っていると思います)
— ETHproductions 2017

@ETHproductions:Jellyの暗黙性により、バイトを節約できる可能性は低くなります。可能であれば同じ値を2回使用しないことをお勧めします。値を再利用したい場合は、通常、少なくともµどこかにエクストラを追加µする必要があります(ループ内では機能しないため、何かが必要になります)さらに詳細)。私はと、それを動作させるために管理しましたṣ”!µḢW;m2$ȧVṾ$$€が、それは任意の短いではありません(とあなたが巣の制御構造にその能力のエッジにゼリーをプッシュする場合に発生する傾向がドル記号の特性杭を持っています。)

2

ゼリー、18 バイト

ṣ”!µḊm2;@ḢW$LÐfVṾ€

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

どうやって?

ṣ”!µḊm2;@ḢW$LÐfVṾ€ - Main link: string
ṣ”!                - split on '!' characters
   µ               - monadic chain separation (call that x)      e.g. ['1+1','0+0','0+0','0+0','','1+0','','','']
    Ḋ              - dequeue x (all but the leftmost entry of x) e.g.       ['0+0','0+0','0+0','','1+0','','','']
     m2            - modulo 2 index into that result             e.g.       ['0+0',      '0+0',   '1+0',   '']
           $       - last two links as a monad
         Ḣ         -     head x (the leftmost entry of x)        e.g.  '1+1'
          W        -     wrap                                    e.g. ['1+1']
       ;@          - concatenate with reversed arguments         e.g. ['1+1','0+0',      '0+0',   '1+0',   '']
             Ðf    - filter keep:
            L      -     length (keep that have non-zero length) e.g. ['1+1','0+0',      '0+0',   '1+0']
               V   - eval as jelly code (vectorises)             e.g. [  2,    0,          0,       1]
                      Yes, addition is just + and decimal numbers are just strings of digits in Jelly believe it or not!
                Ṿ€ - uneval €ach (creates a string from each one)e.g. [ '2',  '0',        '0'     ,'1']
                      without the € it would uneval the list and hence yield commas too)
                   - implicit print (prints the resulting list [of characters and possibly
                      lists of characters] as if it were all one string.)

これ0+0は、入力の途中(破棄されない場所)のリテラルでは機能しないと思います。それは数字0作り出す必要があるにもかかわらず、ヌル文字列を生成します

ああ、そうです-私はもっと長い解決策に移行する必要があります:(
— ジョナサン・アラン

修正する必要があります(おそらくゴルフ可能になりました)。
— ジョナサンアラン


1

Ruby、58 56 + 1 = 59 57バイト

-pフラグを使用します。-Tutlemanからの2バイト。

i=0;$_=' '+$_;gsub(/!?([^!]*)/){eval$1if(2>i+=1)||i%2<1}

オンラインでお試しください!(コードの追加行が追加されたため、すべての入力行を受け取り、出力を別の行に出力します。)


かっこをドロップしてもいいと思いますよeval$1ね?
— Tutleman

@タトルマンハァッ。括弧を追加する原因となったどのような問題があったのかはわかりませんが(プログラムの作成を開始したときはありませんでした)、本当に削除できるようです。
— バリューインク

0

バッチ、192 184バイト

@echo off
set/ps=
call:c . "%s:!=" "%"
echo(%s%
exit/b
:c
set s=
if not %2=="" set/as=%2
:l
shift
shift
if "%1"=="" exit/b
if %1=="" goto l
set/at=%1
set s=%s%%t%
goto l

空の文字列を処理する必要があるのは不便です。


0

ピップ、18バイト

これは最短だと思います...約3回前にも繰り返しましたが。

{VaX++v%2+!v}Ma^'!

コマンドライン引数として入力を受け取ります。オンラインでお試しください!

説明

                    a is 1st cmdline arg; global variable v is -1 (implicit)
              a^'!  Split a on !
{           }M      Map this function to the resulting list (note that inside function,
                    a is the function arg):
    ++v              Increment v (so that v tracks the 0-based index of the current
                     element)
       %2            We want to keep the elements where v%2 is 1...
         +!v         ... and also v=0, where v%2 is 0, but adding !v makes it 1
  aX                 String-multiply the argument by the above quantity (turning elements
                     we don't want into empty string)
 V                   Eval it (eval'ing empty string gives nil, but that's okay because
                     nil doesn't output anything)
                    Autoprint the resulting list, concatenated together (implicit)

0

R、95バイト

function(x)for(e in strsplit(gsub('!([^!]*)![^!]*','\\1!',x),'!')[[1]])cat(eval(parse(text=e)))

まだ改善の余地はあると思いますが、現時点ではそれが私が思いつく最高の状態です。

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