September Morn Update

This commit is contained in:
Ingy döt Net 2019-09-12 10:33:56 -07:00
parent 4e2d22a71d
commit aac6731f2c
6856 changed files with 141342 additions and 21127 deletions

View file

@ -1,8 +1,9 @@
# Usage: awk -f reverse.awk -v s=Rosetta
function rev(s, i,a,r) {
split(s, a, "")
for (i in a) r = a[i] r
function rev(s, i,len,a,r) {
len = split(s, a, "")
#for (i in a) r = a[i] r # may not work - order is not guaranteed !
for (i=1; i<=len; i++) r = a[i] r
return r
}
BEGIN {

View file

@ -1,6 +1,6 @@
10 INPUT S$
20 LET T$=""
30 FOR I=LEN S$ TO 1 STEP -1
40 LET T$=T$+S$(I)
50 NEXT I
60 PRINT T$
100 INPUT PROMPT "String: ":TX$
120 LET REV$=""
130 FOR I=LEN(TX$) TO 1 STEP-1
140 LET REV$=REV$&TX$(I)
150 NEXT
160 PRINT REV$

View file

@ -0,0 +1,6 @@
10 INPUT S$
20 LET T$=""
30 FOR I=LEN S$ TO 1 STEP -1
40 LET T$=T$+S$(I)
50 NEXT I
60 PRINT T$

View file

@ -0,0 +1,6 @@
static string ReverseString(string input)
{
char[] inputChars = input.ToCharArray();
Array.Reverse(inputChars);
return new string(inputChars);
}

View file

@ -0,0 +1,7 @@
using System.Linq;
// ...
return new string(input.Reverse().ToArray());
// ...

View file

@ -0,0 +1,14 @@
public string ReverseElements(string s)
{
// In .NET, a text element is series of code units that is displayed as one character, and so reversing the text
// elements of the string correctly handles combining character sequences and surrogate pairs.
var elements = System.Globalization.StringInfo.GetTextElementEnumerator(s);
return string.Concat(AsEnumerable(elements).OfType<string>().Reverse());
}
// Wraps an IEnumerator, allowing it to be used as an IEnumerable.
public IEnumerable AsEnumerable(IEnumerator enumerator)
{
while (enumerator.MoveNext())
yield return enumerator.Current;
}

View file

@ -0,0 +1,13 @@
shared void run() {
while(true) {
process.write("> ");
String? text = process.readLine();
if (is String text) {
print(text.reversed);
}
else {
break;
}
}
}

View file

@ -0,0 +1 @@
22405534230753963835153736737 [ 256 ~ d SS 0<F LS SR 1+ ] d sF x 1 - [ 1 - d 0<F 256 * LR + ] d sF x P

View file

@ -1,13 +1,14 @@
import system'routines.
import extensions.
import system'routines;
import extensions;
import extensions'text;
extension extension
{
reversedLiteral
= self toArray; sequenceReverse; summarize(String new); literal.
reversedLiteral()
= self.toArray().sequenceReverse().summarize(new StringWriter());
}
program =
[
console printLine("Hello World" reversedLiteral).
].
public program()
{
console.printLine("Hello World".reversedLiteral())
}

View file

@ -1,3 +1,4 @@
import Data.Char (isMark)
import Data.List (groupBy)
myReverse = concat . reverse . groupBy (const isMark)
accumulatingReverse :: [a] -> [a]
accumulatingReverse lst =
let rev xs a = foldl (flip (:)) a xs
in rev lst []

View file

@ -0,0 +1,3 @@
import Data.Char (isMark)
import Data.List (groupBy)
myReverse = concat . reverse . groupBy (const isMark)

View file

@ -0,0 +1,87 @@
; This is not strictly LLVM, as it uses the C library function "printf".
; LLVM does not provide a way to print values, so the alternative would be
; to just load the string into memory, and that would be boring.
; Additional comments have been inserted, as well as changes made from the output produced by clang such as putting more meaningful labels for the jumps
$"main.printf" = comdat any
@main.str = private unnamed_addr constant [12 x i8] c"Hello world\00", align 1
@"main.printf" = linkonce_odr unnamed_addr constant [4 x i8] c"%s\0A\00", comdat, align 1
define void @reverse(i64, i8*) {
%3 = alloca i8*, align 8 ; allocate str (local)
%4 = alloca i64, align 8 ; allocate len (local)
%5 = alloca i64, align 8 ; allocate i
%6 = alloca i64, align 8 ; allocate j
%7 = alloca i8, align 1 ; allocate t
store i8* %1, i8** %3, align 8 ; set str (local) to the parameter str
store i64 %0, i64* %4, align 8 ; set len (local) to the paremeter len
store i64 0, i64* %5, align 8 ; i = 0
%8 = load i64, i64* %4, align 8 ; load len
%9 = sub i64 %8, 1 ; decrement len
store i64 %9, i64* %6, align 8 ; j =
br label %loop
loop:
%10 = load i64, i64* %5, align 8 ; load i
%11 = load i64, i64* %6, align 8 ; load j
%12 = icmp ult i64 %10, %11 ; i < j
br i1 %12, label %loop_body, label %exit
loop_body:
%13 = load i8*, i8** %3, align 8 ; load str
%14 = load i64, i64* %5, align 8 ; load i
%15 = getelementptr inbounds i8, i8* %13, i64 %14 ; address of str[i]
%16 = load i8, i8* %15, align 1 ; load str[i]
store i8 %16, i8* %7, align 1 ; t = str[i]
%17 = load i64, i64* %6, align 8 ; load j
%18 = getelementptr inbounds i8, i8* %13, i64 %17 ; address of str[j]
%19 = load i8, i8* %18, align 1 ; load str[j]
%20 = getelementptr inbounds i8, i8* %13, i64 %14 ; address of str[i]
store i8 %19, i8* %20, align 1 ; str[i] = str[j]
%21 = load i8, i8* %7, align 1 ; load t
%22 = getelementptr inbounds i8, i8* %13, i64 %17 ; address of str[j]
store i8 %21, i8* %22, align 1 ; str[j] = t
;-- loop increment
%23 = load i64, i64* %5, align 8 ; load i
%24 = add i64 %23, 1 ; increment i
store i64 %24, i64* %5, align 8 ; store i
%25 = load i64, i64* %6, align 8 ; load j
%26 = add i64 %25, -1 ; decrement j
store i64 %26, i64* %6, align 8 ; store j
br label %loop
exit:
ret void
}
define i32 @main() {
;-- char str[]
%1 = alloca [12 x i8], align 1
;-- memcpy(str, "Hello world")
%2 = bitcast [12 x i8]* %1 to i8*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %2, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @main.str, i32 0, i32 0), i64 12, i32 1, i1 false)
;-- printf("%s\n", str)
%3 = getelementptr inbounds [12 x i8], [12 x i8]* %1, i32 0, i32 0
%4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @"main.printf", i32 0, i32 0), i8* %3)
;-- %7 = strlen(str)
%5 = getelementptr inbounds [12 x i8], [12 x i8]* %1, i32 0, i32 0
%6 = call i64 @strlen(i8* %5)
;-- reverse(%6, str)
call void @reverse(i64 %6, i8* %5)
;-- printf("%s\n", str)
%7 = getelementptr inbounds [12 x i8], [12 x i8]* %1, i32 0, i32 0
%8 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @"main.printf", i32 0, i32 0), i8* %7)
;-- end of main
ret i32 0
}
;--- The declaration for the external C printf function.
declare i32 @printf(i8*, ...)
; Function Attrs: argmemonly nounwind
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1)
declare i64 @strlen(i8*)

View file

@ -0,0 +1,30 @@
/* Reverse a string, in Neko */
var reverse = function(s) {
var len = $ssize(s)
if len < 2 return s
var reverse = $smake(len)
var pos = 0
while len > 0 $sset(reverse, pos ++= 1, $sget(s, len -= 1))
return reverse
}
var str = "never odd or even"
$print(str, "\n")
$print(reverse(str), "\n\n")
str = "abcdefghijklmnopqrstuvwxyz"
$print(str, "\n")
$print(reverse(str), "\n\n")
$print("single test\n")
str = "a"
$print(str, "\n")
$print(reverse(str), "\n\n")
$print("empty test\n")
str = ""
$print(str, "\n")
$print(reverse(str), "\n")

View file

@ -1,9 +1,6 @@
let rev_string str =
let len = String.length str in
let res = String.create len in
let last = len - 1 in
for i = 0 to last do
let j = last - i in
res.[i] <- str.[j];
done;
(res)
let string_rev s =
let len = String.length s in
String.init len (fun i -> s.[len - 1 - i])
let () =
print_endline (string_rev "Hello world!")

View file

@ -1,8 +1,15 @@
let rev_string str =
let last = String.length str - 1 in
let rev_bytes bs =
let last = Bytes.length bs - 1 in
for i = 0 to last / 2 do
let j = last - i in
let c = str.[i] in
str.[i] <- str.[j];
str.[j] <- c;
let c = Bytes.get bs i in
Bytes.set bs i (Bytes.get bs j);
Bytes.set bs j c;
done
let () =
let s = Bytes.of_string "Hello World" in
rev_bytes s;
print_bytes s;
print_newline ();
;;

View file

@ -1,4 +1,9 @@
let rec revs strin list index =
let rec revs_aux strin list index =
if List.length list = String.length strin
then String.concat "" list
else revs strin ((String.sub strin index 1)::list) (index+1)
else revs_aux strin ((String.sub strin index 1)::list) (index+1)
let revs s = revs_aux s [] 0
let () =
print_endline (revs "Hello World!")

View file

@ -0,0 +1,6 @@
(define (rev s)
(runes->string (reverse (string->runes s))))
; testing:
(print (rev "as⃝df̅"))
; ==> ̅fd⃝sa

View file

@ -1,2 +1,3 @@
say "hello world".flip;
say "asdf̅".flip
say "asdf̅".flip;
say 'ΑΩ 🤔 🇸🇧 🇺🇸 🇬🇧 👨👩👧👦🆗🗺'.flip;

View file

@ -0,0 +1,11 @@
use utf8;
binmode STDOUT, ":utf8";
# to reverse characters (code points):
print reverse('visor'), "\n";
# to reverse graphemes:
print join("", reverse "José" =~ /\X/g), "\n";
$string = 'ℵΑΩ 駱駝道 🤔 🇸🇧 🇺🇸 🇬🇧‍ 👨‍👩‍👧‍👦🆗🗺';
print join("", reverse $string =~ /\X/g), "\n";

View file

@ -0,0 +1,6 @@
#DIM ALL
#COMPILER PBCC 6
FUNCTION PBMAIN () AS LONG
CON.PRINT STRREVERSE$("PowerBASIC")
END FUNCTION

View file

@ -1 +1 @@
raw_input()[::-1]
input()[::-1]

View file

@ -1,25 +1,11 @@
'''
Reverse a Unicode string with proper handling of combining characters
'''
import unicodedata
def ureverse(ustring):
'''
Reverse a string including unicode combining characters
Example:
>>> ucode = ''.join( chr(int(n, 16))
for n in ['61', '73', '20dd', '64', '66', '305'] )
>>> ucoderev = ureverse(ucode)
>>> ['%x' % ord(char) for char in ucoderev]
['66', '305', '64', '73', '20dd', '61']
>>>
'''
'Reverse a string including unicode combining characters'
groupedchars = []
uchar = list(ustring)
while uchar:
if 'COMBINING' in unicodedata.name(uchar[0], ''):
if unicodedata.combining(uchar[0]) != 0:
groupedchars[-1] += uchar.pop(0)
else:
groupedchars.append(uchar.pop(0))
@ -28,9 +14,16 @@ def ureverse(ustring):
return ''.join(groupedchars)
def say_string(s):
return ' '.join([s, '=', ' | '.join(unicodedata.name(ch, '') for ch in s)])
def say_rev(s):
print(f"Input: {say_string(s)}")
print(f"Character reversed: {say_string(s[::-1])}")
print(f"Unicode reversed: {say_string(ureverse(s))}")
print(f"Unicode reverse²: {say_string(ureverse(ureverse(s)))}")
if __name__ == '__main__':
ucode = ''.join( chr(int(n, 16))
for n in ['61', '73', '20dd', '64', '66', '305'] )
ucoderev = ureverse(ucode)
print (ucode)
print (ucoderev)
ucode = ''.join(chr(int(n[2:], 16)) for n in
'U+0041 U+030A U+0073 U+0074 U+0072 U+006F U+0308 U+006D'.split())
say_rev(ucode)

View file

@ -0,0 +1,3 @@
ucode = ''.join(chr(int(n[2:], 16)) for n in
'U+006B U+0301 U+0075 U+032D U+006F U+0304 U+0301 U+006E'.split())
say_rev(ucode)

View file

@ -0,0 +1,3 @@
ucode = ''.join(chr(int(n, 16))
for n in ['61', '73', '20dd', '64', '66', '305'])
say_rev(ucode)

View file

@ -0,0 +1,16 @@
. "local1 = Main string"
. "local2 = Temporary string storage"
. "local3 = String length"
set "$local1" to ""
set "$local2 " to ""
set "local3" to 0
input string "String to reverse:"
set "$local1" to "&INPUT&"
set "$local2" to "$local1"
set "local3" to "$local2.length"
loop start
set "$local1.(('local3' - 1) - 'loopcount')" to "$local2.('loopcount')"
loop for "('local3' - 1)"
* "Reversed string: &$local1& (Length: &$local1.length&)"
end

View file

@ -0,0 +1,26 @@
BEGIN
TEXT PROCEDURE REV(S); TEXT S;
BEGIN
TEXT T;
INTEGER L,R;
T :- COPY(S);
L := 1; R := T.LENGTH;
WHILE L < R DO
BEGIN
CHARACTER CL,CR;
T.SETPOS(L); CL := T.GETCHAR;
T.SETPOS(R); CR := T.GETCHAR;
T.SETPOS(L); T.PUTCHAR(CR);
T.SETPOS(R); T.PUTCHAR(CL);
L := L+1;
R := R-1;
END;
REV :- T;
END REV;
TEXT INP;
INP :- "asdf";
OUTTEXT(INP); OUTIMAGE;
OUTTEXT(REV(INP)); OUTIMAGE;
END

View file

@ -1,5 +1,57 @@
Function Reverse(ByVal s As String) As String
Dim t() as Char = s.toCharArray
Array.reverse(t)
Return new String(t)
End Function
#Const REDIRECTOUT = True
Module Program
Const OUTPATH = "out.txt"
ReadOnly TestCases As String() = {"asdf", "as⃝df̅", "Les Misérables"}
' SIMPLE VERSION
Function Reverse(s As String) As String
Dim t = s.ToCharArray()
Array.Reverse(t)
Return New String(t)
End Function
' EXTRA CREDIT VERSION
Function ReverseElements(s As String) As String
' In .NET, a text element is series of code units that is displayed as one character, and so reversing the text
' elements of the string correctly handles combining character sequences and surrogate pairs.
Dim elements = Globalization.StringInfo.GetTextElementEnumerator(s)
Return String.Concat(AsEnumerable(elements).OfType(Of String).Reverse())
End Function
' Wraps an IEnumerator, allowing it to be used as an IEnumerable.
Iterator Function AsEnumerable(enumerator As IEnumerator) As IEnumerable
Do While enumerator.MoveNext()
Yield enumerator.Current
Loop
End Function
Sub Main()
Const INDENT = " "
#If REDIRECTOUT Then
Const OUTPATH = "out.txt"
Using s = IO.File.Open(OUTPATH, IO.FileMode.Create),
sw As New IO.StreamWriter(s)
Console.SetOut(sw)
#Else
Try
Console.OutputEncoding = Text.Encoding.ASCII
Console.OutputEncoding = Text.Encoding.UTF8
Console.OutputEncoding = Text.Encoding.Unicode
Catch ex As Exception
Console.WriteLine("Failed to set console encoding to Unicode." & vbLf)
End Try
#End If
For Each c In TestCases
Console.WriteLine(c)
Console.WriteLine(INDENT & "SIMPLE: " & Reverse(c))
Console.WriteLine(INDENT & "ELEMENTS: " & ReverseElements(c))
Console.WriteLine()
Next
#If REDIRECTOUT Then
End Using
#End If
End Sub
End Module

View file

@ -0,0 +1 @@
Debug.Print VBA.StrReverse("Visual Basic")