Raspberry BASIC

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - John Spikowski

Pages: 1 ... 9 10 [11] 12 13 ... 16
151
Nim / Re: Nim SDL2 gfx
« on: December 09, 2019, 04:44:06 AM »
An example using  Nim SDL2 gfx primitives.

Code: Text
  1. # ex205_sdl_gfx_primitives.nim
  2. # ============================
  3. # VIDEO / Drawing geometric primitives provided by sdl_gfx_primitives
  4. # -------------------------------------------------------------------
  5.  
  6.  
  7. import
  8.     random,
  9.     sdl2/sdl, sdl2/sdl_image as img,
  10.     sdl2/sdl_gfx_primitives as gfx, sdl2/sdl_gfx_primitives_font as font
  11.  
  12.  
  13. const
  14.   Title = "SDL2 App"
  15.   ScreenW = 640 # Window width
  16.   ScreenH = 480 # Window height
  17.   WindowFlags = 0
  18.   RendererFlags = sdl.RendererAccelerated or sdl.RendererPresentVsync
  19.  
  20.  
  21. type
  22.   App = ref AppObj
  23.   AppObj = object
  24.     window*: sdl.Window # Window pointer
  25.     renderer*: sdl.Renderer # Rendering state pointer
  26.  
  27.  
  28.   Image = ref ImageObj
  29.   ImageObj = object of RootObj
  30.     texture: sdl.Texture # Image texture
  31.     w, h: int # Image dimensions
  32.  
  33.  
  34. #########
  35. # IMAGE #
  36. #########
  37.  
  38. proc newImage(): Image = Image(texture: nil, w: 0, h: 0)
  39. proc free(obj: Image) = sdl.destroyTexture(obj.texture)
  40. proc w(obj: Image): int {.inline.} = return obj.w
  41. proc h(obj: Image): int {.inline.} = return obj.h
  42.  
  43. # blend
  44. proc blend(obj: Image): sdl.BlendMode =
  45.   var blend: sdl.BlendMode
  46.   if obj.texture.getTextureBlendMode(addr(blend)) == 0:
  47.     return blend
  48.   else:
  49.     return sdl.BlendModeBlend
  50.  
  51. proc `blend=`(obj: Image, mode: sdl.BlendMode) {.inline.} =
  52.   discard obj.texture.setTextureBlendMode(mode)
  53.  
  54. # alpha
  55. proc alpha(obj: Image): int =
  56.   var alpha: uint8
  57.   if obj.texture.getTextureAlphaMod(addr(alpha)) == 0:
  58.     return alpha
  59.   else:
  60.     return 255
  61.  
  62. proc `alpha=`(obj: Image, alpha: int) =
  63.   discard obj.texture.setTextureAlphaMod(alpha.uint8)
  64.  
  65.  
  66. # Load image from file
  67. # Return true on success or false, if image can't be loaded
  68. proc load(obj: Image, renderer: sdl.Renderer, file: string): bool =
  69.   result = true
  70.   # Load image to texture
  71.   obj.texture = renderer.loadTexture(file)
  72.   if obj.texture == nil:
  73.     sdl.logCritical(sdl.LogCategoryError,
  74.                     "Can't load image %s: %s",
  75.                     file, img.getError())
  76.     return false
  77.   # Get image dimensions
  78.   var w, h: cint
  79.   if obj.texture.queryTexture(nil, nil, addr(w), addr(h)) != 0:
  80.     sdl.logCritical(sdl.LogCategoryError,
  81.                     "Can't get texture attributes: %s",
  82.                     sdl.getError())
  83.     sdl.destroyTexture(obj.texture)
  84.     return false
  85.   obj.w = w
  86.   obj.h = h
  87.  
  88.  
  89. # Render texture to screen
  90. proc render(obj: Image, renderer: sdl.Renderer, x, y: int): bool =
  91.   var rect = sdl.Rect(x: x, y: y, w: obj.w, h: obj.h)
  92.   if renderer.renderCopy(obj.texture, nil, addr(rect)) == 0:
  93.     return true
  94.   else:
  95.     return false
  96.  
  97.  
  98. # Render transformed texture to screen
  99. proc renderEx(obj: Image, renderer: sdl.Renderer, x, y: int,
  100.               w = 0, h = 0, angle = 0.0, centerX = -1, centerY = -1,
  101.               flip = sdl.FlipNone): bool =
  102.   var
  103.     rect = sdl.Rect(x: x, y: y, w: obj.w, h: obj.h)
  104.     centerObj = sdl.Point(x: centerX, y: centerY)
  105.     center: ptr sdl.Point = nil
  106.   if w != 0: rect.w = w
  107.   if h != 0: rect.h = h
  108.   if not (centerX == -1 and centerY == -1): center = addr(centerObj)
  109.   if renderer.renderCopyEx(obj.texture, nil, addr(rect),
  110.                            angle, center, flip) == 0:
  111.     return true
  112.   else:
  113.     return false
  114.  
  115.  
  116. ##########
  117. # COMMON #
  118. ##########
  119.  
  120. # Initialization sequence
  121. proc init(app: App): bool =
  122.   # Init SDL
  123.   if sdl.init(sdl.InitVideo) != 0:
  124.     sdl.logCritical(sdl.LogCategoryError,
  125.                     "Can't initialize SDL: %s",
  126.                     sdl.getError())
  127.     return false
  128.  
  129.   # Init SDL_Image
  130.   if img.init(img.InitPng) == 0:
  131.     sdl.logCritical(sdl.LogCategoryError,
  132.                     "Can't initialize SDL_Image: %s",
  133.                     img.getError())
  134.  
  135.   # Create window
  136.   app.window = sdl.createWindow(
  137.     Title,
  138.     sdl.WindowPosUndefined,
  139.     sdl.WindowPosUndefined,
  140.     ScreenW,
  141.     ScreenH,
  142.     WindowFlags)
  143.   if app.window == nil:
  144.     sdl.logCritical(sdl.LogCategoryError,
  145.                     "Can't create window: %s",
  146.                     sdl.getError())
  147.     return false
  148.  
  149.   # Create renderer
  150.   app.renderer = sdl.createRenderer(app.window, -1, RendererFlags)
  151.   if app.renderer == nil:
  152.     sdl.logCritical(sdl.LogCategoryError,
  153.                     "Can't create renderer: %s",
  154.                     sdl.getError())
  155.     return false
  156.  
  157.   # Set draw color
  158.   if app.renderer.setRenderDrawColor(0x00, 0x00, 0x00, 0xFF) != 0:
  159.     sdl.logWarn(sdl.LogCategoryVideo,
  160.                 "Can't set draw color: %s",
  161.                 sdl.getError())
  162.     return false
  163.  
  164.   sdl.logInfo(sdl.LogCategoryApplication, "SDL initialized successfully")
  165.   randomize()
  166.   return true
  167.  
  168.  
  169. # Shutdown sequence
  170. proc exit(app: App) =
  171.   app.renderer.destroyRenderer()
  172.   app.window.destroyWindow()
  173.   img.quit()
  174.   sdl.logInfo(sdl.LogCategoryApplication, "SDL shutdown completed")
  175.   sdl.quit()
  176.  
  177.  
  178. # Event handling
  179. # Return true on app shutdown request, otherwise return false
  180. proc events(pressed: var seq[sdl.Keycode]): bool =
  181.   result = false
  182.   var e: sdl.Event
  183.   if pressed.len > 0:
  184.     pressed = @[]
  185.  
  186.   while sdl.pollEvent(addr(e)) != 0:
  187.  
  188.     # Quit requested
  189.     if e.kind == sdl.Quit:
  190.       return true
  191.  
  192.     # Key pressed
  193.     elif e.kind == sdl.KeyDown:
  194.       # Add pressed key to sequence
  195.       pressed.add(e.key.keysym.sym)
  196.  
  197.       # Exit on Escape key press
  198.       if e.key.keysym.sym == sdl.K_Escape:
  199.         return true
  200.  
  201.  
  202. ########
  203. # MAIN #
  204. ########
  205.  
  206. var
  207.   app = App(window: nil, renderer: nil)
  208.   done = false # Main loop exit condition
  209.   pressed: seq[sdl.Keycode] = @[] # Pressed keys
  210.  
  211. if init(app):
  212.  
  213.   # Generate random colors palette
  214.   var rnd: array[256, sdl.Color]
  215.   for i in 0..255:
  216.     rnd[i].r = rand(255).uint8
  217.     rnd[i].g = rand(255).uint8
  218.     rnd[i].b = rand(255).uint8
  219.     rnd[i].a = 255
  220.     if rnd[i].r < 32 and rnd[i].g < 32 and rnd[i].b < 32:
  221.       rnd[i].r = uint8(255 - rnd[i].r)
  222.       rnd[i].g = uint8(255 - rnd[i].g)
  223.       rnd[i].b = uint8(255 - rnd[i].b)
  224.  
  225.   # Load font
  226.   gfx.gfxPrimitivesSetFont(addr(font.gfxPrimitivesFontData), 8, 8)
  227.  
  228.   # Main loop
  229.   while not done:
  230.     # Clear screen with draw color
  231.     discard app.renderer.setRenderDrawColor(0x00, 0x00, 0x00, 0xFF)
  232.     if app.renderer.renderClear() != 0:
  233.       sdl.logWarn(sdl.LogCategoryVideo,
  234.                   "Can't clear screen: %s",
  235.                   sdl.getError())
  236.  
  237.     # Drawing
  238.  
  239.     # Point
  240.     discard app.renderer.pixelRGBA(
  241.       x = 10, y = 10,
  242.       rnd[0].r, rnd[0].g, rnd[0].b, rnd[0].a)
  243.  
  244.     # Horizontal line
  245.     discard app.renderer.hlineRGBA(
  246.       x1 = 10, x2 = 110, y = 20,
  247.       rnd[1].r, rnd[1].g, rnd[1].b, rnd[1].a)
  248.  
  249.     # Vertical line
  250.     discard app.renderer.vlineRGBA(
  251.       x = 120, y1 = 10, y2 = 470,
  252.       rnd[2].r, rnd[2].g, rnd[2].b, rnd[2].a)
  253.  
  254.     # Rectangle
  255.     discard app.renderer.rectangleRGBA(
  256.       x1 = 10, y1 = 30, x2 = 110, y2 = 60,
  257.       rnd[3].r, rnd[3].g, rnd[3].b, rnd[3].a)
  258.  
  259.     # Rounded rectangle
  260.     discard app.renderer.roundedRectangleRGBA(
  261.       x1 = 10, y1 = 70,  x2 = 110, y2 = 100, rad = 10,
  262.       rnd[4].r, rnd[4].g, rnd[4].b, rnd[4].a)
  263.  
  264.     # Box
  265.     discard app.renderer.boxRGBA(
  266.       x1 = 10, y1 = 110, x2 = 110, y2 = 140,
  267.       rnd[5].r, rnd[5].g, rnd[5].b, rnd[5].a)
  268.  
  269.     # RoundedBox
  270.     discard app.renderer.roundedBoxRGBA(
  271.       x1 = 10, y1 = 150, x2 = 110, y2 = 180, rad = 10,
  272.       rnd[6].r, rnd[6].g, rnd[6].b, rnd[6].a)
  273.  
  274.     # Line
  275.     discard app.renderer.lineRGBA(
  276.       x1 = 10, y1 = 190, x2 = 110, y2 = 210,
  277.       rnd[7].r, rnd[7].g, rnd[7].b, rnd[7].a)
  278.  
  279.     # Anti-aliased line
  280.     discard app.renderer.aalineRGBA(
  281.       x1 = 10, y1 = 200, x2 = 110, y2 = 220,
  282.       rnd[8].r, rnd[8].g, rnd[8].b, rnd[8].a)
  283.  
  284.     # Thick line
  285.     discard app.renderer.thickLineRGBA(
  286.       x1 = 10, y1 = 210, x2 = 110, y2 = 230, width = 5,
  287.       rnd[9].r, rnd[9].g, rnd[9].b, rnd[9].a)
  288.  
  289.     # Circle
  290.     discard app.renderer.circleRGBA(
  291.       x = 60, y = 280, rad = 50,
  292.       rnd[10].r, rnd[10].g, rnd[10].b, rnd[10].a)
  293.  
  294.     # Arc
  295.     discard app.renderer.arcRGBA(
  296.       x = 60, y = 300, rad = 50, start = 30, finish = 150,
  297.       rnd[11].r, rnd[11].g, rnd[11].b, rnd[11].a)
  298.  
  299.     # Anti-aliased circle
  300.     discard app.renderer.aacircleRGBA(
  301.       x = 60, y = 420, rad = 50,
  302.       rnd[12].r, rnd[12].g, rnd[12].b, rnd[12].a)
  303.  
  304.     # Filled circle
  305.     discard app.renderer.filledCircleRGBA(
  306.       x = 180, y = 60, rad = 50,
  307.       rnd[13].r, rnd[13].g, rnd[13].b, rnd[13].a)
  308.  
  309.     # Ellipse
  310.     discard app.renderer.ellipseRGBA(
  311.       x = 180, y = 135, rx = 50, ry = 15,
  312.       rnd[14].r, rnd[14].g, rnd[14].b, rnd[14].a)
  313.  
  314.     # Anti-aliased ellipse
  315.     discard app.renderer.aaellipseRGBA(
  316.       x = 180, y = 180, rx = 50, ry = 15,
  317.       rnd[15].r, rnd[15].g, rnd[15].b, rnd[15].a)
  318.  
  319.     # Filled ellipse
  320.     discard app.renderer.filledEllipseRGBA(
  321.       x = 180, y = 225, rx = 50, ry = 15,
  322.       rnd[16].r, rnd[16].g, rnd[16].b, rnd[16].a)
  323.  
  324.     # Pie
  325.     discard app.renderer.pieRGBA(
  326.       x = 180, y = 260, rad = 50, start = 30, finish = 150,
  327.       rnd[17].r, rnd[17].g, rnd[17].b, rnd[17].a)
  328.  
  329.     # Filled pie
  330.     discard app.renderer.filledPieRGBA(
  331.       x = 180, y = 320, rad = 50, start = 30, finish = 150,
  332.       rnd[18].r, rnd[18].g, rnd[18].b, rnd[18].a)
  333.  
  334.     # Trigon
  335.     discard app.renderer.trigonRGBA(
  336.       x1 = 130, y1 = 380, x2 = 230, y2 = 390, x3 = 130, y3 = 410,
  337.       rnd[19].r, rnd[19].g, rnd[19].b, rnd[19].a)
  338.  
  339.     # Anti-aliased trigon
  340.     discard app.renderer.aatrigonRGBA(
  341.       x1 = 130, y1 = 420, x2 = 230, y2 = 400, x3 = 230, y3 = 430,
  342.       rnd[20].r, rnd[20].g, rnd[20].b, rnd[20].a)
  343.  
  344.     # Filled trigon
  345.     discard app.renderer.filledTrigonRGBA(
  346.       x1 = 130, y1 = 430, x2 = 230, y2 = 440, x3 = 130, y3 = 460,
  347.       rnd[21].r, rnd[21].g, rnd[21].b, rnd[21].a)
  348.  
  349.     # Polygon
  350.     const polyN = 4
  351.     var polyX, polyY: array[polyN, int16]
  352.     polyX[0] = 260
  353.     polyY[0] = 10
  354.     polyX[1] = 350
  355.     polyY[1] = 20
  356.     polyX[2] = 340
  357.     polyY[2] = 40
  358.     polyX[3] = 250
  359.     polyY[3] = 30
  360.     discard app.renderer.polygonRGBA(
  361.       vx = addr(polyX[0]), vy = addr(polyY[0]), n = polyN,
  362.       rnd[22].r, rnd[22].g, rnd[22].b, rnd[22].a)
  363.  
  364.     # Anti-aliased polygon
  365.     polyY[0] = 50
  366.     polyY[1] = 60
  367.     polyY[2] = 80
  368.     polyY[3] = 70
  369.     discard app.renderer.aapolygonRGBA(
  370.       vx = addr(polyX[0]), vy = addr(polyY[0]), n = polyN,
  371.       rnd[23].r, rnd[23].g, rnd[23].b, rnd[23].a)
  372.  
  373.     # Filled polygon
  374.     polyY[0] = 90
  375.     polyY[1] = 100
  376.     polyY[2] = 120
  377.     polyY[3] = 110
  378.     discard app.renderer.filledPolygonRGBA(
  379.       vx = addr(polyX[0]), vy = addr(polyY[0]), n = polyN,
  380.       rnd[24].r, rnd[24].g, rnd[24].b, rnd[24].a)
  381.  
  382.     # Textured polygon
  383.     polyY[0] = 130
  384.     polyY[1] = 140
  385.     polyY[2] = 160
  386.     polyY[3] = 150
  387.     var polyTexture = img.load("img/img2.png")
  388.     discard app.renderer.texturedPolygon(
  389.       vx = addr(polyX[0]), vy = addr(polyY[0]), n = polyN,
  390.       polyTexture, 0, 0)
  391.  
  392.     # Bezier curve
  393.     const bezN = 4
  394.     var bezX, bezY: array[bezN, int16]
  395.     bezX[0] = 260
  396.     bezY[0] = 170
  397.     bezX[1] = 350
  398.     bezY[1] = 180
  399.     bezX[2] = 260
  400.     bezY[2] = 190
  401.     bezX[3] = 350
  402.     bezY[3] = 200
  403.     discard app.renderer.bezierRGBA(
  404.       vx = addr(bezX[0]), vy = addr(bezY[0]), n = bezN, s = 100,
  405.       rnd[25].r, rnd[25].g, rnd[25].b, rnd[25].a)
  406.  
  407.     # Character
  408.     discard app.renderer.characterRGBA(
  409.       x = 370, y = 10, 'A',
  410.       rnd[26].r, rnd[26].g, rnd[26].b, rnd[26].a)
  411.  
  412.     # String
  413.     discard app.renderer.stringRGBA(
  414.       x = 370, y = 30, "String",
  415.       rnd[27].r, rnd[27].g, rnd[27].b, rnd[27].a)
  416.  
  417.     # Update renderer
  418.     app.renderer.renderPresent()
  419.  
  420.     # Event handling
  421.     done = events(pressed)
  422.  
  423. # Shutdown
  424. exit(app)
  425.  

152
Programming Challenges / Re: SALC Rasbian 32
« on: December 08, 2019, 10:46:40 PM »
Python3 Update (AIR submission)

Code: Python
  1. # Python 3 - 1mil3-2.py - AIR
  2.  
  3. def main():
  4.     t = []
  5.     r =""
  6.     a = [None] * 1000001
  7.     b = bytearray(26)
  8.     decode = bytearray.decode
  9.     blah = range(1000001)
  10.     append = list.append
  11.  
  12.     for x in blah:
  13.         alpha = x % 26
  14.         b[alpha] = alpha + 65
  15.         a[x] = x
  16.         if alpha == 25:
  17.             append(t, decode(b[::-1]))
  18.  
  19.     r = ''.join(t)
  20.  
  21.     print("r LEN: {}".format(len(r)))
  22.     print("Front: {}".format(r[:26]))
  23.     print("Back:  {}".format(r[-26:]))
  24.     print("UBVal: {}".format(a[1000000]))
  25.  
  26. if __name__ == "__main__":
  27.     main()
  28.  


pi@RPi4B:~/python-dev/examples $ timex python3 1mil3-2,py
r LEN: 999986
Front: ZYXWVUTSRQPONMLKJIHGFEDCBA
Back:  ZYXWVUTSRQPONMLKJIHGFEDCBA
UBVal: 1000000
0.68user 0.08system 0:00.78elapsed 99%CPU (0avgtext+0avgdata 29952maxresident)k
0inputs+0outputs (0major+6541minor)pagefaults 0swaps
pi@RPi4B:~/python-dev/examples $


