Quarantine challenge

chriskgnr

Retro Guru
Messages
2,053
Reaction score
515
Points
123
Μόνο BASIC; Γιατί όχι C αν υπάρχει κάποιος compiler; Φυσικά όποιος θέλει μπορεί να το γράψει σε οποιαδήποτε γλώσσα προγραμματισμού.

Υπολογισμός ψηφίων π. Εδώ για τον ZX81, το listing είναι από τον πρωτότυπο κώδικα.

Code:
#include <stdio.h>

int main() {
    int r[2800 + 1];
    int i, k;
    int b, d;
    int c = 0;

    for (i = 0; i < 2800; i++) {
        r[i] = 2000;
    }

    for (k = 2800; k > 0; k -= 14) {
        d = 0;

        i = k;
        for (;;) {
            d += r[i] * 10000;
            b = 2 * i - 1;

            r[i] = d % b;
            d /= b;
            i--;
            if (i == 0) break;
            d *= i;
        }
        printf("%.4d", c + d / 10000);
        c = d % 10000;
    }

    return 0;
}
Για δώσε μιά εξήγηση Μάνο για το int r[2800 + 1]; και το for ( ; ; )
 

sly*m

Retro Addict
Messages
529
Reaction score
1,364
Points
103
Για δώσε μιά εξήγηση Μάνο για το int r[2800 + 1]; και το for ( ; ; )
int r[2800 + 1] δήλωση πίνακα (array) 2801 ακεραίων: DIM R(2800+1)
for ( ; ; ) ατέρμων βρόγχος που φεύγει με break
π.χ.
10 I=10
20 I=I-1:IF I=0 GOTO 40
30 GOTO 20
40 ... ... ...
 

dimfil

Retro Mentor
Messages
1,095
Reaction score
1,811
Points
123
Επειδή η C με τον ένα ή τον άλλο τρόπο κατά μία έννοια "ζει" μέχρι σήμερα, δεν μου προκαλεί ενδιαφέρον να τη χρησιμοποιήσω στα πλαίσια του χόμπι μας!
Δεν φαντάζομαι τον εαυτό μου να ανοίγει τον XL πχ και να ασχολούμαι με τη C. Δεν μου φέρνει καμία απολύτως ανάμνηση...

Ωστόσο έχει ενδιαφέρον αυτό που ανέφερες, στο επίπεδο των αλγορίθμων. Αλλά ο στόχος της Basic νομίζω παραμένει πιο χομπίστικος, οπότε είναι και πιο διασκεδαστικό. Την C πρέπει να την έχεις διδαχθεί ή να υπήρξε αφορμή για να ασχοληθείς μαζί της, η Basic όμως είναι μια γλώσσα που πολλοί ασχολήθηκαν ακόμα και αν η πληροφορική τελικά δεν είναι κάτι που τους κέρδισε επαγγελματικά.
 

ChrisTOS

Retro Enthusiast
Messages
310
Reaction score
489
Points
63
Προσωπικά δεν έχω πρόβλημα αν το listing είναι σε BASIC, C, Pascal, Forth ή οτιδήποτε άλλο. Απλά πρότεινα την BASIC γιατί ήταν η default στα micros στις περισσότερες περιπτώσεις.
 

chriskgnr

Retro Guru
Messages
2,053
Reaction score
515
Points
123
int r[2800 + 1] δήλωση πίνακα (array) 2801 ακεραίων: DIM R(2800+1)
for ( ; ; ) ατέρμων βρόγχος που φεύγει με break
π.χ.
10 I=10
20 I=I-1:IF I=0 GOTO 40
30 GOTO 20
40 ... ... ...
γιατί η δήλωση είναι με +1 στον μονοδιάστατο πίνακα?
 

konc

