June 2018 Update

This commit is contained in:
Ingy döt Net 2018-06-22 20:57:24 +00:00
parent ba8067c3b7
commit 22f33d4004
5278 changed files with 84726 additions and 14379 deletions

View file

@ -0,0 +1,72 @@
REPORT morse_code.
TYPES: BEGIN OF y_morse_code,
letter TYPE string,
code TYPE string,
END OF y_morse_code,
ty_morse_code TYPE STANDARD TABLE OF y_morse_code WITH EMPTY KEY.
cl_demo_output=>new(
)->begin_section( |Morse Code|
)->write( REDUCE stringtab( LET words = VALUE stringtab( ( |sos| )
( | Hello World!| )
( |Rosetta Code| ) )
morse_code = VALUE ty_morse_code( ( letter = 'A' code = '.- ' )
( letter = 'B' code = '-... ' )
( letter = 'C' code = '-.-. ' )
( letter = 'D' code = '-.. ' )
( letter = 'E' code = '. ' )
( letter = 'F' code = '..-. ' )
( letter = 'G' code = '--. ' )
( letter = 'H' code = '.... ' )
( letter = 'I' code = '.. ' )
( letter = 'J' code = '.--- ' )
( letter = 'K' code = '-.- ' )
( letter = 'L' code = '.-.. ' )
( letter = 'M' code = '-- ' )
( letter = 'N' code = '-. ' )
( letter = 'O' code = '--- ' )
( letter = 'P' code = '.--. ' )
( letter = 'Q' code = '--.- ' )
( letter = 'R' code = '.-. ' )
( letter = 'S' code = '... ' )
( letter = 'T' code = '- ' )
( letter = 'U' code = '..- ' )
( letter = 'V' code = '...- ' )
( letter = 'W' code = '.- - ' )
( letter = 'X' code = '-..- ' )
( letter = 'Y' code = '-.-- ' )
( letter = 'Z' code = '--.. ' )
( letter = '0' code = '----- ' )
( letter = '1' code = '.---- ' )
( letter = '2' code = '..--- ' )
( letter = '3' code = '...-- ' )
( letter = '4' code = '....- ' )
( letter = '5' code = '..... ' )
( letter = '6' code = '-.... ' )
( letter = '7' code = '--... ' )
( letter = '8' code = '---.. ' )
( letter = '9' code = '----. ' )
( letter = '''' code = '.----. ' )
( letter = ':' code = '---... ' )
( letter = ',' code = '--..-- ' )
( letter = '-' code = '-....- ' )
( letter = '(' code = '-.--.- ' )
( letter = '.' code = '.-.-.- ' )
( letter = '?' code = '..--.. ' )
( letter = ';' code = '-.-.-. ' )
( letter = '/' code = '-..-. ' )
( letter = '_' code = '..--.- ' )
( letter = ')' code = '---.. ' )
( letter = '=' code = '-...- ' )
( letter = '@' code = '.--.-. ' )
( letter = '\' code = '.-..-. ' )
( letter = '+' code = '.-.-. ' )
( letter = ' ' code = '/' ) )
IN INIT word_coded_tab TYPE stringtab
FOR word IN words
NEXT word_coded_tab = VALUE #( BASE word_coded_tab ( REDUCE string( INIT word_coded TYPE string
FOR index = 1 UNTIL index > strlen( word )
LET _morse_code = VALUE #( morse_code[ letter = COND #( WHEN index = 1 THEN to_upper( word(index) )
ELSE LET prev = index - 1 IN to_upper( word+prev(1) ) ) ]-code OPTIONAL )
IN NEXT word_coded = |{ word_coded } { _morse_code }| ) ) ) )
)->display( ).

View file

@ -0,0 +1,62 @@
MODULE MorseCode;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
PROCEDURE WriteMorseCode(str : ARRAY OF CHAR);
VAR i : CARDINAL;
BEGIN
WriteString(str);
WriteLn;
FOR i:=0 TO HIGH(str) DO
CASE CAP(str[i]) OF
'A': WriteString(".-");
| 'B': WriteString("-...");
| 'C': WriteString("-.-");
| 'D': WriteString("-..");
| 'E': WriteString(".");
| 'F': WriteString("..-.");
| 'G': WriteString("--.");
| 'H': WriteString("....");
| 'I': WriteString("..");
| 'J': WriteString(".---");
| 'K': WriteString("-.-");
| 'L': WriteString(".-..");
| 'M': WriteString("--");
| 'N': WriteString("-.");
| 'O': WriteString("---");
| 'P': WriteString(".--.");
| 'Q': WriteString("--.-");
| 'R': WriteString(".-.");
| 'S': WriteString("...");
| 'T': WriteString("-");
| 'U': WriteString("..-");
| 'V': WriteString("...-");
| 'W': WriteString(".--");
| 'X': WriteString("-..-");
| 'Y': WriteString("-.--");
| 'Z': WriteString("--..");
| '0': WriteString("-----");
| '1': WriteString(".----");
| '2': WriteString("..---");
| '3': WriteString("...--");
| '4': WriteString("....-");
| '5': WriteString(".....");
| '6': WriteString("-....");
| '7': WriteString("--...");
| '8': WriteString("---..");
| '9': WriteString("----.");
| ' ': WriteString(" ");
ELSE
IF (str[i] # 0C) THEN
WriteString("?");
END
END;
WriteString(" ");
END;
END WriteMorseCode;
BEGIN
WriteMorseCode("hello world");
WriteLn;
ReadChar;
END MorseCode.

View file

@ -0,0 +1,60 @@
Red [
file: %morse.red ;; filename, could be ommited
]
; ";" is character for comment, i use double ones for better readability
DIT: 100 ;; constant : 100 ms for short Beep
FREQ: 700 ;; frequency for Beep
;; exported code for red/system win api calls to Beep / Sleep:
#include %api.reds
;; string with morse codes for alphabet:
;; ( caution, u must use "str: copy ..." if code ist to be executed multiple times ! )
str: "A.-B-...C-.-.D-..E.F..-.G--.H....I..J.---K-.-L.-..M--N-."
append str "O---P.--.Q--.-R.-.S...T-U..-V...-W.--X-..-Y-.--Z--.."
delim: charset [#"A" - #"Z"]
;; use of parse to generate "mc" morse code series / array containing codes for A - Z
;; use characters only as delimiter for each code
mc: parse str [ thru "A" collect some [ keep copy result to [delim | end ] skip ] ]
;;--------------------------------------------
send-code: func ["function to play morse code for character "
;;--------------------------------------------
chr [char!] ;; character A .. Z
][
sleep 500 ;; short break so u can read the character first
ind: to-integer chr - 64 ;; calculate index for morse array
foreach sym mc/:ind [ ;; foreach symbol of code for character ...
prin sym ;; prin(t) "." or "-"
either sym = #"." [ ;; short beep
beep FREQ DIT
][
beep FREQ 3 * DIT ;; or long beep = 3 x short
]
sleep DIT ;; short break after each character
]
]
;;----------------------------------------------
morse-text: func ["extract valid characters from sentence"
;;----------------------------------------------
msg [string!]
][
foreach chr uppercase msg [
prin chr prin " " ;; print character
;; valid character A-Z ?
either (chr >= #"A") and (chr <= #"Z") [
send-code chr
] [ ;; ... "else" word gap or unknown
sleep 6 * DIT ;; pause after word
]
prin newline ;; equal to : print """ ,( prin prints without crlf )
]
sleep 6 * DIT ;; pause after sentence
]
;;----------------------------------
morse-text "rosetta code"
morse-text "hello world"

View file

@ -0,0 +1,25 @@
Red/System [
file: %api.reds ;; filename, could be ommited
]
; --- lib import -----
;; for winapi functions "Beep" and "Sleep"
#system [ #import [ "kernel32.dll" stdcall [
wbeep: "Beep" [
frequ [integer!]
dur [integer!]
return: [integer!]
]
wsleep: "Sleep" [ dur [integer!] ]
] ] ]
beep: routine [
freq [integer!]
duration [integer!]
return: [integer!]
] [ wbeep freq duration ]
sleep: routine [
duration [integer!]
] [ wsleep duration ]
;;----------------------------------------------

View file

@ -0,0 +1,55 @@
morsecode = [["a", ".-"],
["b", "-..."],
["c", "-.-."],
["d", "-.."],
["e", "."],
["f", "..-."],
["g", "--."],
["h", "...."],
["i", ".."],
["j", ".---"],
["k", "-.-"],
["l", ".-.."],
["m", "--"],
["n", "-."],
["o", "---"],
["p", ".--."],
["q", "--.-"],
["r", ".-."],
["s", "..."],
["t", "-"],
["u", "..-"],
["v", "...-"],
["w", ".--"],
["x", "-..-"],
["y", "-.--"],
["z", "--.."],
["0", "-----"],
["1", ".----"],
["2", "..---"],
["3", "...--"],
["4", "....-"],
["5", "....."],
["6", "-...."],
["7", "--..."],
["8", "---.."],
["9", "----."]]
strmorse = ""
str = "this is a test text"
for n = 1 to len(str)
pos = 0
for m = 1 to len(morsecode)
if morsecode[m][1] = str[n]
pos = m
ok
next
if str[n] = " "
strmorse = strmorse + " "
else
if pos > 0
strmorse = strmorse + morsecode[pos][2] + "|"
ok
ok
next
strmorse = left(strmorse,len(strmorse)-1)
see strmorse + nl

View file

@ -0,0 +1,60 @@
Option Explicit
Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Const MORSE_ALPHA As String = ".-,-...,-.-.,-..,.,..-.,--.,....,..,.---,-.-,.-..,--,-.,---,.--.,--.-,.-.,...,-,..-,...-,.--,-..-,-.--,--.."
Private Const MORSE_NUMERIC As String = "-----,.----,..---,...--,....-,.....,-....,--...,---..,----."
Private Const ONE_UNIT As Integer = 100
Private Const BEEP_DOT As Integer = ONE_UNIT
Private Const BEEP_DASH As Integer = 3 * ONE_UNIT
Private Const BEEP_OTHER As Integer = 7 * ONE_UNIT
Private Const DELAY As Integer = ONE_UNIT
Private Const LETTERS_DELAY As Integer = 3 * ONE_UNIT
Private Const SPACE_DELAY As Integer = 7 * ONE_UNIT
Private Const FREQUENCY_CHARS As Integer = 1200
Private Const FREQUENCY_OTHERCHARS As Integer = 400
Sub Main()
Dim p$, temp$
p = ToMorse("Hel/lo 123 world")
temp = Replace(p, "+", "")
Debug.Print Replace(temp, "_", "")
PlayMorse p
End Sub
Private Function ToMorse(s As String) As String
Dim i&, t$, j&
s = UCase(s)
For i = 1 To Len(s)
j = Asc(Mid(s, i, 1))
Select Case j
Case 65 To 90 'alpha
t = t & Split(MORSE_ALPHA, ",")(j - 65) & "+" ' "+" ==> separate each characters
Case 48 To 57 'numerics
t = t & Split(MORSE_NUMERIC, ",")(j - 48) & "+"
Case 32 'space
t = t & " " & "+"
Case Else 'others
t = t & "_" & "+"
End Select
Next i
ToMorse = t
End Function
Private Sub PlayMorse(s As String)
Dim i&
For i = 1 To Len(s)
Select Case Mid(s, i, 1)
Case ".": Beep FREQUENCY_CHARS, BEEP_DOT
Case "-": Beep FREQUENCY_CHARS, BEEP_DASH
Case "_": Beep FREQUENCY_OTHERCHARS, BEEP_OTHER
Case "+": Sleep LETTERS_DELAY
Case " ": Sleep SPACE_DELAY
End Select
Sleep DELAY
Next i
End Sub