Skip to content

Instantly share code, notes, and snippets.

@Kokan
Created June 22, 2019 07:25
Show Gist options
  • Save Kokan/86edd189279266fe33eb5daf43a0be18 to your computer and use it in GitHub Desktop.
Save Kokan/86edd189279266fe33eb5daf43a0be18 to your computer and use it in GitHub Desktop.
/*
Rangsorolás Mázli Ellenõrzõ, 2008-08-26 +++ eltemods +++
A program egy parancssori mázli számító, amivel ellenõrizheti az ETR-ben kiszámolt
mázli értékeket.
Fordítás Linux alatt (pl. caesar.elte.hu gépen): g++ -o rme rme.cc
Fordítás Visual C++-szal: cl.exe rme.cc /EHsc
*/
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int eltemods_mazli2( const string& eha, const string& ciklus, int kurzusszervezo_azonosito )
{
const int p = 2147483647;
long long r;
// kurzusszervezo_azonosito
r = kurzusszervezo_azonosito;
int icikl = ((ciklus[ 8 ]-'0')%5)*2+ciklus[ 10 ]-'1';
r = (r*10+icikl)%p;
// eha
int eha_len;
if( eha.find( ".ELTE" ) != eha.npos )
eha_len = eha.find( ".ELTE" );
else
eha_len = eha.length();
for( int i = 0; i < eha_len; ++i )
r = (r*26+eha[ i ]-'A')%p;
// LFSR elmélet: http://www-math.cudenver.edu/~wcherowi/courses/m5410/m5410fsr.html
// primitív polinom LFSR-hez:
// http://www.newwaveinstruments.com/resources/articles/m_sequence_linear_feedback_shift_register_lfsr/misc.txt
// 31 stages, 16 taps, line #15
// [31, 29, 27, 25, 23, 21, 18, 16, 15, 13, 11, 9, 8, 7, 5, 2]
const int C = 1431492050;
// LFSR regiszterek inicializálása
int s = r; // 31 darab LFSR regiszter az alsó 31 biten
// output generálása
for( int i = 0; i < 31*3; ++i )
{
int s0 = 0;
int Cands = C & s;
while( Cands )
{
s0 = (s0+(Cands & 1)) & 1;
Cands >>= 1;
}
s = ((s & 0x3fffffff) << 1) | s0;
}
return s;
}
int main( int argc, char* argv[] )
{
int rv = 0;
if( argc != 4 )
{
cerr << "Rangsorolás Mázli Ellenõrzõ 2008-08-26 +++ eltemods +++" << endl << endl <<
"Használat: rme EHA ciklus kurzusszervezõ_azonosító" << endl <<
"Pl.: rme PRPKAAI.ELTE 2008-2009-1 462978" << endl;
rv = 10;
}
string eha;
if( !rv )
{
eha = argv[ 1 ];
for( int i = 0; i < eha.length(); ++i )
if( eha[ i ] >= 'a' && eha[ i ] <= 'z' )
eha[ i ] += 'A'-'a';
if( eha.rfind( ".ELTE" ) == string::npos || eha.rfind( ".ELTE" )+5 != eha.length() )
{
cerr << "Az EHA (" << argv[ 1 ] << ") \".ELTE\"-re végzõdjön!" << endl;
rv = 20;
}
}
string ciklus;
if( !rv )
{
ciklus = argv[ 2 ];
if( ciklus.length() != 11 || ciklus[ 4 ] != '-' || ciklus[ 9 ] != '-' ||
ciklus[ 10 ] != '1' && ciklus[ 10 ] != '2' )
{
cerr << "A ciklus (" << argv[ 2 ] <<") helyes formája 2008-2009-1 alakú!" << endl;
rv = 30;
}
else if( ciklus < "2008-2009-1" )
{
cerr << "A program csak a 2008-2009-1 ciklusban bevezetett mázli formát támogatja!" << endl;
rv = 31;
}
}
int kurzusszervezo_azonosito;
if( !rv )
{
istringstream iss( argv[ 3 ] );
if( !( iss >> kurzusszervezo_azonosito ))
{
cerr << "A kurzusszervezõ azonosító (" << argv[ 3 ] << ") nem szám!" << endl;
rv = 40;
}
else if( kurzusszervezo_azonosito < 447404 )
{
cerr << "2008-2009-1 ciklustól a kurzusszervezõk azonosítója legalább 447404!" << endl;
rv = 41;
}
}
if( !rv )
{
cout <<
"EHA: " << eha << endl <<
"Ciklus: " << ciklus << endl <<
"Kurzusszervezõ azonosító: " << kurzusszervezo_azonosito << endl;
int mazli = eltemods_mazli2( eha, ciklus, kurzusszervezo_azonosito );
cout << "Mázli: " << mazli << endl;
}
return rv;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment