Notasi Interval

21

Tantangan:

Memasukkan:

Dua parameter integer adan b(di mana a<bdan perbedaannya minimal 2)

Keluaran:

Keluarkan atau kembalikan teks ini, di mana adan bdiisi:

(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

Aturan tantangan:

  • I / O fleksibel. Dapat dicetak ke STDOUT, dikembalikan sebagai string / karakter-array, dll. Dapat dimasukkan sebagai dua bilangan bulat, desimal, string (tidak yakin mengapa karena Anda perlu menghitung a+1dan b-1, tetapi jadilah tamu saya ..), dll.
  • Setiap jumlah garis depan dan / atau trailing diperbolehkan, dan sejumlah spasi trailing dan / atau memimpin untuk setiap baris diizinkan.
  • Spasi di tanda sama dengan (termasuk yang untuk menyelaraskannya di kolom yang sama) adalah wajib, spasi di antara karakter lain tidak diperbolehkan.
  • a+1dan b-1diganti dengan nilai yang benar setelah perhitungan ini.
  • Anda tidak diperbolehkan untuk menggunakan bukan <=.
  • Anda tidak diperbolehkan untuk menggunakan &bukan &&.
  • Anda diizinkan untuk mengeluarkan angka-angka dengan .0(asalkan konsisten, dan tidak lebih dari satu nol desimal).
  • Anda dapat mengasumsikan apaling sedikit 2 lebih rendah dari b(agar (a,b)benar).
  • Garis-garis harus berupa output dalam urutan yang ditunjukkan.

Contoh:

Input: a=-5, b=10
Keluaran:

(-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

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

PS: Bagi mereka yang telah melihat tantangan ini di Sandbox ketika itu masih merupakan tantangan dengan adan bhard-coded, saya telah mengubahnya menjadi tantangan input untuk mencegah membosankan jawaban kode yang dikodekan dan dikodekan seperti yang biasanya kita lihat dengan Tantangan KC.

Kevin Cruijssen
sumber
2
Jadi untuk a=5, b=6output masih (5,6) = ... = 6...5?
l4m2
1
@ l4m2 Ah .. tidak memikirkan itu. Anda dapat mengasumsikan adan bakan selalu setidaknya 2 terpisah. Saya akan mengedit tantangannya.
Kevin Cruijssen
2
Ternyata jauh lebih menyenangkan daripada yang kuharapkan. Tantangan yang bagus!
Arnauld
@ DigitalTrauma Maaf, tapi ini perintah yang tepat.
Kevin Cruijssen

Jawaban:

2

Stax , 74 byte

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

Jalankan dan debug itu

Ini sangat menggunakan template string stax. Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

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

Jalankan yang ini

rekursif
sumber
10

JavaScript (ES6), 184 182 181 180 byte

Mengambil input dalam sintaks currying (a)(b). Mengembalikan array 4 string.

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]))

Cobalah online!

Bagaimana?

Untuk setiap baris k dengan 1 ≤ k ≤ 4 , kita mulai dengan templat berikut:

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

dan ganti setiap angka desimal n pada posisi i sesuai dengan tabel berikut:

  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)
Arnauld
sumber
4

Python 2 , 225 203 195 byte

a,b=input()
for d in 0,1:
 for m in 0,1:k=`a`+','+`b`;o='{'+`a`+'<'+m*'=';c='x<'+d*'='+`b`+'}'+'  '[m+d:];print' = '.join(['(['[m]+k+')]'[d],']['[m]+k+'[]'[d],o+c,o+'x&&'+c,`a+1-m`+'..'+`b-1+d`])

Cobalah online!

ovs
sumber
3

Python 2 , 187 byte

t=a,b=input()
for j in 1,0:
 for i in 1,0:print"%%s%d,%d%%s = "%t*2%('[('[i],'])'[j],'[]'[i],']['[j])+"{%d<%sx%%s<%s%d}%s = "%(a,'='[i:],'='[j:],b,' '*(i+j))*2%('','&&x')+`a+i`+'..'+`b-j`

Cobalah online!

Tidak
sumber
3

Java (JDK 10) , 251 byte

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"," = ")

Cobalah online!

Kredit

Olivier Grégoire
sumber
Saya masih bermain golf ...
Olivier Grégoire
Hampir selesai dengan bermain golf? Saya mendapat saran untuk menghapus 85 byte. ;)
Kevin Cruijssen
@KevinCruijssen saya selesai tetapi saya menghapus jauh kurang dari 85 byte ...
Olivier Grégoire
1
251 byte dengan tiga membosankan .replace.
Kevin Cruijssen
Ya, pada dasarnya solusi pertama saya menggunakan ganti memang, bukannya memformat. Bagus. Memang membosankan, tapi menyenangkan! :-)
Olivier Grégoire
3

Perl 5 , 181 byte

Saya pikir ini akan berhasil jauh lebih pendek ...

$_="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

Cobalah online!

Penjelasan

Awalnya ini menggunakan printfformat string, tetapi hanya memiliki sdan dlebih pendek bila dikombinasikan dengan s///.

Pertama format string dibangun ke dalam $_ dan empat kali lipat, maka semua ss diganti dengan braket yang sesuai <,, <=atau spasi, tergantung pada indeks penggantian. Saya berharap untuk menghemat lebih banyak byte dengan duplikasi 5 karakter terakhir dari masing-masing blok, tetapi ini hanya menghemat 2 byte. String yang dihasilkan dibagi menjadi elemen ruang,<= atau karakter tunggal.

Akhirnya semua ds diganti dengan nomor yang diinginkan yang disesuaikan berdasarkan indeks penggantian saat ini melalui kunci hash.

Dom Hastings
sumber
3

JavaScript, 190 189 byte

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])

Cobalah online

Shaggy
sumber
3

m4 , 194

Sepertinya pekerjaan untuk prosesor makro. Tidak yakin apakah m4 memenuhi standar kami untuk bahasa pemrograman. Itu memang memiliki kemampuan looping dan eval aritmatika, jadi saya menganggap itu dekat dengan tanda.

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,)

Ini adalah pandangan non-sepele pertama saya di m4, jadi saya curiga ada lebih banyak peluang golf yang saya lewatkan.

Input dilewatkan menggunakan -Ddefinisi makro di baris perintah. Tidak yakin apakah ada yang perlu ditambahkan ke skor untuk ini, sejauh yang saya tahu ini adalah satu-satunya cara untuk lulus parameter secara bermakna:

$ 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 $

Cobalah online .


Terima kasih @Dennis karena menambahkan m4 ke TIO begitu cepat!

Trauma Digital
sumber
1
Saya tidak melihat mengapa m4 tidak akan menjadi bahasa pemrograman yang valid untuk dijawab, tetapi apa yang saya tahu. ;) Adapun -Dargumen itu baik-baik saja. Dalam uraian tantangan saya, saya menyatakan bahwa I / O sepenuhnya fleksibel, jadi apakah Anda mengambil input sebagai STDIN, parameter fungsi, argumen baris perintah program, flag kompiler, membaca file, atau apa pun metode input lain yang dapat Anda pikirkan sepenuhnya terserah kamu.
Kevin Cruijssen
2

Python 2 , 277 199 193 189 byte

a,b=input()
for i in 4,3,2,1:x,y=i%2,i>2;e='=';p=`a`+','+`b`;print'(['[x]+p+'])'[y],e,']['[x]+p+']['[y],e,2*('{%d<%s<%s%d} %s= '%(a,e*x+'%sx',e[y:],b,i/2*' '))%('','x&&')+`a+1-x`+'..'+`b-y`

Cobalah online!

TFeld
sumber
2*('{%d<%s<%s%d} %s= '%(a,e*x+'%sx',e[y:],b,i/2*' '))%('','x&&')-> 2*('{%d<%s%%sx<%s%d} %s= '%(a,e*x,e[y:],b,i/2*' '))%('','x&&')menghemat dua :)
Jonathan Allan
1

Excel, 399 byte

="("&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

Tidak ada yang menarik di sini.

Wernisch
sumber
1

C (gcc) , 224 237 byte

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;}}

Cobalah online!

Memindahkan "<[=]" ke dalam format string memungkinkan saya untuk menghapus array sama sekali. Juga, pindah printf()ke forloop menyimpan titik koma.

Jawaban asli

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);}}

Cobalah online!

Tidak ada yang penting di sini: Saya menggunakan trik biasa untuk mencukur ukuran fungsi (mengangkat intautos ke dalam header fungsi, menggunakan gaya K&R, mengindeks ke dalam konstanta string.) Menyimpan {"<=", "<"} ke dalam array terbukti lebih efisien ukuran daripada memasukkan specifier format untuk tantangan ini karena digunakan lebih dari sekali.

ErikF
sumber
216 bytes
ceilingcat
1

Javascript, 273 258 232 byte

Terima kasih Kevin Cruijssen karena telah menyelamatkan saya 15 byte!

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]})

Cobalah online

Terima kasih untuk TFeld karena memberi saya ide itu, menghemat sekitar 60 byte dari jawaban asli saya.

Tidak Disatukan:

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 (jawaban asli), 340 byte

(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`)
Pria acak
sumber
1
Baris baru di {a<=x&&\nx<=b}seharusnya tidak ada di sana, dan Anda kehilangan yang pertama (a,b) = . Sedangkan untuk bermain golf: alih-alih waspada, Anda bisa mengembalikan hasilnya. (m)=>bisa m=>. (e,f)=>bisa e=>f=>. Dan Anda dapat menggunakan gsecara langsung bukan menciptakan let g=: m=>{return{a:e,b:f,c:e+1,d:f-1}[m]}. Cobalah secara online 258 byte . Dan mungkin lebih bisa
bermain golf
Yah, kau terlihat lebih terampil daripada aku. Terima kasih atas tipsnya, saya akan menambahkannya ke jawabannya
Orang acak
Yah, saya sebagian besar seseorang yang bermain golf di Jawa (atau Whitespace), dan tips golf ini juga berlaku untuk jawaban Java, yang sebagian besar adalah mengapa saya mengenal mereka: (m)->untuk m->; (e,f)->ke e->f->, dan var g=new int[]{...}return g[m]ke return new int[]{...}[m]. ;) Juga, saya sudah aktif di SO ini selama lebih dari dua tahun sekarang, jadi saya telah melihat jawaban JS menggunakan hal-hal semacam ini sebelumnya juga.
Kevin Cruijssen
1

Retina , 216 byte

.+
$&()][<<  ¶$&[)[[<=< ¶$&(]]]<<= ¶$&[][]<=<=
((.*),(.*))(.)(.)(.)(.)(<=?)(<=?)( *)
$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

Cobalah online! Penjelasan:

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

Membangun sebagian besar hasil.

_<=

Jika variabel terlibat dalam ketidaksetaraan longgar, maka nilainya inklusif, sehingga kami dapat menghapus placeholder.

\d+_
$&*___

Konversikan nilainya menjadi unary dan tambahkan 2.

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

Hapus placeholder untuk ketidaksamaan rendah yang ketat atau ketimpangan atas ketat negatif. Itu masih memiliki 2 ditambahkan, tetapi 1 akan dikurangi nanti, memberikan hasil yang diinginkan.

___<
_

Kurangi 2 dari ketidaksetaraan ketat non-nol lainnya, pulihkan nilai aslinya, yang darinya 1 akan dikurangkan nanti.

__<
-1

Ubah ketimpangan atas 0menjadi -1.

_(_*)
$.1

Kurangi 1 dari ketimpangan ketat yang tersisa dan konversikan ke desimal.

-0
0

Memperbaiki kasing lain.

Neil
sumber
1

Python 3, 180 byte:

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)]

penjelasan

Pada dasarnya membangun f-string yang dievaluasi dalam pemahaman daftar. %Interpolasi string gaya lama digunakan untuk menunda mengevaluasi ekspresi sampai f-string dievaluasi.

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)
    ]

Bagian pertama dari string, 'f "', akan menjadi awalan untuk f-string.

Bagian kedua dari string membangun format string untuk dua ekspresi interval pertama. %rdigunakan untuk menyimpan agar tidak perlu mengutip dalam format, yaitu "{%r[j]}"sama dengan "{'%s'[j]}". Ketika f-string dievaluasi, braket yang benar dipilih.

Bagian ketiga dari string membangun dua ekspresi interval berikutnya.

Bagian terakhir memformat bagian "a..b" dari f-string.

F-string yang dirakit terlihat seperti: f"{'(['[j]}{a},{b}{')]'[i]} = .... = {a+j}..{b-i}"

Ketika f-string dievaluasi, semua ekspresi dalam kurung {}digantikan oleh nilainya. Jadi, {a}akan diganti dengan nilai a, dan {'(['[j]}digantikan oleh (jika j adalah 0 atau [jika j adalah 1.

RootTwo
sumber
1

SOGL V0.12 , 110 byte

<ŗŗ}”⁴
"{ŗ<ŗx³
W}↔b ,e++Κ+²
4∫2\f»¹Aa{Ƨ[(²a{Ƨ[]²ba{ =*}eο+++:³⁴;³&&x⁴a_beh+H⁶;!+ƨ.+Κο++++}⁰№Iā;0E{┼ē4=‽"δY↑æ‘┼

Coba Di Sini!

dzaima
sumber
0

Python 3, 248 byte

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])))

Cobalah online!

Guoyang Qin
sumber