間隔表記


21

チャレンジ:

入力:

2つの整数パラメーターab(ただしa<b、差は少なくとも2)

出力:

出力またはこのテキスト、返すabに充填されました:

(a,b) = ]a,b[ = {a<x<b}   = {a<x&&x<b}   = a+1..b-1
[a,b) = [a,b[ = {a<=x<b}  = {a<=x&&x<b}  = a..b-1
(a,b] = ]a,b] = {a<x<=b}  = {a<x&&x<=b}  = a+1..b
[a,b] = [a,b] = {a<=x<=b} = {a<=x&&x<=b} = a..b

チャレンジルール:

  • I / Oは柔軟です。STDOUTに出力でき、文字列/文字配列などとして返されます。2つの整数、10進数、文字列として入力できます(a+1and を計算する必要があるのでわかりませんb-1が、私のゲストになります)。
  • 任意の長さの先頭および/または末尾の改行が許可され、各行の末尾および/または先頭のスペースが許可されます。
  • 等号のスペース(同じ列に配置するスペースを含む)は必須であり、他の文字間のスペースは許可されません。
  • a+1そしてb-1これらの計算の後に正しい値に置き換えられます。
  • 代わりに使用することはできません<=
  • &代わりに使用することはできません&&
  • 数値を出力できます.0(一貫性があり、10進数のゼロが1つ以下である限り)。
  • (正確であるために)a少なくとも2より小さいと仮定できます。b(a,b)
  • 行は、示されている順序で出力されます。

例:

入力:a=-5, b=10
出力:

(-5,10) = ]-5,10[ = {-5<x<10}   = {-5<x&&x<10}   = -4..9
[-5,10) = [-5,10[ = {-5<=x<10}  = {-5<=x&&x<10}  = -5..9
(-5,10] = ]-5,10] = {-5<x<=10}  = {-5<x&&x<=10}  = -4..10
[-5,10] = [-5,10] = {-5<=x<=10} = {-5<=x&&x<=10} = -5..10

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターと戻り値型、完全なプログラムを持つ関数/メソッドを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

PS:サンドボックスでこのチャレンジを見た人は、それがまだチャレンジでaあり、bハードコーディングされていたので、通常のようにハードコーディングおよびエンコードされた回答の退屈を防ぐために、入力チャレンジに変更しましたKCの課題。


2
それで、a=5, b=6まだ出力するには(5,6) = ... = 6...5
l4m2

1
@ l4m2 Ah ..それについては考えていませんでした。あなたは想定できるab常に離れて、少なくとも2になります。チャレンジを編集します。
ケビンCruijssen

2
思っていたよりもずっと楽しかったことがわかりました。ナイスチャレンジ!
アーナウルド

@DigitalTrauma申し訳ありませんが、この正確な順序。
ケビンCruijssen

回答:


2

スタックス、74 バイト

ÉyU≤₧pΔz▀σ┬`♪•a≤☻Σ╕←k►¬╗Ö)ßâL╫§▐ƒ┼°╚íS3:Y¶7]7♂e╖à╙ô≥;M0h8♦Oún┼ë`←B╠╫║┌♂α▲╚

実行してデバッグする

これは、staxの文字列テンプレートを多用します。開梱されていない、コメントされていない、これはこのように見える。

Y                   save second input in Y register (first is already in X)
.)].([|*            cross product of ")]" and "(["; this produces [")(", ")[", "](", "]["]
{                   begin block to map over interval delimiters
  E"`x,`y"a++       push delimiters separately, then wrap them around the inputs    e.g. "(-5,10)"
  c"(])["|t         copy last value, then replace parentheses with braces           e.g. "]-5,10["
  ih'=              push half the iteration index and "="                           e.g. 0 "="
  |;'=              push iteration parity (alternating 0 and 1) and "="             e.g. 0 "=" 0 "="
  "{`x<`*x<`*`y}"   multiply each equal sign by its occurrence, and template        e.g. "{-5<x<10}"
  c'x.x&:mR         copy last value, then replace "x" with "x&&x"                   e.g. "{-5<x&&x<10}"
  yvih xi|e         calculate final bounds offsets                                  e.g. -5 1 10 -1
  "`+..`+"          add inputs to offsets, and embed in template                    e.g. "-4..9"
  5l                combine last 5 values into array
m                   map [")(", ")[", "](", "]["] using block
:<                  left-align grid colums to add extra spaces
m" = "*             for each row, join with " = " and output

これを実行する


10

JavaScriptの(ES6)、184の 182 181 180バイト

カリー化構文の入力を受け取ります(a)(b)。4つの文字列の配列を返します。

a=>b=>[1,2,3,4].map(k=>'31,23 = 31,23 = {10x72}4{10x&&x72}45..6'.replace(/\d/g,(n,i)=>[(+n?k<3:k&1)?'<':'<=',a,b,'][)([[]('[(i*17^k*718)%9],'   = '.slice(k/2),a+k%2,b-(k<3)][n%7]))

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

どうやって?

各行のK1≤K≤4 、我々は次のテンプレートで始まります。

"31,23 = 31,23 = {10x72}4{10x&&x72}45..6"

次の表に従って、位置iの各10進数字nを置き換えます。

  n  | Replaced with           | Code
-----+-------------------------+------------------------------------------
 0,7 | comparison operator     | (+n ? k < 3 : k & 1) ? '<' : '<='
  1  | a                       | a
  2  | b                       | b
  3  | interval bound          | '][)([[]('[(i * 17 ^ k * 718) % 9]
  4  | a substring of '   = '  | '   = '.slice(k / 2)
  5  | either 'a' or 'a + 1'   | a + k % 2
  6  | either 'b' or 'b - 1'   | b - (k < 3)



3

Java(JDK 10)、251バイト

a->b->("(a,b)q]a,b[q{a<x<b}  q{a<x&&x<b}  q"+-~a+".."+~-b+"\n[a,b)q[a,b[q{a<=x<b} q{a<=x&&x<b} qa.."+~-b+"\n(a,b]q]a,b]q{a<x<=b} q{a<x&&x<=b} q"+-~a+"..b\n[a,b]q[a,b]q{a<=x<=b}q{a<=x&&x<=b}qa..b").replace("a",a+"").replace("b",b+"").replace("q"," = ")

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

クレジット


私はまだ...ゴルフをしています
オリヴィエ・グレゴワール

ゴルフはほぼ完了しましたか?85バイトを削除するよう提案されました。;)
ケビン・クルーッセン

@KevinCruijssen私は終わりだが、私ははるかに少ないよりも85のバイトを削除...
オリヴィエ・グレゴワール

1
退屈な3つの251バイト.replace
ケビンCruijssen

ええ、基本的に、フォーマットではなく、実際にreplaceを使用する最初のソリューションです。いいね 確かに退屈ですが、素晴らしい!:-)
オリヴィエグレゴワール

3

Perl 5、181バイト

これはもっと短くなると思いました...

$_="sd,ds = sd,ds = {dsxsd}s= {dsx&&xsd}s= d..d
"x4;s!s!("()][<<   [)[[<=<  (]]]<<=  [][]<=<= "=~s/[<= ]+/$&$&/gr=~/ +|<=|./g)[$-++]!ge;s/d/$F[$x%2]+{8,1,9,-1,19,-1,28,1}->{$x++}/ge

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

説明

もともと、これはprintfフォーマット文字列を使用していましたが、を組み合わせた場合に持っsdいて短くなりましたs///

最初の書式文字列がに組み込まれ$_及びquadruplicated、すべてsの対応するブラケットに置き換えられ<<=交換指標に応じて、またはスペース。各ブロックの最後の5文字を​​複製して、さらにいくつかのバイトを節約したかったのですが、これは2バイトしか節約できませんでした。結果の文字列は、スペース<=または単一文字の要素に分割されます。

最後に、すべてdのsが、ハッシュキーを介して現在の置換のインデックスに基づいて調整される目的の数に置き換えられます。


3

JavaScript、190 189バイト

x=>y=>`(0)7]0[7{1<x<2}  7{1<52}  73..4
[0)7[0[7{18x<26{185261..4
(0]7]0]7{1<x826{1<5=263..2
[0]7[0]7{18x82}7{185=2}71..2`.replace(/\d/g,d=>[[x,y],x,y,x+1,y-1,`x&&x<`,`}  = `,` = `,`<=`][d])

オンラインで試す


3

M4、194

マクロプロセッサの仕事のようです。m4がプログラミング言語の標準を満たしているかどうかはわかりません。ループ機能と算術評価を持っているので、マークに近いと思います。

define(l,`$1a,b$2 = $3a,b$4 = {a<$5x<$6b} $8= {a<$5x&&x<$6b} $8= $7')dnl
l(`(',`)',],[,,,incr(a)..decr(b),`  ')
l([,`)',[,[,=,,a..decr(b),` ')
l(`(',],],],,=,incr(a)..b,` ')
l([,],[,],=,=,a..b,)

これは初めてのm4の重要な見方なので、見逃したゴルフの機会がもっとあると思います。

入力は-D、コマンドラインでマクロ定義を使用して渡されます。これらのスコアに何かを追加する必要があるかどうかはわかりませんが、これが意味のあるパラメーターを渡す唯一の方法であると言えます。

$ m4 -Da=-5 -Db=10 intnot.m4
(-5,10) = ]-5,10[ = {-5<x<10}   = {-5<x&&x<10}   = -4..9
[-5,10) = [-5,10[ = {-5<=x<10}  = {-5<=x&&x<10}  = -5..9
(-5,10] = ]-5,10] = {-5<x<=10}  = {-5<x&&x<=10}  = -4..10
[-5,10] = [-5,10] = {-5<=x<=10} = {-5<=x&&x<=10} = -5..10 $

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


@Dennis にTIOにm4をすぐに追加してくれてありがとう!


1
m4が答えるのに有効なプログラミング言語ではない理由はわかりませんが、何を知っていますか。;)-D引数については、まったく問題ありません。チャレンジの説明では、I / Oは完全に柔軟であるため、入力をSTDIN、関数パラメーター、プログラムコマンドライン引数、コンパイラーフラグ、ファイルの読み取り、または他の考えられる入力方法として受け入れるかどうかあなた次第。
ケビンクルーッセン


1

Excel、399バイト

="("&A1&","&B1&") = ]"&A1&","&B1&"[ = {"&A1&"<x<"&B1&"}   = {"&A1&"<x&&x<"&B1&"}   = "&A1+1&".."&B1-1&"
 ["&A1&","&B1&") = ["&A1&","&B1&"[ = {"&A1&"<=x<"&B1&"}  = {"&A1&"<=x&&x<"&B1&"}  = "&A1&".."&B1-1&"
 ("&A1&","&B1&"] = ]"&A1&","&B1&"] = {"&A1&"<x<="&B1&"}  = {"&A1&"<x&&x<="&B1&"}  = "&A1+1&".."&B1&"
 ["&A1&","&B1&"] = ["&A1&","&B1&"] = {"&A1&"<=x<="&B1&"} = {"&A1&"<=x&&x<="&B1&"} = "&A1&".."&B1

ここで特に興味深いことはありません。


1

C(gcc)、224 237バイト

f(a,b,c,m,n,o){for(c=0;++c<5;printf("%c%d,%d%c = %c%d,%d%c = {%d<%sx<%s%d}%*s= {%d<%sx&&x<%s%d}%*s= %d..%d\n","[("[m],a,b,"])"[n],"[]"[m],a,b,"]["[n],a,"="+m,"="+n,b,o,"",a,"="+m,"="+n,b,o,"",a+m,b-n)){m=c%2;n=c<3;o=3-c/2;}}

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

「<[=]」をフォーマット文字列に移動すると、配列を完全に削除できました。また、移動printf()forループがセミコロンを救いました。

元の答え

f(a,b,c,m,n,o){char*e[]={"<=","<"};for(c=0;++c<5;){m=c%2;n=c<3;o=3-c/2;printf("%c%d,%d%c = %c%d,%d%c = {%d%sx%s%d}%*s= {%d%sx&&x%s%d}%*s= %d..%d\n","[("[m],a,b,"])"[n],"[]"[m],a,b,"]["[n],a,e[m],e[n],b,o,"",a,e[m],e[n],b,o,"",a+m,b-n);}}

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

ここでは特に注目に値するものはありません。関数のサイズを削るのに通常のトリックを使用しました(intK&Rスタイルを使用して関数ヘッダーにautoを追加し、文字列定数にインデックスを付けます)。配列は複数回使用されるため、この課題にフォーマット指定子を挿入するよりもサイズ効率が良いことが証明されました。



1

Javascript、273 258 232バイト

15バイト節約してくれたKevin Cruijssenに感謝します!

e=>f=>'(j)h]j[h{a<x<b}  h{a<x&&x<b}  hc..d\n[j)h[j[h{a<=x<b} h{a<=x&&x<b} ha..d\n(j]h]j]h{a<x<=b} h{a<x&&x<=b} hc..b\n[j]h[j]h{a<=x<=b}h{a<=x&&x<=b}ha..b'.replace(/a|b|c|d|h|j/g,m=>{return{a:e,b:f,c:e+1,d:f-1,h:" = ",j:e+","+f}[m]})

オンラインで試す

TFeldにそのアイデアを与えてくれてありがとう。元の回答から約60バイト節約できた。

アンゴルフド:

e => f => '(j)h]j[h{a<x<b}  h{a<x&&x<b}  hc..d'
 + '\n[j)h[j[h{a<=x<b} h{a<=x&&x<b} ha..d'
 + '\n(j]h]j]h{a<x<=b} h{a<x&&x<=b} hc..b'
 + '\n[j]h[j]h{a<=x<=b}h{a<=x&&x<=b}ha..b'
.replace(/a|b|c|d|h|j/g, m=>{
        return {a:e,b:f,c:e+1,d:f-1,h:" = ",j:e+","+f}[m]
    }
)

Javascript(元の回答)、340バイト

(a,b)=>alert(`(${a},${b}) = ]${a},${b}[ = {${a}<x<${b}}   = {${a}<x&&x<${b}}   = ${a+1}..${b-1}\n[${a},${b}) = [${a},${b}[ = {${a}<=x<${b}}  = {${a}<=x&&x<${b}}  = ${a}..${b-1}\n(${a},${b}] = ]${a},${b}] = {${a}<x<=${b}}  = {${a}<x&&x<=${b}}  = ${a+1}..${b}\n[${a},${b}] = [${a},${b}] = {${a}<=x<=${b}} = {${a}<=x&&x<=${b}} = ${a}..${b}\n`)

1
の改行は{a<=x&&\nx<=b}そこにあるべきではなく、最初の行がありません(a,b) = 。一部のゴルフに関しては、アラートの代わりに結果を返すことができます。(m)=>することができますm=>(e,f)=>することができますe=>f=>。そして:gを作成する代わりに直接使用できますlet g=m=>{return{a:e,b:f,c:e+1,d:f-1}[m]}オンラインで258バイト試してください。そして、おそらくより..私はあまりにもJSに熟練していないよ、golfedすることができます
ケビンCruijssen

さて、あなたは私よりも熟練しているように見えます。ヒントをありがとう、答えに追加します
ランダムな男

まあ、私はほとんどのJava(または空白)でgolfs誰かだし、これらのゴルフのヒントにも、私は彼らを知っている理由は、大部分であるJavaの答え、に適用されます(m)->m->。およびへ。;)また、私はこのSOで2年弱の間活動しているので、JSの回答がこのような種類のものを使用するのを以前にも見ました。(e,f)->e->f->var g=new int[]{...}return g[m]return new int[]{...}[m]
ケビンクルーッセン

1

網膜、216バイト

.+
$&()][<<  ¶$&[)[[<=< ¶$&(]]]<<= ¶$&[][]<=<=
((.*),(.*))(.)(.)(.)(.)(<=?)(<=?)( *)
$4$1$5 = $6$1$7 = {$2$8x$9$3}$10 = {$2$8x&&x$9$3}$10 = $2_$8..$3_$9
_<=

\d+_
$&*___
T`<`_` _+<|\.-_+<
___<
_
__<
-1
_(_*)
$.1
-0
0

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

.+
$&()][<<  ¶$&[)[[<=< ¶$&(]]]<<= ¶$&[][]<=<=
((.*),(.*))(.)(.)(.)(.)(<=?)(<=?)( *)
$4$1$5 = $6$1$7 = {$2$8x$9$3}$10 = {$2$8x&&x$9$3}$10 = $2_$8..$3_$9

結果の主要部分を構築します。

_<=

変数が緩やかな不等式に関与している場合、値は包括的であるため、プレースホルダーを削除できます。

\d+_
$&*___

値を単項に変換し、2を追加します。

T`<`_` _+<|\.-_+<

厳密な下位不等式または負の厳密な上位不等式のプレースホルダーを削除します。まだ2が追加されていますが、後で1が減算され、目的の結果が得られます。

___<
_

他のゼロ以外の厳密な不等式から2を減算し、元の値を復元します。元の値から1が後で減算されます。

__<
-1

の厳密な上限不等式を0に変更し-1ます。

_(_*)
$.1

残りの厳密な不等式から1を引き、10進数に変換します。

-0
0

別のエッジケースを修正します。


1

Python 3、180バイト:

lambda a,b:[eval('f"'+"{%r[j]}{a},{b}{%r[i]} = "*2%('([',')]','][','[]')+"{{{a}<{'='[:j]}x%s<{'='[:i]}{b}}}{'  '[i+j:]} = "*2%('','&&x')+'{a+j}..{b-i}"')for i in(1,0)for j in(1,0)]

説明

基本的に、リスト内包表記で評価されるf文字列を作成します。古いスタイルの%文字列補間は、f-stringが評価されるまで式の評価を遅らせるために使用されます。

lambda a,b:[
    eval(
      'f"' +                                                            # f-string prefix
      "{%r[j]}{a},{b}{%r[i]} = "*2%('([',')]','][','[]') +              # first two terms
      "{{{a}<{'='[:j]}x%s<{'='[:i]}{b}}}{'  '[i+j:]} = "*2%('','&&x') + # second two terms
      '{a+j}..{b-i}"'                                                   # last term
      )
    for i in(1,0)for j in(1,0)
    ]

文字列の最初の部分「f」は、f文字列のプレフィックスになります。

文字列の2番目の部分は、最初の2つの間隔式の形式文字列を作成します。%rは、形式に引用符を付ける必要がないようにするために使用されます。つまり、"{%r[j]}"と同じ"{'%s'[j]}"です。f-stringが評価されると、正しいブラケットが選択されます。

文字列の3番目の部分は、次の2つの間隔式を作成します。

最後の部分は、f文字列の「a..b」部分をフォーマットします。

組み立てられたf-stringは次のようになります。 f"{'(['[j]}{a},{b}{')]'[i]} = .... = {a+j}..{b-i}"

f文字列が評価されると、中括弧内のすべての式が{}その値に置き換えられます。だから、 {a}の値によって置き換えられますa、と{'(['[j]}置き換えられます(jが0である場合や[jが1である場合。



0

Python 3、248バイト

def f(a,b):
 l=[['(',')','[','<',1],['[',']',']','<=',0]]
 r=[0,1]
 for i in r:
  for j in r:
   print(('%s%d,%d%s='*2+'{%d%sx%s%d}={%d%sx&&x%s%d}=%d..%d')%((l[j][0],a,b,l[i][1],l[1-j][2],a,b,l[i][2])+(a,l[j][3],l[i][3],b)*2+(a+l[j][4],b-l[i][4])))

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

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