Spin the Calculator
SOGL V0.12, 70 69 67 bytes
i⅛⁸Νο;⌡░▼Y6γj±²‘1n4n.⌡Iø,→{_≤whwιh:"/*-+”;W? )Κ; (Κ;}+}:Ƨ)(čøŗoļ=→p
Try it Here, or try a version which takes inputs as given in the test-cases
uses SOGLs I
operator, which rotates the array. Then reads a string as a JavaScript array, and where an operation is used, encase previous result in parentheses, evaluates as JavaScript and then removes the parentheses.
Dyalog APL, 94 88 86 85 bytes
{o,'=',⍎('('\⍨+/'+-×÷'∊⍨o),'[×÷+-]'⎕R')&'⊢o←(((⌽∘⍉⍣⍺)4 4⍴'789÷456×123-00.+')⊃⍨⊂∘⊢)¨⍵}
Try it online!
Takes the rotations as left argument, 0-3
, and the 1-based indices as right argument, as a list of y x
coordinates, like (1 1)(2 3)(4 5)
etc.
This got quite messy because of the right-handed evaluation of expressions in APL.
C (gcc), 282 294 295 296 300 304 306 310 bytes
All optimizations need to be turned off and only work on 32-bit GCC.
float r,s;k,p,l,i;g(d,x,y){int w[]={y,x,3-y,3-x,y};d=w[d+1]*4+w[d];}f(x,y,z)int**z;{for(i=0;i<=y;i++)putchar(k=i-y?"789/456*123-00.+"[g(x,z[i][0],z[i][1])]:61),57/k*k/48?p?r+=(k-48)*pow(10,p--):(r=10*r+k-48):k-46?s=l?l%2?l%5?l&4?s/r:s+r:s-r:s*r:r,r=p=0,l=k:(p=-1);printf("%.3f",s);}
1 byte thanks to @Orion!
Try it online!
Function prototype:
f(<Direction 0-3>, <Number of entries>, <a int** typed array in [N][2]>)
Input format (as on TIO):
<Direction 0~3> <Number of entries>
<Entries 0 Row> <Entries 0 Column>
<Entries 1 Row> <Entries 1 Column>
....
<Entries N Row> <Entries N Column>
Ungolfed version with comments:
float r, s;
k, p, l, i;
g(d, x, y) {
int w[] = {
y,
x,
3 - y,
3 - x,
y
};
d = w[d + 1] * 4 + w[d];
}
f(x, y, z) int **z; {
for (i = 0; i <= y; i++)
{
putchar(k = i - y ?
"789/456*123-00.+"[g(x, z[i][0], z[i][1])] : 61), // Print character, otherwise, '='
57 / k * k / 48 ? // If the character is from '0'~'9'
p ? // If it is after or before a dot
r += (k - 48) * pow(10., p--) // +k*10^-p
:
(r = 10 * r + k - 48) // *10+k
:
k - 46 ? // If the character is not '.', that is, an operator, + - * / =
s = l ? // Calculate the result of previous step (if exist)
l % 2 ? // If + - /
l % 5 ? // If + /
l & 4 ?
s / r
:
s + r
:
s - r
:
s * r
:
r,
r = p = 0, l = k // Reset all bits
:
(p = -1); // Reverse the dot bit
}
printf("%.3f", s);
}
The code can handle cases such as 1+.7
or -8*4
.
Very sad C doesn't have an eval
.