Retro Enthusiast
Messages
399
Reaction score
353
Points
63
Προσωπικά επικροτώ εμφάνιση listings σε C για 3 λόγους:
-Έχει μεγαλύτερη σχέση με τη σημερινή πραγματικότητα και διαβάζεται πιο εύκολα από κάποιον που γράφει σε μια σύγχρονη γλώσσα. Γλυτώνεις το mind fuck να πρέπει ξαφνικά να γυρίσεις σε σύνταξη 30 ετών που δεν χρησιμοποιείται πουθενά πλέον.
-Έχει συμβατότητα σε επίπεδο compiler, που σημαίνει ότι το ίδιο πρόγραμμα θα τρέξει ανεξαρτήτως μηχανήματος σε όποιο μηχάνημα έχει target ο compiler για πειραματισμούς. Ειδικά αν είναι ANSI C κυριολεκτικά σε όποιο μηχάνημα έχει κάποιον c compiler

-Το κυριότερο: αν δεν έχει inline assembly, ακραία data types κλπ και μιλάμε για απλούς αλγόριθμους, είναι απείρως πιο εύκολο να
το διαβάζεις και να το ξαναγράψεις σε όποια γλώσσα θέλεις. Δεν μιλάμε για port πια προσπαθώντας να μετατρέψουμε τις ιδιαιτερότητες της κάθε ενσωματωμένης BASIC σε μία άλλη με τις δικές της ιδιαιτερότητες, αλλά μεταφορά του αλγόριθμου από την αρχή σε άλλη γλώσσα. πχ το συγκεκριμένο είναι μερικά loop, πράξεις και console output. Τι το εμποδίζει να γραφεί σε κάποια BASIC?
 

konc

Retro Enthusiast
Messages
399
Reaction score
353
Points
63
γιατί η δήλωση είναι με +1 στον μονοδιάστατο πίνακα?
το size είναι 2800+1, δηλαδή οι θέσεις 0-2800
στο πρώτο πέρασμα στο inner loop for (k = 2800... κάνει access τη θέση 2800
το θέμα είναι ότι στο πρώτο loop δεν την έχει γεμίσει με κάτι και περιέχει ακόμα σκουπίδια...
 

ChrisTOS

Retro Enthusiast
Messages
310
Reaction score
489
Points
63
Προσωπικά επικροτώ εμφάνιση listings σε C για 3 λόγους:
-Έχει μεγαλύτερη σχέση με τη σημερινή πραγματικότητα και διαβάζεται πιο εύκολα από κάποιον που γράφει σε μια σύγχρονη γλώσσα. Γλυτώνεις το mind fuck να πρέπει ξαφνικά να γυρίσεις σε σύνταξη 30 ετών που δεν χρησιμοποιείται πουθενά πλέον.
-Έχει συμβατότητα σε επίπεδο compiler, που σημαίνει ότι το ίδιο πρόγραμμα θα τρέξει ανεξαρτήτως μηχανήματος σε όποιο μηχάνημα έχει target ο compiler για πειραματισμούς. Ειδικά αν είναι ANSI C κυριολεκτικά σε όποιο μηχάνημα έχει κάποιον c compiler

-Το κυριότερο: αν δεν έχει inline assembly, ακραία data types κλπ και μιλάμε για απλούς αλγόριθμους, είναι απείρως πιο εύκολο να
το διαβάζεις και να το ξαναγράψεις σε όποια γλώσσα θέλεις. Δεν μιλάμε για port πια προσπαθώντας να μετατρέψουμε τις ιδιαιτερότητες της κάθε ενσωματωμένης BASIC σε μία άλλη με τις δικές της ιδιαιτερότητες, αλλά μεταφορά του αλγόριθμου από την αρχή σε άλλη γλώσσα. πχ το συγκεκριμένο είναι μερικά loop, πράξεις και console output. Τι το εμποδίζει να γραφεί σε κάποια BASIC?
Συμφωνώ απόλυτα μαζί σου. Απλά η μόνη διαφορά είναι ότι όλοι έχουμε γράψει μια γραμμή BASIC έστω και ένα cload, λιγότεροι έχουν γράψει μια γραμμή C.
 

dimfil

Retro Mentor
Messages
1,095
Reaction score
1,811
Points
123
Προσωπικά επικροτώ εμφάνιση listings σε C για 3 λόγους:
-Έχει μεγαλύτερη σχέση με τη σημερινή πραγματικότητα και διαβάζεται πιο εύκολα από κάποιον που γράφει σε μια σύγχρονη γλώσσα. Γλυτώνεις το mind fuck να πρέπει ξαφνικά να γυρίσεις σε σύνταξη 30 ετών που δεν χρησιμοποιείται πουθενά πλέον.
-Έχει συμβατότητα σε επίπεδο compiler, που σημαίνει ότι το ίδιο πρόγραμμα θα τρέξει ανεξαρτήτως μηχανήματος σε όποιο μηχάνημα έχει target ο compiler για πειραματισμούς. Ειδικά αν είναι ANSI C κυριολεκτικά σε όποιο μηχάνημα έχει κάποιον c compiler

-Το κυριότερο: αν δεν έχει inline assembly, ακραία data types κλπ και μιλάμε για απλούς αλγόριθμους, είναι απείρως πιο εύκολο να
το διαβάζεις και να το ξαναγράψεις σε όποια γλώσσα θέλεις. Δεν μιλάμε για port πια προσπαθώντας να μετατρέψουμε τις ιδιαιτερότητες της κάθε ενσωματωμένης BASIC σε μία άλλη με τις δικές της ιδιαιτερότητες, αλλά μεταφορά του αλγόριθμου από την αρχή σε άλλη γλώσσα. πχ το συγκεκριμένο είναι μερικά loop, πράξεις και console output. Τι το εμποδίζει να γραφεί σε κάποια BASIC?
Μα, κατά τη γνώμη μου όλα αυτά είναι εκ διαμέτρου αντίθετα με το σκοπό που υπηρετεί αυτό το thread!
Το ζητούμενο ήταν η μεταφορά και όχι το portability...

Η C είναι γνώριμη μόνο σε όσους (όπως ήδη έγραψα) τη διδάχτηκαν για τον ένα ή τον άλλο λόγο. Ανήκω σε αυτούς και δεν βλέπω λόγο πάντως να πρέπει (και) εδώ να τη βλέπω μπροστά μου! :D:D:D

Αντιθέτως, η Basic μου δίνει ξεκάθαρα μεγαλύτερο fun factor. Αισθάνομαι σαν πιτσιρικάς στα 80s που έκατσε μπροστά στο home computer του και προσπαθεί κάτι να κάνει με αυτό πέρα από το να παίζει "βιντεοπαιχνίδια"...

Ούτε και εγώ έχω πρόβλημα με το τι κώδικας να μπει εδώ. Ας είναι οτιδήποτε και όποιος έχει γνώσεις/χρόνο/όρεξη/κέφι (πες το όπως θες) να ασχοληθεί, ας το κάνει.
Απλά για εμένα δεν έχει τον ίδιο βαθμό διασκέδασης...
 

sly*m

Retro Addict
Messages
529
Reaction score
1,364
Points
103
@dimfil Δημήτρη θεώρησα hyper fun factor το πορτάρισμα του αλγορίθμου σε BASIC ή σε άλλες γλώσσες... Βέβαια αυτό είναι δική μου γνώμη και άλλων όπως φαίνεται, δεν σημαίνει ότι όλοι θα ενθουσιαστούν και θα το κάνουν... Είναι πάρα πολύ απλός αλγόριθμος όπως είπε και ο @konc.
Εδώ είναι ένα τυχαίο manual (δεν ξέρω αν είναι και το καλύτερο). Φυσικά όποιος θέλει να το κάνει και δεν ξέρει κάτι για το πως να την μετατρέψει σε BASIC, πχ για τους τελεστές κλπ, μπορεί να ρωτήσει, κάποιος θα βρεθεί να απαντήσει. Ή να το δείξει κάποιος σε BASIC...
 

chriskgnr

Retro Guru
Messages
2,053
Reaction score
515
Points
123
το size είναι 2800+1, δηλαδή οι θέσεις 0-2800
στο πρώτο πέρασμα στο inner loop for (k = 2800... κάνει access τη θέση 2800
το θέμα είναι ότι στο πρώτο loop δεν την έχει γεμίσει με κάτι και περιέχει ακόμα σκουπίδια...
"... στο πρώτο loop δεν την έχει γεμίσει με κάτι και περιέχει ακόμα σκουπίδια... ", έπρεπε να το φανταστώ... :confused:
όσο για την inline assembly, όσο ο κώδικας κρατιέται σε μικρό μέγεθος why not που λένε! :thumbup:
 

sly*m

Retro Addict
Messages
529
Reaction score
1,364
Points
103
στο πρώτο loop γεμίζει με 2000 μέχρι την θέση 2799.. Όχι;

Code:
for (i = 0; i < 2800; i++) {
        r[i] = 2000;
    }
 

dimfil

Retro Mentor
Messages
1,095
Reaction score
1,811
Points
123
@dimfil Δημήτρη θεώρησα hyper fun factor το πορτάρισμα του αλγορίθμου σε BASIC ή σε άλλες γλώσσες... Βέβαια αυτό είναι δική μου γνώμη και άλλων όπως φαίνεται, δεν σημαίνει ότι όλοι θα ενθουσιαστούν και θα το κάνουν... Είναι πάρα πολύ απλός αλγόριθμος όπως είπε και ο @konc.
Εδώ είναι ένα τυχαίο manual (δεν ξέρω αν είναι και το καλύτερο). Φυσικά όποιος θέλει να το κάνει και δεν ξέρει κάτι για το πως να την μετατρέψει σε BASIC, πχ για τους τελεστές κλπ, μπορεί να ρωτήσει, κάποιος θα βρεθεί να απαντήσει. Ή να το δείξει κάποιος σε BASIC...
Μα φυσικά, υπάρχουν πολλοί τρόποι που ο καθένας θα "διασκεδάσει" με τα listings!
Δέχομαι αυτό που λες, φυσικά έχει ενδιαφέρον. Απλά είπα για το δικό μου τρόπο προσέγγισης, πώς εγώ βρίσκω ενδιαφέρον σε όλο αυτό.
Νομίζω γράψαμε πολλά περισσότερα από όσα χρειάζονταν γι'αυτό το θέμα! Ας μπαίνει ό,τι κώδικας είναι, όλο και κάτι ενδιαφέρον θα βρίσκουμε κατά περίπτωση!
 

clemenza

Retro Addict
Messages
966
Reaction score
1,354
Points
93
Νομίζω οι αλγόριθμοι έχουν περισσότερη σημασία από την γλώσσα...
Σαφώς, σωστό είναι αυτό. Απλά στο μυαλό μου οι υπολογιστές των 80s είναι συνυφασμένοι με την BASIC. Δεν ξέρω, τι να σου πω, ας γράψει και κανένας άλλος τη γνώμη του...
 

sly*m

Retro Addict
Messages
529
Reaction score
1,364
Points
103
Λοιπόοοοον...

Atari 8-bit C

Γράφεται όπως είναι, απλά έβαλα και μέτρηση χρόνου από το 'real time clock' του μικρού Atari για να δούμε πόση ώρα κάνει να βγάλει 800 ψηφία του π. Στο αταράκι έκανε μόλις 2643 δευτερόλεπτα, ίσα ίσα σε 44 λεπτά. Τούμπανο! (σιγά μην περίμενα, το έβαλα στον altirra σε warp speed)

19664

Ο compiler είναι ο CC65 για συστήματα 6502 με target 'atari'. Όποιος θέλει να τον κατεβάσει πάει στον 'Windows Snapshot'.

Θα'θελα να το κάνω και σε 2600 αλλά δεν το έχω δοκιμάσει το target... o_O

Edit: Ο προηγούμενος κώδικας έβγαζε 1000 ψηφία γιατί έκανα cast σε long το αποτέλεσμα για printf, ενώ έπρεπε να είναι cast σε int. Επίσης αυτό έτρωγε χρόνο. Τώρα είναι σωστός και βγάζει 800 ψηφία σε 44 λεπτά. Επίσης η long c μηδενίζεται πριν τον μεγάλο βρόγχο που είναι το σωστό και όχι στην δήλωση. Αυτό το listing είναι το σωστό για το μικρό atari.

Code:
#include <stdio.h>
typedef unsigned char byte;
unsigned long res;
unsigned int secs;

int main()
{
    long r[2800 + 1];
    long i, k;
    long b, d;
    long c;
    char keyin[1];

    byte jiflow;
    byte jifmed;
    byte jifhi;

    /*
    midenismos xronou
    die8ynseis 18, 19, 20 (0x0012, 0x0013, 0x0014 RTCLOK)
    */
    *(byte*)0x0012 = 0;
    *(byte*)0x0013 = 0;
    *(byte*)0x0014 = 0;

    for (i = 0; i < 2800; i++)
    {
        r[i] = 2000;
    }
    
    c = 0;

    for (k = 2800; k > 0; k -= 14)
    {
        d = 0;
        i = k;

        for (;;)
        {
            d += r[i] * 10000;
            b = 2 * i - 1;

            r[i] = d % b;
            d /= b;

            i--;
            if (i == 0) break;

            d *= i;
        }

        printf("%.4d", (int)(c + d / 10000));

        c = d % 10000;
    }

    jifhi = *(byte*)0x0012;
    jifmed = *(byte*)0x0013;
    jiflow = *(byte*)0x0014;

    /* vbls pou metri8ikan */
    res = (unsigned long)jifhi << 16;
    res |= (unsigned long)jifmed << 8;
    res |= (unsigned long)jiflow;

    /* dia 50 hertz (pal) = deyterolepta */
    secs = (unsigned int)(res / 50);

    printf(" ** %d sec **\npata [return]", secs);

    gets(keyin);

    return 0;
}
 
Last edited:

konc

Retro Enthusiast
Messages
399
Reaction score
353
Points
63
Λοιπόοοοον...

Atari 8-bit C

Γράφεται όπως είναι,
Λοιπόοοον... ξαναδέστο :D:D Απ' ότι είδα 40x22 δεν έχει κάνει scroll η οθόνη για να βγάλει τους 800 χαρακτήρες, άρα τα πρώτα ψηφία θα έπρεπε να είναι (3,)14..... ;)
 

sly*m

Retro Addict
Messages
529
Reaction score
1,364
Points
103
Με το print κάνει scroll όταν τυπώνει στην τελευταία γραμμή. Έχει φάει 3 γραμμές.

19650

19652
 
Last edited:

lliont

Retro Starter
Messages
75
Reaction score
276
Points
63
O Lion δεν έχει C αλλά ορίστε σε Lion java, κάνει 19.5 δεύτερα


19649

Java:
import net.mikekohn.java_grinder.Lionsys;

public class pi
{

 static int r[]= new int [2801];
 static int i,x,y,k,offset,t1,t2;
 static long b,d,c,rr,t;
 static String s="0000";

 static void main() {
     t1=Lionsys.timer();
    c=0; x=1; y=3; t=0;
    Lionsys.cls();
    for (i = 0; i < 2800; i++) {
        r[i] = 2000;
    }
  
    for (k = 2800; k > 0; k -= 14) {
        d = 0;
        i = k;
        for (;i!=0;) {
            rr=(long) r[i];
            d += rr * 10000L;
            b = 2L * (long) i - 1L;
            r[i] =(int) (d % b);
            d = d/b;
            i--;
            if (i!=0) d = d*i;
        }
        rr=c+d/10000L;
        if (rr<10L) offset=3; else if (rr<100L) offset=2; else if (rr<1000L)offset=1; else offset=0;
        Lionsys.print_str(y,x,s);
        Lionsys.print_long(y,x+offset,rr);
        if (x>70) {x=1; y=y+1;} else x+=4;
        if (y>20) {Lionsys.scroll_up(); y--; }
        c = d % 10000L;
         t2=Lionsys.abs(Lionsys.timer()-t1);
         t1=Lionsys.timer();
         t=t+t2;
    }
    Lionsys.print_float(y+2,1,(float) t/1000);
    return ;
 }
}
 
Top