153
General Discussion / Re: RPI Forum
« on: December 08, 2019, 09:25:27 PM »
Dart Fibo

It seems like Dart and Swift both use names that are oxymoronic to their performance.

Nim does fibo(78) in .008 seconds on the RPi 4B.

154
Programming Challenges / Re: SALC Rasbian 32
« on: December 08, 2019, 06:02:34 AM »
ScriptBasic Update

Code: Script BASIC
  1. ' ScriptBasic - 1milsf.sb
  2.  
  3. OPEN  "t_file" FOR OUTPUT AS #1
  4.  
  5. s = ""
  6. SPLITA STRING(1000001,"0") BY "" TO a
  7.  
  8. FOR x = 1 TO 1000000
  9.   s &= CHR(((x - 1) % 26) + 65)
  10.   a[x] = x
  11.   IF LEN(s) = 26 THEN
  12.     PRINT #1, s
  13.     s = ""
  14.   END IF
  15. NEXT
  16. CLOSE(1)
  17.  
  18. flen = FILELEN("t_file")
  19. OPEN "t_file" FOR INPUT AS #1
  20. t = INPUT(flen, 1)
  21. CLOSE(1)
  22. t = STRREVERSE(t)
  23.  
  24. PRINT "t LEN: ",LEN(t),"\n"
  25. PRINT "Front: ",LEFT(t, 26),"\n"
  26. PRINT "Back:  ",RIGHT(t, 26),"\n"
  27. PRINT "UBVal: ",a[1000000],"\n"
  28.  


pi@RPi4B:~/sbrt/examples $ timex scriba 1milsf.sb
t LEN: 999986
Front: ZYXWVUTSRQPONMLKJIHGFEDCBA
Back:  ZYXWVUTSRQPONMLKJIHGFEDCBA
UBVal: 1000000
7.03user 0.84system 0:07.89elapsed 99%CPU (0avgtext+0avgdata 171504maxresident)k
0inputs+1976outputs (0major+43080minor)pagefaults 0swaps
pi@RPi4B:~/sbrt/examples $


155
Nim / Re: Nim SQLite
« on: December 08, 2019, 02:42:34 AM »
This is an example of the SQLite Nim extension.

Code: Text
  1. # Nim SQLite
  2.  
  3. import tiny_sqlite
  4. import options
  5.  
  6. let db = openDatabase("./test.db")
  7.  
  8. db.exec("DROP TABLE IF EXISTS Person")
  9.  
  10. db.execScript("""
  11.   CREATE TABLE Person(
  12.     name TEXT,
  13.     age INTEGER
  14.   );
  15. """)
  16.  
  17. db.exec("""
  18.     INSERT INTO Person(name, age)
  19.     VALUES(?, ?)
  20. """, "John Doe", 55)
  21.  
  22. let rows = db.rows("SELECT name, age FROM Person")
  23. let (name, age) = rows[0].unpack((Option[string], Option[int]))
  24.  
  25. echo "Name: ", name.get
  26. echo " Age: ", age.get
  27.  
  28. db.close
  29.  


pi@RPi4B:~/nim-dev/examples $ nim c -d:release tsql.nim
Hint: used config file '/etc/nim/nim.cfg' [Conf]
Hint: system [Processing]
Hint: tsql [Processing]
Hint: tiny_sqlite [Processing]
Hint: strutils [Processing]
Hint: parseutils [Processing]
Hint: math [Processing]
Hint: bitops [Processing]
Hint: algorithm [Processing]
Hint: unicode [Processing]
Hint: options [Processing]
Hint: typetraits [Processing]
Hint: macros [Processing]
Hint: sqlite_wrapper [Processing]
Hint:  [Link]
Hint: operation successful (22575 lines compiled; 1.740 sec total; 25.605MiB peakmem; Release Build) [SuccessX]
pi@RPi4B:~/nim-dev/examples $ ls -l tsql
-rwxr-xr-x 1 pi pi 88084 Dec  7 20:07 tsql
pi@RPi4B:~/nim-dev/examples $ timex ./tsql
Name: John Doe
 Age: 55
0.00user 0.00system 0:00.05elapsed 32%CPU (0avgtext+0avgdata 2368maxresident)k
0inputs+144outputs (0major+159minor)pagefaults 0swaps
pi@RPi4B:~/nim-dev/examples $


156
Programming Challenges / Re: SALC Rasbian 32
« on: December 07, 2019, 08:44:32 PM »
BaCon Update (AIR submission)

Code: Text
  1. ' BaCon - 1mil3-2.bac - AIR
  2.  
  3. OPTION PARSE FALSE
  4.  
  5. s$ = ""
  6. t$ = ""
  7.  
  8. DECLARE a[1000001] TYPE NUMBER
  9. DECLARE len TYPE uint
  10. DECLARE *stream TYPE FILE
  11.  
  12. stream = open_memstream(&t$,&len)
  13.  
  14. FOR x = 1 TO 1000000
  15.   s$ = s$ & CHR$(MOD((x - 1), 26) + 65)
  16.   a[x] = x
  17.   IF LEN(s$) = 26 THEN
  18.     fprintf(stream,s$)
  19.     s$ = ""
  20.   END IF
  21. NEXT
  22. CLOSE FILE stream
  23.  
  24. r$ = REVERSE$(t$)
  25. FREE t$
  26. PRINT "r LEN: ",len
  27. PRINT "Front: ",LEFT$(r$, 26)
  28. PRINT "Back:  ",RIGHT$(r$, 26)
  29. PRINT "UBVal: ",a[1000000]
  30.  


pi@RPi4B:~/bacon-dev/examples $ bacon 1mil3-2.bac
Converting '1mil3-2.bac'... done, 30 lines were processed in 0.064 seconds.
Compiling '1mil3-2.bac'... cc  -c 1mil3-2.bac.c
cc -o 1mil3-2 1mil3-2.bac.o -lbacon -L. -lm 
Done, program '1mil3-2' ready.
pi@RPi4B:~/bacon-dev/examples $ ls -l 1mil3-2
-rwxr-xr-x 1 pi pi 114748 Dec  7 12:40 1mil3-2
pi@RPi4B:~/bacon-dev/examples $ timex ./1mil3-2
r LEN: 999986
Front: ZYXWVUTSRQPONMLKJIHGFEDCBA
Back:  ZYXWVUTSRQPONMLKJIHGFEDCBA
UBVal: 1000000
0.48user 0.03system 0:00.51elapsed 99%CPU (0avgtext+0avgdata 8012maxresident)k
0inputs+0outputs (0major+2068minor)pagefaults 0swaps
pi@RPi4B:~/bacon-dev/examples $


157
Nim / Re: Nim Fibo
« on: December 07, 2019, 05:34:13 AM »
A Fibo Nim example for our RPI  forum friends.

Code: Text
  1. import math
  2.  
  3. proc Fibonacci(n: int): int64 =
  4.   var fn = float64(n)
  5.   var p: float64 = (1.0 + sqrt(5.0)) / 2.0
  6.   var q: float64 = 1.0 / p
  7.   return int64((pow(p, fn) + pow(q, fn)) / sqrt(5.0))
  8.  
  9. echo Fibonacci(78)
  10.  


pi@RPi4B:~/nim-dev/examples $ nim c -d:release fibo78.nim
Hint: used config file '/etc/nim/nim.cfg' [Conf]
Hint: system [Processing]
Hint: fibo78 [Processing]
Hint: math [Processing]
Hint: bitops [Processing]
CC: fibo78
CC: stdlib_system
CC: stdlib_math
CC: stdlib_bitops
Hint:  [Link]
Hint: operation successful (13698 lines compiled; 4.051 sec total; 10.754MiB peakmem; Release Build) [SuccessX]
pi@RPi4B:~/nim-dev/examples $ timex ./fibo78
8944394323791488
0.00user 0.00system 0:00.00elapsed 83%CPU (0avgtext+0avgdata 1292maxresident)k
0inputs+0outputs (0major+98minor)pagefaults 0swaps
pi@RPi4B:~/nim-dev/examples $ time ./fibo78
8944394323791488

real   0m0.008s
user   0m0.008s
sys   0m0.001s
pi@RPi4B:~/nim-dev/examples $


There is a GMP extension for Nim that I might give the 1mil fibo a shot with.

Nim GMP

Code: Text
  1. import gmp
  2.  
  3. var
  4.   a,b: mpz_t
  5.  
  6. discard mpz_init_set_str(a.addr,"9999999999999999999999999999999999999999999999999999999999999999999",10)
  7. discard mpz_init_set_str(b.addr,"10000000000000000000000000000000000000000000000000000000000000000000",10)
  8. mpz_add(a.addr,a.addr,b.addr)
  9. echo mpz_get_str(nil,10,a.addr)
  10.  


pi@RPi4B:~/nim-dev/examples $ nim c -d:release bigintadd.nim
Hint: used config file '/etc/nim/nim.cfg' [Conf]
Hint: system [Processing]
Hint: bigintadd [Processing]
Hint: gmp [Processing]
CC: bigintadd
CC: stdlib_system
CC: stdlib_gmp
Hint:  [Link]
Hint: operation successful (13250 lines compiled; 3.834 sec total; 10.766MiB peakmem; Release Build) [SuccessX]
pi@RPi4B:~/nim-dev/examples $ ls -l bigintadd
-rwxr-xr-x 1 pi pi 52240 Dec  6 23:35 bigintadd
pi@RPi4B:~/nim-dev/examples $ ./bigintadd
19999999999999999999999999999999999999999999999999999999999999999999
pi@RPi4B:~/nim-dev/examples $



158
Nim / Nim Introduction
« on: December 07, 2019, 04:25:35 AM »
I was able to get the IUP distribution I built for the RPi and Nim to  work together. A "Hello Nim" of sorts.

Code: Text
  1. import iup
  2.  
  3. proc btn_click(ih:PIhandle):cint {.cdecl.}=
  4.     iup.message("Popup", "You clicked the button!")
  5.  
  6. discard iup.open(nil, nil)
  7.  
  8. var btn = iup.button("Click me!", nil)
  9. discard iup.setCallback(btn, "ACTION", cast[ICallback](btn_click))
  10.  
  11. var dlg = iup.dialog(iup.vbox(btn, nil))
  12. iup.setAttribute(dlg, "TITLE", "iupTabs")
  13.  
  14. discard iup.showXY(dlg, IUP_CENTER, IUP_CENTER)
  15. discard iup.mainLoop()
  16.  
  17. iup.close()
  18.  


pi@RPi4B:~/pui/iup-master/examples $ nim c -d:release callbacks.nim
Hint: used config file '/etc/nim/nim.cfg' [Conf]
Hint: system [Processing]
Hint: callbacks [Processing]
Hint: iup [Processing]
CC: iup_callbacks
CC: stdlib_system
CC: stdlib_iup
Hint:  [Link]
Hint: operation successful (13356 lines compiled; 4.586 sec total; 10.758MiB peakmem; Release Build) [SuccessX]
pi@RPi4B:~/pui/iup-master/examples $ ls -l
total 72
-rwxr-xr-x 1 pi pi 59180 Dec  6 20:17 callbacks
-rw-r--r-- 1 pi pi   413 Nov  4 02:39 callbacks.nim
-rw-r--r-- 1 pi pi   576 Nov  4 02:39 menu.nim
-rw-r--r-- 1 pi pi  1023 Nov  4 02:39 tabs.nim
pi@RPi4B:~/pui/iup-master/examples $ ./callbacks


159
Programming Challenges / Re: SALC Rasbian 32
« on: December 07, 2019, 03:06:32 AM »
I was curious if I expanded out the expression to concatenate strings in ScriptBasic would it help?  NOT and good to know for future use.

Example

Was:  t &= s

Changed  To:  t = t & s

&= seems to be ScriptBasic's StringBuilder function.

Code: Script BASIC
  1. ' ScriptBasic - 1mil.sb
  2.  
  3. s = ""
  4. t = ""
  5. SPLITA STRING(1000001,"0") BY "" TO a
  6.  
  7. FOR x = 1 TO 1000000
  8.   s = s & CHR(((x - 1) % 26) + 65)
  9.   a[x] = x
  10.   IF LEN(s) = 26 THEN
  11.     t = t & s
  12.     s = ""
  13.   END IF
  14. NEXT
  15. t = STRREVERSE(t)
  16. PRINT "t LEN: ",LEN(t),"\n"
  17. PRINT "Front: ",LEFT(t, 26),"\n"
  18. PRINT "Back:  ",RIGHT(t, 26),"\n"
  19. PRINT "UBVal: ",a[1000000],"\n"
  20.  


pi@RPi4B:~/sbrt/examples $ timex scriba  1mil3.sb
t LEN: 999986
Front: ZYXWVUTSRQPONMLKJIHGFEDCBA
Back:  ZYXWVUTSRQPONMLKJIHGFEDCBA
UBVal: 1000000
127.51user 35.17system 2:42.93elapsed 99%CPU (0avgtext+0avgdata 171488maxresident)k
0inputs+0outputs (0major+4122875minor)pagefaults 0swaps
pi@RPi4B:~/sbrt/examples $

 

160
General Discussion / Re: RPI Forum
« on: December 06, 2019, 06:31:52 AM »
Quote from: Heater@RPI
When silly discussions have gone on long enough jamesh locks the thread. Everything goes dark.

Sooner or later the realization will set in that the RPi forum is focused towards support / Q&A topics. A bunch of old programmers shooting the shit or sharing a trick or two isn't part of the program. Any of the old farts that feel the moderator kids are being obnoxious, feel free to join us here,

161
Translators / Universal Language Translator
« on: December 06, 2019, 05:09:31 AM »
Hi Brian,

Thanks for joining us on the forum.

With your language translation skills have you thought of fostering a universal programming language translator project? Something like Google translate but for programming languages.

As you can see from the string / array language challenge the syntax isn't that different between them. I would like to hear your thoughts on the challenges that might be ahead.

162
Programming Challenges / Re: SALC Rasbian 32
« on: December 04, 2019, 06:23:02 AM »
Java

Code: Java
  1. // Java - 1mil3.java
  2.  
  3. class onemil3
  4.   {
  5.   public static void main(String args[])
  6.   {
  7.   String s = "";
  8.   String t = "";
  9.   int c = 0;
  10.   int[] a = new int[1000001];
  11.  
  12.   for (int x = 1; x <= 1000000; x++) {
  13.     c = ((x - 1) % 26) + 65;          
  14.     s = s + (char) c;
  15.     a[x] = x;
  16.     if(s.length() == 26) {
  17.       t = t + s;
  18.       s = "";
  19.     }
  20.   }
  21.  
  22.   StringBuilder r = new StringBuilder();
  23.   r.append(t);
  24.   r = r.reverse();
  25.  
  26.   System.out.println("r LEN: " + r.length());
  27.   System.out.println("Front: " + r.substring(0, 26));
  28.   System.out.println("Back:  " + r.substring(r.length() - 26));  
  29.   System.out.println("UBVal: " + a[1000000]);
  30.   }
  31. }
  32.  


pi@RPi4B:~/java-dev/examples $ /usr/bin/time java onemil3
r LEN: 999986
Front: ZYXWVUTSRQPONMLKJIHGFEDCBA
Back:  ZYXWVUTSRQPONMLKJIHGFEDCBA
UBVal: 1000000
43.79user 2.03system 0:34.78elapsed 131%CPU (0avgtext+0avgdata 144432maxresident)k
0inputs+96outputs (0major+33910minor)pagefaults 0swaps
pi@RPi4B:~/java-dev/examples $



This version is using the StringBuilder class rather than adding a character or alphabet string to the result string. Night and day.

Code: Java
  1. // Java - 1mil3.java
  2.  
  3. class onemil3
  4.   {
  5.   public static void main(String args[])
  6.   {
  7.   StringBuilder s = new StringBuilder();
  8.   StringBuilder t = new StringBuilder();
  9.   int c = 0;
  10.   int[] a = new int[1000001];
  11.  
  12.   for (int x = 1; x <= 1000000; x++) {
  13.     c = ((x - 1) % 26) + 65;          
  14.     s.append((char) c);
  15.     a[x] = x;
  16.     if(s.length() == 26) {
  17.       t.append(s);
  18.       s.delete(0, s.length());
  19.     }
  20.   }
  21.  
  22.   StringBuilder r = new StringBuilder();
  23.   r.append(t);
  24.   r = r.reverse();
  25.  
  26.   System.out.println("r LEN: " + r.length());
  27.   System.out.println("Front: " + r.substring(0, 26));
  28.   System.out.println("Back:  " + r.substring(r.length() - 26));  
  29.   System.out.println("UBVal: " + a[1000000]);
  30.   }
  31. }
  32.  


pi@RPi4B:~/java-dev/examples $ javac 1mil3.java
pi@RPi4B:~/java-dev/examples $ /usr/bin/time java onemil3
r LEN: 999986
Front: ZYXWVUTSRQPONMLKJIHGFEDCBA
Back:  ZYXWVUTSRQPONMLKJIHGFEDCBA
UBVal: 1000000
0.49user 0.14system 0:00.53elapsed 119%CPU (0avgtext+0avgdata 31948maxresident)k
0inputs+64outputs (0major+5024minor)pagefaults 0swaps
pi@RPi4B:~/java-dev/examples $


163
Programming Challenges / Re: SALC Rasbian 32
« on: December 04, 2019, 01:29:49 AM »
Perl

Code: Perl
  1. # Perl - 1mil3.pl
  2.  
  3. my $s = "";
  4. my $t = "";
  5. my $a = [1000000];
  6.  
  7. for (my $x = 1; $x <= 1000000; $x++) {
  8.   $s = $s . chr((($x - 1) % 26) + 65);
  9.   $a[$x] = $x;
  10.   if (length($s) == 26) {
  11.     $t = $t . $s;
  12.     $s = "";
  13.   }
  14. }
  15.  
  16.  
  17. my $r = scalar reverse $t;
  18.  
  19. printf("r LEN: %d\n", length($r));
  20. printf("Front: %s\n", substr($r, 0, 26));
  21. printf("Back:  %s\n", substr($r, -26));
  22. printf("UBVal: %d\n", $a[1000000]);
  23.  


pi@RPi4B:~/perl-dev/examples $ /usr/bin/time perl 1mil3.pl
r LEN: 999986
Front: ZYXWVUTSRQPONMLKJIHGFEDCBA
Back:  ZYXWVUTSRQPONMLKJIHGFEDCBA
UBVal: 1000000
1.13user 0.07system 0:01.22elapsed 99%CPU (0avgtext+0avgdata 33636maxresident)k
0inputs+0outputs (0major+7705minor)pagefaults 0swaps
pi@RPi4B:~/perl-dev/examples $


164
Programming Challenges / Re: SALC Rasbian 32
« on: December 03, 2019, 07:35:46 PM »
C Update  (AIR submission)

Code: C
  1. // C Update - 1mil3.c - AIR
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. char *strrev(char *str)
  8. {
  9.     if (!str || ! *str)
  10.         return str;
  11.  
  12.     int i = strlen(str) - 1, j = 0;
  13.  
  14.     char ch;
  15.     while (i > j) {
  16.         ch = str[i];
  17.         str[i] = str[j];
  18.         str[j] = ch;
  19.         i--;
  20.         j++;
  21.     }
  22.     return str;
  23. }
  24.  
  25.  
  26. int main() {
  27.     int a[1000001] = {0};
  28.     char *t=NULL;
  29.     char tmp[2] = {0};
  30.     char s[27] = {0};
  31.     FILE *t_stream;
  32.     size_t len;
  33.  
  34.     t_stream = open_memstream(&t, &len);
  35.  
  36.     for (int x = 0; x < 1000001; x++) {
  37.         a[x] = x;
  38.         tmp[0] = (char)(x%26)+65;
  39.  
  40.         strncat(s,tmp,2);
  41.  
  42.         if (strlen(s) == 26) {
  43.             fprintf(t_stream, "%s",s);
  44.             s[0] = '\0';
  45.         }
  46.  
  47.     }
  48.  
  49.     fclose(t_stream);
  50.  
  51.     strrev(t);
  52.  
  53.     printf("r LEN: %lu\n",strlen(t));
  54.     printf("Front: %.*s\n", 26, t);
  55.     printf("Back:  %s\n", t + strlen(t) - 26);
  56.     printf("UBVal: %d\n",a[1000000]);
  57.  
  58.     free(t);
  59.  
  60. }
  61.  


pi@RPi4B:~/c-dev/examples $ gcc -O3 1mil3.2.c -o 1mil3.2
pi@RPi4B:~/c-dev/examples $ ls -l 1mil3.2
-rwxr-xr-x 1 pi pi 8296 Dec  3 11:31 1mil3.2
pi@RPi4B:~/c-dev/examples $ /usr/bin/time ./1mil3.2
r LEN: 999986
Front: ZYXWVUTSRQPONMLKJIHGFEDCBA
Back:  ZYXWVUTSRQPONMLKJIHGFEDCBA
UBVal: 1000000
0.14user 0.02system 0:00.18elapsed 97%CPU (0avgtext+0avgdata 5888maxresident)k
0inputs+0outputs (0major+1565minor)pagefaults 0swaps
pi@RPi4B:~/c-dev/examples $


165
General Discussion / RPI Forum
« on: December 03, 2019, 04:40:04 PM »
Quote
I don't know if John is still following this thread or not, but if he is, thanks for finding that note. Those pages covered the mathematics so I could proceed directly to the software engineering needed to write an efficient program. It also helped to look at the sample code included in the post.

@ejolson,

Glad it helped! Wish you were here.

Pages: 1 ... 9 10 [11] 12 13 ... 16