C++, 672671 bytes
#import<bits/stdc++.h>
#define c(s);else if(B==#s)
#define e(n)(n=regex_replace(n,regex{"^ *(.*?) *(#.*)?$"},"1ドル"))[0]
#define i(x)get<x+0>(p[j-1])
#define k n[o[0]]
#define U;using
int j,v;U namespace std;U g=string;U h=istream_iterator<g>U s=deque<g>;map<g,s>m;map<g,int>n;tuple<int,s,s>p[999];main(){g Y;for(s X(3);getline(cin,Y);)if(e(Y))for(p[j++]={0,{Y,"",""},{}};bool z=j;){g B;s C,o;copy(h(stringstream(i(1)[i()])>>B),h(),back_inserter(C));for(g x:C)o.push_back((v=atoi(&x[0]))>0?i(2)[v-1]:x);if(0)c()c(p)cout<<o[0]+" = "<<k<<'\n'c(i)k++c(d)k-=z=k c(a)for(g&y:X)for(;getline(cin,y),m[o[0]]=X,!e(y););else{p[j++]={0,m[B],o};continue;}while(j*i())j--;i()-=!!j*~!z;}}
#import<bits/stdc++.h>
#define c(s);else if(B==#s)
#define e(n)(n=regex_replace(n,regex{"^ *(.*?) *(#.*)?$"},"1ドル"))[0]
#define i(x)get<x+0>(p[j-1])
#define k n[o[0]]
#define U;using
int j,v,z;U namespace std;U g=string;U h=istream_iterator<g>U s=deque<g>;map<g,s>m;map<g,int>n;tuple<int,s,s>p[999];main(){g Y;for(s X(3);getline(cin,Y);)if(e(Y))for(p[j++]={0,{Y,"",""},{}};z=j;){g B;s C,o;copy(h(stringstream(i(1)[i()])>>B),h(),back_inserter(C));for(g x:C)o.push_back((v=atoi(&x[0]))>0?i(2)[v-1]:x);if(0)c()c(p)cout<<o[0]+" = "<<k<<'\n'c(i)k++c(d)k-=z=!!k c(a)for(g&y:X)for(;getline(cin,y),m[o[0]]=X,!e(y););else{p[j++]={0,m[B],o};continue;}while(j*i())j--;i()-=!!j*~!z;}}
Below is the original. If anyone can think of a way to make it more idiomatic and shorter at the same time please let me know.
#include <array>
#include <iostream>
#include <map>
#include <regex>
#include <sstream>
#include <stack>
typedef std::vector<std::string> List;
typedef std::pair<std::string, List> Statement;
typedef std::array<std::string, 3> Alias;
typedef std::pair<long, Alias> IndexedAlias;
typedef std::pair<IndexedAlias, List> Item;
std::map<std::string, Alias> aliases;
std::map<std::string, long> variables;
std::stack<Item> stack;
std::regex re("^ *(.*?) *(#.*)?$");
int main()
{
std::string line, line1, line2, line3;
while (std::getline(std::cin, line)) // control-Z to exit
{
line = std::regex_replace(line, re, "1ドル");
if (line.empty()) continue;
stack.push(Item{ { 0, { { line, "", "" } } }, {} });
bool flag;
while (!stack.empty())
{
Statement statement;
std::istringstream ss(stack.top().first.second[stack.top().first.first]);
ss >> statement.first;
std::copy(std::istream_iterator<std::string>(ss), std::istream_iterator<std::string>(), std::back_inserter(statement.second));
List arguments;
std::transform(std::begin(statement.second), std::end(statement.second), std::back_inserter(arguments),
[](std::string arg){ int i = atoi(arg.c_str()); return i > 0 ? stack.top().second[i - 1] : arg; });
flag = true;
if (statement.first == "")
;
else if (statement.first == "p")
std::cout << arguments[0] << " = " << variables[arguments[0]] << std::endl;
else if (statement.first == "i")
variables[arguments[0]]++;
else if (statement.first == "d")
variables[arguments[0]] -= (flag = variables[arguments[0]]);
else if (statement.first == "a")
{
do { std::getline(std::cin, line1); line1 = std::regex_replace(line1, re, "1ドル"); } while (line1.empty());
do { std::getline(std::cin, line2); line2 = std::regex_replace(line2, re, "1ドル"); } while (line2.empty());
do { std::getline(std::cin, line3); line3 = std::regex_replace(line3, re, "1ドル"); } while (line3.empty());
aliases.insert(std::make_pair(arguments[0], Alias{ { line1, line2, line3 } }));
}
else
{
stack.push(Item{ { 0, aliases[statement.first] }, arguments });
continue;
}
while (!stack.empty() && stack.top().first.first) stack.pop();
if (!stack.empty()) stack.top().first.first += 1 + !flag;
}
}
std::cout << "-- Variables --" << std::endl;
std::transform(std::begin(variables), std::end(variables), std::ostream_iterator<std::string>(std::cout, "\n"),
[](std::map<std::string, long>::value_type pair){ std::ostringstream ss; ss << pair.first << " = " << pair.second; return ss.str(); });
std::cout << "-- Aliases --" << std::endl;
std::transform(std::begin(aliases), std::end(aliases), std::ostream_iterator<std::string>(std::cout, "\n"),
[](std::map<std::string, Alias>::value_type pair){ std::ostringstream ss; ss << pair.first << " = [1]:" << pair.second[0] << " [2]:" << pair.second[1] << " [3]:" << pair.second[1]; return ss.str(); });
std::cout << "---------------" << std::endl;
return 0;
}
#include <array>
#include <iostream>
#include <map>
#include <regex>
#include <sstream>
#include <stack>
typedef std::vector<std::string> List;
typedef std::pair<std::string, List> Statement;
typedef std::array<std::string, 3> Alias;
typedef std::pair<long, Alias> IndexedAlias;
typedef std::pair<IndexedAlias, List> Item;
std::map<std::string, Alias> aliases;
std::map<std::string, long> variables;
std::stack<Item> stack;
std::regex re("^ *(.*?) *(#.*)?$");
int main()
{
std::string line, line1, line2, line3;
while (std::getline(std::cin, line)) // control-Z to exit
{
line = std::regex_replace(line, re, "1ドル");
if (line.empty()) continue;
stack.push(Item{ { 0, { { line, "", "" } } }, {} });
bool flag;
while (!stack.empty())
{
Statement statement;
std::istringstream ss(stack.top().first.second[stack.top().first.first]);
ss >> statement.first;
std::copy(std::istream_iterator<std::string>(ss), std::istream_iterator<std::string>(), std::back_inserter(statement.second));
List arguments;
std::transform(std::begin(statement.second), std::end(statement.second), std::back_inserter(arguments),
[](std::string arg){ int i = atoi(arg.c_str()); return i > 0 ? stack.top().second[i - 1] : arg; });
flag = true;
if (statement.first == "")
;
else if (statement.first == "p")
std::cout << arguments[0] << " = " << variables[arguments[0]] << std::endl;
else if (statement.first == "i")
variables[arguments[0]]++;
else if (statement.first == "d")
variables[arguments[0]] -= (flag = variables[arguments[0]]);
else if (statement.first == "a")
{
do { std::getline(std::cin, line1); line1 = std::regex_replace(line1, re, "1ドル"); } while (line1.empty());
do { std::getline(std::cin, line2); line2 = std::regex_replace(line2, re, "1ドル"); } while (line2.empty());
do { std::getline(std::cin, line3); line3 = std::regex_replace(line3, re, "1ドル"); } while (line3.empty());
aliases.insert(std::make_pair(arguments[0], Alias{ { line1, line2, line3 } }));
}
else
{
stack.push(Item{ { 0, aliases[statement.first] }, arguments });
continue;
}
while (!stack.empty() && stack.top().first.first) stack.pop();
if (!stack.empty()) stack.top().first.first += 1 + !flag;
}
}
std::cout << "-- Variables --" << std::endl;
std::transform(std::begin(variables), std::end(variables), std::ostream_iterator<std::string>(std::cout, "\n"),
[](std::map<std::string, long>::value_type pair){ std::ostringstream ss; ss << pair.first << " = " << pair.second; return ss.str(); });
std::cout << "-- Aliases --" << std::endl;
std::transform(std::begin(aliases), std::end(aliases), std::ostream_iterator<std::string>(std::cout, "\n"),
[](std::map<std::string, Alias>::value_type pair){ std::ostringstream ss; ss << pair.first << " = [1]:" << pair.second[0] << " [2]:" << pair.second[1] << " [3]:" << pair.second[1]; return ss.str(); });
std::cout << "---------------" << std::endl;
return 0;
}
C++, 672 bytes
#import<bits/stdc++.h>
#define c(s);else if(B==#s)
#define e(n)(n=regex_replace(n,regex{"^ *(.*?) *(#.*)?$"},"1ドル"))[0]
#define i(x)get<x+0>(p[j-1])
#define k n[o[0]]
#define U;using
int j,v;U namespace std;U g=string;U h=istream_iterator<g>U s=deque<g>;map<g,s>m;map<g,int>n;tuple<int,s,s>p[999];main(){g Y;for(s X(3);getline(cin,Y);)if(e(Y))for(p[j++]={0,{Y,"",""},{}};bool z=j;){g B;s C,o;copy(h(stringstream(i(1)[i()])>>B),h(),back_inserter(C));for(g x:C)o.push_back((v=atoi(&x[0]))>0?i(2)[v-1]:x);if(0)c()c(p)cout<<o[0]+" = "<<k<<'\n'c(i)k++c(d)k-=z=k c(a)for(g&y:X)for(;getline(cin,y),m[o[0]]=X,!e(y););else{p[j++]={0,m[B],o};continue;}while(j*i())j--;i()-=!!j*~!z;}}
Below is the original. If anyone can think of a way to make it more idiomatic and shorter at the same time please let me know.
#include <array>
#include <iostream>
#include <map>
#include <regex>
#include <sstream>
#include <stack>
typedef std::vector<std::string> List;
typedef std::pair<std::string, List> Statement;
typedef std::array<std::string, 3> Alias;
typedef std::pair<long, Alias> IndexedAlias;
typedef std::pair<IndexedAlias, List> Item;
std::map<std::string, Alias> aliases;
std::map<std::string, long> variables;
std::stack<Item> stack;
std::regex re("^ *(.*?) *(#.*)?$");
int main()
{
std::string line, line1, line2, line3;
while (std::getline(std::cin, line)) // control-Z to exit
{
line = std::regex_replace(line, re, "1ドル");
if (line.empty()) continue;
stack.push(Item{ { 0, { { line, "", "" } } }, {} });
bool flag;
while (!stack.empty())
{
Statement statement;
std::istringstream ss(stack.top().first.second[stack.top().first.first]);
ss >> statement.first;
std::copy(std::istream_iterator<std::string>(ss), std::istream_iterator<std::string>(), std::back_inserter(statement.second));
List arguments;
std::transform(std::begin(statement.second), std::end(statement.second), std::back_inserter(arguments),
[](std::string arg){ int i = atoi(arg.c_str()); return i > 0 ? stack.top().second[i - 1] : arg; });
flag = true;
if (statement.first == "")
;
else if (statement.first == "p")
std::cout << arguments[0] << " = " << variables[arguments[0]] << std::endl;
else if (statement.first == "i")
variables[arguments[0]]++;
else if (statement.first == "d")
variables[arguments[0]] -= (flag = variables[arguments[0]]);
else if (statement.first == "a")
{
do { std::getline(std::cin, line1); line1 = std::regex_replace(line1, re, "1ドル"); } while (line1.empty());
do { std::getline(std::cin, line2); line2 = std::regex_replace(line2, re, "1ドル"); } while (line2.empty());
do { std::getline(std::cin, line3); line3 = std::regex_replace(line3, re, "1ドル"); } while (line3.empty());
aliases.insert(std::make_pair(arguments[0], Alias{ { line1, line2, line3 } }));
}
else
{
stack.push(Item{ { 0, aliases[statement.first] }, arguments });
continue;
}
while (!stack.empty() && stack.top().first.first) stack.pop();
if (!stack.empty()) stack.top().first.first += 1 + !flag;
}
}
std::cout << "-- Variables --" << std::endl;
std::transform(std::begin(variables), std::end(variables), std::ostream_iterator<std::string>(std::cout, "\n"),
[](std::map<std::string, long>::value_type pair){ std::ostringstream ss; ss << pair.first << " = " << pair.second; return ss.str(); });
std::cout << "-- Aliases --" << std::endl;
std::transform(std::begin(aliases), std::end(aliases), std::ostream_iterator<std::string>(std::cout, "\n"),
[](std::map<std::string, Alias>::value_type pair){ std::ostringstream ss; ss << pair.first << " = [1]:" << pair.second[0] << " [2]:" << pair.second[1] << " [3]:" << pair.second[1]; return ss.str(); });
std::cout << "---------------" << std::endl;
return 0;
}
C++, 671 bytes
#import<bits/stdc++.h>
#define c(s);else if(B==#s)
#define e(n)(n=regex_replace(n,regex{"^ *(.*?) *(#.*)?$"},"1ドル"))[0]
#define i(x)get<x+0>(p[j-1])
#define k n[o[0]]
#define U;using
int j,v,z;U namespace std;U g=string;U h=istream_iterator<g>U s=deque<g>;map<g,s>m;map<g,int>n;tuple<int,s,s>p[999];main(){g Y;for(s X(3);getline(cin,Y);)if(e(Y))for(p[j++]={0,{Y,"",""},{}};z=j;){g B;s C,o;copy(h(stringstream(i(1)[i()])>>B),h(),back_inserter(C));for(g x:C)o.push_back((v=atoi(&x[0]))>0?i(2)[v-1]:x);if(0)c()c(p)cout<<o[0]+" = "<<k<<'\n'c(i)k++c(d)k-=z=!!k c(a)for(g&y:X)for(;getline(cin,y),m[o[0]]=X,!e(y););else{p[j++]={0,m[B],o};continue;}while(j*i())j--;i()-=!!j*~!z;}}
Below is the original.
#include <array>
#include <iostream>
#include <map>
#include <regex>
#include <sstream>
#include <stack>
typedef std::vector<std::string> List;
typedef std::pair<std::string, List> Statement;
typedef std::array<std::string, 3> Alias;
typedef std::pair<long, Alias> IndexedAlias;
typedef std::pair<IndexedAlias, List> Item;
std::map<std::string, Alias> aliases;
std::map<std::string, long> variables;
std::stack<Item> stack;
std::regex re("^ *(.*?) *(#.*)?$");
int main()
{
std::string line, line1, line2, line3;
while (std::getline(std::cin, line)) // control-Z to exit
{
line = std::regex_replace(line, re, "1ドル");
if (line.empty()) continue;
stack.push(Item{ { 0, { { line, "", "" } } }, {} });
bool flag;
while (!stack.empty())
{
Statement statement;
std::istringstream ss(stack.top().first.second[stack.top().first.first]);
ss >> statement.first;
std::copy(std::istream_iterator<std::string>(ss), std::istream_iterator<std::string>(), std::back_inserter(statement.second));
List arguments;
std::transform(std::begin(statement.second), std::end(statement.second), std::back_inserter(arguments),
[](std::string arg){ int i = atoi(arg.c_str()); return i > 0 ? stack.top().second[i - 1] : arg; });
flag = true;
if (statement.first == "")
;
else if (statement.first == "p")
std::cout << arguments[0] << " = " << variables[arguments[0]] << std::endl;
else if (statement.first == "i")
variables[arguments[0]]++;
else if (statement.first == "d")
variables[arguments[0]] -= (flag = variables[arguments[0]]);
else if (statement.first == "a")
{
do { std::getline(std::cin, line1); line1 = std::regex_replace(line1, re, "1ドル"); } while (line1.empty());
do { std::getline(std::cin, line2); line2 = std::regex_replace(line2, re, "1ドル"); } while (line2.empty());
do { std::getline(std::cin, line3); line3 = std::regex_replace(line3, re, "1ドル"); } while (line3.empty());
aliases.insert(std::make_pair(arguments[0], Alias{ { line1, line2, line3 } }));
}
else
{
stack.push(Item{ { 0, aliases[statement.first] }, arguments });
continue;
}
while (!stack.empty() && stack.top().first.first) stack.pop();
if (!stack.empty()) stack.top().first.first += 1 + !flag;
}
}
std::cout << "-- Variables --" << std::endl;
std::transform(std::begin(variables), std::end(variables), std::ostream_iterator<std::string>(std::cout, "\n"),
[](std::map<std::string, long>::value_type pair){ std::ostringstream ss; ss << pair.first << " = " << pair.second; return ss.str(); });
std::cout << "-- Aliases --" << std::endl;
std::transform(std::begin(aliases), std::end(aliases), std::ostream_iterator<std::string>(std::cout, "\n"),
[](std::map<std::string, Alias>::value_type pair){ std::ostringstream ss; ss << pair.first << " = [1]:" << pair.second[0] << " [2]:" << pair.second[1] << " [3]:" << pair.second[1]; return ss.str(); });
std::cout << "---------------" << std::endl;
return 0;
}
C++, 698672 bytes
#import<bits/stdc++.h>
#define c(s);else if(B==#s)
#define e(n)(n=regex_replace(n,regex{"^ *(.*?) *(#.*)?$"},"1ドル"))[0]
#define i(x)get<x+0>(p.top())
#define j p.size(p[j-1])
#define k n[o[0]]
#define U;using
Uint j,v;U namespace std;U g=string;U h=istream_iterator<g>U s=deque<g>;map<g,s>m;map<g,int>n;stack<tuple<intint>n;tuple<int,s,s>>p;mains>p[999];main(int v){g Y;for(s X(3);getline(cin,Y);)if(e(Y))for(p.push(p[j++]={0,{Y,"",""},{}});bool z=j;){g B;s C,o;copy(h(stringstream(i(1)[i()])>>B),h(),back_inserter(C));for(g x:C)o.push_back((v=atoi(&x[0]))>0?i(2)[v-1]:x);if(0)c()c(p)cout<<o[0]+" = "<<k<<'\n'c(i)k++c(d)k-=z=k c(a)for(g&y:X)for(;getline(cin,y),m[o[0]]=X,!e(y););else{p.push(p[j++]={0,m[B],o});continue;}while(j&&ij*i())p.pop();j?ij--;i()-=~=!z:0;!j*~!z;}}
C++, 698 bytes
#import<bits/stdc++.h>
#define c(s);else if(B==#s)
#define e(n)(n=regex_replace(n,regex{"^ *(.*?) *(#.*)?$"},"1ドル"))[0]
#define i(x)get<x+0>(p.top())
#define j p.size()
#define k n[o[0]]
#define U;using
U namespace std;U g=string;U h=istream_iterator<g>U s=deque<g>;map<g,s>m;map<g,int>n;stack<tuple<int,s,s>>p;main(int v){g Y;for(s X(3);getline(cin,Y);)if(e(Y))for(p.push({0,{Y,"",""},{}});bool z=j;){g B;s C,o;copy(h(stringstream(i(1)[i()])>>B),h(),back_inserter(C));for(g x:C)o.push_back((v=atoi(&x[0]))>0?i(2)[v-1]:x);if(0)c()c(p)cout<<o[0]+" = "<<k<<'\n'c(i)k++c(d)k-=z=k c(a)for(g&y:X)for(;getline(cin,y),m[o[0]]=X,!e(y););else{p.push({0,m[B],o});continue;}while(j&&i())p.pop();j?i()-=~!z:0;}}
C++, 672 bytes
#import<bits/stdc++.h>
#define c(s);else if(B==#s)
#define e(n)(n=regex_replace(n,regex{"^ *(.*?) *(#.*)?$"},"1ドル"))[0]
#define i(x)get<x+0>(p[j-1])
#define k n[o[0]]
#define U;using
int j,v;U namespace std;U g=string;U h=istream_iterator<g>U s=deque<g>;map<g,s>m;map<g,int>n;tuple<int,s,s>p[999];main(){g Y;for(s X(3);getline(cin,Y);)if(e(Y))for(p[j++]={0,{Y,"",""},{}};bool z=j;){g B;s C,o;copy(h(stringstream(i(1)[i()])>>B),h(),back_inserter(C));for(g x:C)o.push_back((v=atoi(&x[0]))>0?i(2)[v-1]:x);if(0)c()c(p)cout<<o[0]+" = "<<k<<'\n'c(i)k++c(d)k-=z=k c(a)for(g&y:X)for(;getline(cin,y),m[o[0]]=X,!e(y););else{p[j++]={0,m[B],o};continue;}while(j*i())j--;i()-=!!j*~!z;}}
C++, 699698 bytes
#import<bits/stdc++.h>
#define c(s);else if(B==#s)
#define e(n)(n=regex_replace(n,regex{"^ *(.*?) *(#.*)?$"},"1ドル"))[0]
#define i(x)get<x+0>(p.top())
#define j p.size()
#define k n[o[0]]
#define U;using
U namespace std;U g=string;U h=istream_iterator<g>U s=vector<g>;map<gs=deque<g>;map<g,s>m;map<g,int>n;stack<tuple<int,s,s>>p;main(int v){g Y;for(s X(3);getline(cin,Y);)if(e(Y))for(p.push({0,{Y,"",""},{}});bool z=j;){g B;s C,o;copy(h(stringstream(i(1)[i()])>>B),h(),back_inserter(C));for(g x:C)o.push_back((v=atoi(&x[0]))>0?i(2)[v-1]:x);if(0)c()c(p)cout<<o[0]+" = "<<k<<'\n'c(i)k++c(d)k-=z=k c(a)for(g&y:X)for(;getline(cin,y),m[o[0]]=X,!e(y););else{p.push({0,m[B],o});continue;}while(j&&i())p.pop();j?i()-=~!z:0;}}
C++, 699 bytes
#import<bits/stdc++.h>
#define c(s);else if(B==#s)
#define e(n)(n=regex_replace(n,regex{"^ *(.*?) *(#.*)?$"},"1ドル"))[0]
#define i(x)get<x+0>(p.top())
#define j p.size()
#define k n[o[0]]
#define U;using
U namespace std;U g=string;U h=istream_iterator<g>U s=vector<g>;map<g,s>m;map<g,int>n;stack<tuple<int,s,s>>p;main(int v){g Y;for(s X(3);getline(cin,Y);)if(e(Y))for(p.push({0,{Y,"",""},{}});bool z=j;){g B;s C,o;copy(h(stringstream(i(1)[i()])>>B),h(),back_inserter(C));for(g x:C)o.push_back((v=atoi(&x[0]))>0?i(2)[v-1]:x);if(0)c()c(p)cout<<o[0]+" = "<<k<<'\n'c(i)k++c(d)k-=z=k c(a)for(g&y:X)for(;getline(cin,y),m[o[0]]=X,!e(y););else{p.push({0,m[B],o});continue;}while(j&&i())p.pop();j?i()-=~!z:0;}}
C++, 698 bytes
#import<bits/stdc++.h>
#define c(s);else if(B==#s)
#define e(n)(n=regex_replace(n,regex{"^ *(.*?) *(#.*)?$"},"1ドル"))[0]
#define i(x)get<x+0>(p.top())
#define j p.size()
#define k n[o[0]]
#define U;using
U namespace std;U g=string;U h=istream_iterator<g>U s=deque<g>;map<g,s>m;map<g,int>n;stack<tuple<int,s,s>>p;main(int v){g Y;for(s X(3);getline(cin,Y);)if(e(Y))for(p.push({0,{Y,"",""},{}});bool z=j;){g B;s C,o;copy(h(stringstream(i(1)[i()])>>B),h(),back_inserter(C));for(g x:C)o.push_back((v=atoi(&x[0]))>0?i(2)[v-1]:x);if(0)c()c(p)cout<<o[0]+" = "<<k<<'\n'c(i)k++c(d)k-=z=k c(a)for(g&y:X)for(;getline(cin,y),m[o[0]]=X,!e(y););else{p.push({0,m[B],o});continue;}while(j&&i())p.pop();j?i()-=~!z:0;}}
Loading
Loading
Loading
Loading
Loading
Jerry Jeremiah
- 1.4k
- 10
- 10
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading