Zyzachinish Sonderheit



  • Hi,

    einige mögen vielleicht schon Mal von meiner Sprache Zyzachinish gehört haben.
    Im Modus 1/1 berechnet man in der 1. Umsetzung das neue Wort aus einem alten Wort so, dass man immer jeweils einen Buchstaben überspringt:

    1. 3. 5. 7. 9. ...

    kann man auf Grund der Länge des Wortes nicht weitermachen, so geht man, falls es geht, nur einen Buchstaben vor oder, anderenfalls, einen zurück.
    Danach springt man in Zweierschritten wieder zurück.

    Kurz zum Verständnis:

    Baum 1. 3. 4. 2. -> Buma
    Haus 1. 3. 4. 2. -> Husa
    Flamme 1. 3. 5. 6. 4. 2. -> Fameml

    von Sonderregeln mal abgesehen, jetzt gibt es sogenannte Umsetzungen.
    Die 0. Umsetzung ist das Wort selber, die 1. Umsetzung das, was wir hier kennengelernt haben. Die 2. Umsetzung ergibt sich aus der 1. Umsetzung, die einfach wiederum umgesetzt wird.

    0. Baum
    1. Buma
    2. Bmau

    So, jetzt kommen wir zu der Sonderheit:

    3. Baum

    Es gilt für alle Wörter, die nicht 5 Buchstaben haben:
    Die (Anzahl der Buchstaben - 1)te Umsetzung ist gleich der 0.

    Noch ein paar Beispiele:

    0. Flamme (6 Buchstaben)
    1. Fameml
    2. Fmmlea
    3. Fmealm
    4. Felmam
    5. Flamme

    0. Ventilator (10 Buchstaben)
    1. Vniaortlte
    2. Viottelran
    3. Votlanreti
    4. Vtartienlo
    5. Vatelonirt
    6. Vtlnrtioea
    7. Vlrieaotnt
    8. Vreonttail
    9. Ventilator

    0. Hai (3 Buchstaben (achne))
    1. Hia
    2. Hai

    0. Öl (2)
    1. Öl

    passt

    So, jetzt komme ich auf die Sonderregel zu sprechen:

    Bei 5 Buchstaben gibt es die Ausnahme:

    0. Wurst
    1. Wrtsu
    2. Wtusr
    3. Wurst

    Wobei Wurst hier KEINE Ausnahme ist.

    0. Dudel
    1. Ddleu
    2. Dlued
    3. Dudel

    Hier ist die (Anzahl der Buchstaben - 2)te Umsetzung gleich der 0.

    Hat jemand von euch eine Ahnung, wie das kommen kann?

    MfG Eisflamme 🙂



  • Hi,

    ich würde sagen, das ist einfach Zufall ohne mathematische Gründe, ich lasse mich aber gerne eines besseren belehren.

    Hier der "Beweis":
    0. 12345
    1. 13542
    2. 15243
    3. 12345 (5. - 2. Umsetzung)

    q.e.d. 😃

    ChrisM



  • Hi,

    na ja, damit gebe ich mich aber nicht zufrieden, für alle anderen Wörter irgendeiner Länge (1 Buchstabe seie ausgeschlossen) gilt die Regel (size - 1)te Stufe, warum ist die Ausnahme gerade bei 5 und nicht vielleicht 6?
    Ungerade Längen haben damit auch nichts zu tun, 7, 9, 11?

    0. Kondome (7, von Sonderregeln hier abgesehen)
    1. Knoemdo
    2. Komoden
    3. Kmdneoo
    4. Kdeoonm
    5. Keomnod
    6. Kondome

    also?

    MfG Eisflamme



  • Hi,

    so, bin nun mit Tool ausgestattet, hat bedenkswert lange gedauert, na ja, ich programmier ja eigentlich auch net mehr, also:

    ChrisM:
    Dein Beispiel ist nur ein weiteres solches dafür, dass die Regel für 5 Buchstaben anders ist. Für ungerade Buchstabenanzahl bin ich aber unsicher...

    Kloschüssel (11)

    0. Stufe: Kloschüssel
    1. Stufe: Kocüsleshsl
    2. Stufe: Kcsehlsslüo
    3. Stufe: Kshsloüslec
    4. Stufe: Khlülcesoss
    5. Stufe: Klleossscüh
    6. Stufe: Kloschüssel

    Birnenhai (9)

    0. Stufe: birnenhai
    1. Stufe: brehianni
    2. Stufe: beininahr
    3. Stufe: biiarhnne
    4. Stufe: birnenhai

    Grunz...

    gut, nehmen wir an, das gilt für gerade Zahlen:

    Birnenhaie (10):

    0. Stufe: Birnenhaie
    1. Stufe: Brehieanni
    2. Stufe: Beianinehr
    3. Stufe: Binnhreiae
    4. Stufe: Bnheaeirni
    5. Stufe: Bhainireen
    6. Stufe: Banreneiih
    7. Stufe: Bneeihinra
    8. Stufe: Beiiranhen
    9. Stufe: Birnenhaie

    Nagut, aber bei Scheibenwischerspritzwasserdüse (31) klappt es:

    0. Stufe: Scheibenwischerspritzwasserdüse
    1. Stufe: Shiewshrpizasrüesdeswtrsecinbec
    2. Stufe: Siwhpzsüsewreibcencstsderairseh
    3. Stufe: Swpsswebectdrisheraessncireüzhi
    4. Stufe: Spseetrseasniezihürcserhidcbwsw
    5. Stufe: Sseresizhrsricwwsbdhecüienastep
    6. Stufe: Seeihsiwsdeüeatpesnichbwcrrzsrs
    7. Stufe: Sehiseetencbcrssrzrwhispaüdwsie
    8. Stufe: Shseeccsrrhsadseiwüpiwzsrbnteie
    9. Stufe: Ssecrhasiüizrneeitbswpwedsrsceh
    10. Stufe: Seraiireibwwdrchessepstenzüshcs
    11. Stufe: Sririwdcesptnühscszeseshrwbeiae
    12. Stufe: Siidepnhczssrbieaewheessütscwrr
    13. Stufe: Siencsriawesüswrrctseheebszhpdi
    14. Stufe: Secraeüwrteebzpidhsehscrsswisni
    15. Stufe: Scaürebpdshcswsinisrsehizetwere
    16. Stufe: Sarbdhssnsshzteerweieriiwcspeüc
    17. Stufe: Srdsnszereeiwsecüpciriwethsshba
    18. Stufe: Sdnzreweücrwtshabsheiipcsieessr
    19. Stufe: Snrwürthbhipsesrseiciesaswceezd
    20. Stufe: Srütbisssiisscedzewaecerephhrwn
    21. Stufe: Sübssisezweeehrnwhprcaedcsisitr
    22. Stufe: Sbsszeerwpceciirtssdarhnheweisü
    23. Stufe: Sszewccitsahhwiüseenrdsriepresb
    24. Stufe: Szwctahisersipebsrerdneüwhsices
    25. Stufe: Swthsriesedewscseihünrrbpseiacz
    26. Stufe: Stsisdwcehnrpeazcisbrüisseeerhw
    27. Stufe: Ssswenpacsriserwheesübizerhcdit
    28. Stufe: Ssepcrsrheüiehdticrzbseweisanws
    29. Stufe: Secshüedirbeesnswaiwszcthierrps
    30. Stufe: Scheibenwischerspritzwasserdüse

    Toilletentieftaucher:

    0. Stufe: toilettentieftaucher
    1. Stufe: tietnifacerhutetetlo
    2. Stufe: tenfcrueelotttheaiti
    3. Stufe: tncueothatiiettlerfe
    4. Stufe: tcetaieteferltithoun
    5. Stufe: teaeeelihunottrftitc
    6. Stufe: taelhntrttciftouieee
    7. Stufe: tehttcfoieeeutitrnla
    8. Stufe: thtfieuirlantteeocte
    9. Stufe: ttiurateotecetnliefh
    10. Stufe: tirtoeenifheltcteaut
    11. Stufe: troeihlceutattefneti
    12. Stufe: toilettentieftaucher

    Mississippi (11):

    0. Stufe: mississippi
    1. Stufe: msispipissi
    2. Stufe: mippsisiiss
    3. Stufe: mpssissiipi
    4. Stufe: msisiipissp
    5. Stufe: miipspsiiss
    6. Stufe: mississippi

    Konsonante (10):

    0. Stufe: konsonante
    1. Stufe: knoatennso
    2. Stufe: kotnsonean
    3. Stufe: ktsnaneono
    4. Stufe: ksaenoonnt
    5. Stufe: kanontnoes
    6. Stufe: knnnesotoa
    7. Stufe: kneooatsnn
    8. Stufe: keotnnsaon
    9. Stufe: konsonante

    Manchmal klappt es, manchmal nicht!
    Dennoch glaube ich weiterhin, dass sich eine Formel finden lässt.

    Hat jemand von euch eine Ahnung?

    MfG Eisflamme



  • du hast aufgehört mit programmieren? wie schade.
    mein auswerter (7 minuten programmierzeit und dann noch 2 min testen, weil die ergebnisse so weit von deinen abwichen) mag noch fehler haben, aber er sagt

    0 1
    1 1
    2 1
    3 2
    4 3
    5 3
    6 5
    7 6
    8 4
    9 4
    10 9
    11 6
    12 11
    13 10
    14 9
    15 14
    16 5
    17 5
    18 12
    19 18
    20 12
    21 10
    22 7
    23 12
    24 23
    25 21
    26 8
    27 26
    28 20
    29 9
    30 29
    31 30
    32 6
    33 6
    34 33
    35 22
    36 35
    37 9
    38 20
    39 30
    40 39
    41 27
    42 41
    43 8
    44 28
    45 11
    46 12
    47 10
    48 36
    49 24
    

    das sieht wenig nach n-1 aus.

    und die "formel" findet sich schnell.
    http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=A003558



  • Hi,

    mindestens eine Programmierpause...

    So, wie konnte man auf der Seite denn die Formel bekommen?

    2^m = +- 1 mod 2n + 1

    Die?
    Sieht nett aus...

    Aber die funktioniert irgendwie nicht... Wenn ich versuche mit m = 4 aufzulösen, kriege ich nur false, dass es sich net auflösen ließe.
    Wie sind denn die Klammern bei mod zu setzen?

    MfG Eisflamme



  • Hi,

    ich weiß nicht, wie dein Auswerter arbeitet, aber es gibt noch Sonderregeln, die die Reihe abweichen lassen kann und dadurch zu verfälschten Ergebnissen führen kann.
    Bestimmte Wörter haben durch ihre Beschaffenheit die Eigenschaft früher fertig zu sein, als andere.
    Z.B. ein Palindrom ist rückwärts gelesen das Gleiche. (wars doch, oder?)
    Na ja, das könnte auch zum Problem werden.
    Wie hast du das überhaupt gemacht, deinen Auswerter, mein ich?

    Na ja, ich hab bissel mit der Formel rumprobiert, komm aber nicht klar. 😞

    MfG Eisflamme



  • Mis2com schrieb:

    Wie sind denn die Klammern bei mod zu setzen?

    bei den mathematikern ist "mod 2n + 1" ein aspekt des gleichheitszeichens der gleichung. in programmiersprachen würde man eher schreiben
    2^m mod 2n + 1 = +- 1 mod 2n + 1
    und weil +-1 so 'klein' ist, auch
    2^m mod 2n + 1 = +- 1
    edit: eben nicht, -1 kommt ja nie raus. das -1 entspricht 2n
    also
    2^m mod 2n + 1 = 1 oder 2^m mod 2n + 1 = 2n



  • Mis2com schrieb:

    ich weiß nicht, wie dein Auswerter arbeitet, aber es gibt noch Sonderregeln, die die Reihe abweichen lassen kann und dadurch zu verfälschten Ergebnissen führen kann.
    Bestimmte Wörter haben durch ihre Beschaffenheit die Eigenschaft früher fertig zu sein, als andere.

    logo. nehmen wir mal den zyklus
    The, Teh, The
    . der ist fein und wie erwartet.
    und nun nehmen wir mal
    Tee, Tee, Tee
    . der sieht nur so kurz aus, weil das e sich so wenig vom e unterscheidet.

    Wie hast du das überhaupt gemacht, deinen Auswerter, mein ich?

    um nicht in die Tee-falle zu tappen, hab ich integers genommen.

    #include <iostream>
    using namespace std;
    
    void trans(int *arr,int size){
    	int *res=new int[size];
    	int ri=0;
    	if(size%2==0){
    		for(int i=0;i<size;i+=2)
    			res[ri++]=arr[i];
    		for(int i=size-1;i>=0;i-=2)
    			res[ri++]=arr[i];
    	}
    	else{
    		for(int i=0;i<size;i+=2)
    			res[ri++]=arr[i];
    		for(int i=size-2;i>=0;i-=2)
    			res[ri++]=arr[i];
    	}
    	for(int i=0;i<size;++i){
    		arr[i]=res[i];
    //		cout<<arr[i]<<' ';
    	}
    //	cout<<endl;
    	delete[] res;
    }
    
    bool isZero(int* arr,int size){
    	for(int i=0;i!=size;++i)
    		if(arr[i]!=i)
    			return false;
    	return true;
    }
    
    void fill(int* arr,int size){
    	for(int i=0;i!=size;++i)
    		arr[i]=i;
    }
    
    int test(int size){
    	int* arr=new int[size];
    	fill(arr,size);
    	int result=0;
    	do{
    		++result;
    		trans(arr,size);
    	}while(!isZero(arr,size));
    	delete[] arr;
    	return result;
    }
    
    int main() 
    {
    	for(int i=0;i<50;++i){
    		int c=test(i);
    		cout<<i<<' '<<c<<endl;
    		//cout<<c<<' ';
    	}
    	return 0;
    }
    


  • Hi,

    ein fei gerissener Typ, dieser volkard, gell. 😉
    Gut, aber ich verstehe die Formel nach wie vor nicht. Entspricht das mod denn nicht dem mathematischen Modulo-Operator?

    MfG Eisflamme



  • Mis2com schrieb:

    Entspricht das mod denn nicht dem mathematischen Modulo-Operator?

    eigentlich arbeitet der mathematiker mit restklassen. er denkt sich zum beispiel mal "jetzt rechne ich ne weile lang mod 26" und meint damit "ab jetzt gibt es für mich keinen unterschied mehr zwischen 1 und 27 und 53 und 79 und -25 usw." diese zahlen, die jeweils keinen unterschied mehr haben, werden zu gruppen (klassen) zusammengefaßt. wenn man mod 26 rechnet, entstehen 26 klassen.
    eine klasse heißt {0,26,52,...}, eine andere heißt {1,27,53,...}, usw und eine heißt {25,....}. zusammen 26 klassen. jede der klassen hat unendlich viele elemente.

    wenn man mal eingangsdaten hat, wo man ncht weiß, weche zahl genau da war, soindern nur, in welcher klasse sie war, kann man vom ergebnis auch nur sagen, in welcher klasse sie sein wird. das könnte man so schreiben:
    {1,27,53,...}+{2,28,54,...}={3,29,55,...}
    oder besser
    "wenn man einen beliebigen vertreter der klasse, wo die 1 drin ist, mit einem beliebigen vertreter der klasse, wo die 2 drin ist, addiert, kommt irgend ein vertreter der klasse, wo die 3 drin ist, heraus."
    praktischerweise sagt der mathemetiker lieber
    "jetzt mal alles modulo 26. 1+2=3."
    oder
    "1+2=3 modulo 26"
    diese zeile sagt nxhts anderes als
    "27+55=-23 modulo 26"
    es ist eingach ganz egal, welchen repräsentaten man wählt, um ein restklasse darzustellen.

    übung: was ist 24 * 23, wenn man modulo 26 rechnet?

    schlechte lösung: rechne 24 * 23 und komme nach langer rechnung spontanauf 552. davon ziehe ich mal 520 (oder 0 mod 26, weil 20*26==520) ab, bleibt 32, davon noch 26 weg, bleibt 6.

    gute lösung. ich entdecke, daß 24 == -2 mod 26 und 23 == -3 mode 26, rechne also -2 * -3 mod 26 und schreibe fehlerfrei hin -2 * -3 == 6 mod 26.

    übung: was ist 5 * 95, wenn ich modulo 100 rechne?

    lösung: 5 * -5 == -25 mod 100
    wer mag, kann auch
    5 * -5 == 75 mod 100
    schreiben, es ist genauso richtig.

    und hier ist auch schon der unterschied zum modulo-operator, wie wir ihn in c++ kennen. der gibt immer ein eindeutiges ergebnis aus.
    auf die frage "if(53 % 26 == 27)" wird er nicht mit "true" antworten.
    man könnte umstellen und fragen

    "if(53 % 26 == 27 % 26)". jo, das würde gehen. im ergebnis irgendwie das gleiche, aber ne andere sichtweise. und leider gibt's mit negativen zahlen ärger. die sind in c++ einfach komisch, wenn man mit % arbeitet.

    und zu allem überfluss will die formel auf der einen seite +-1 haben. wenn wir darauf den %-operator von c++ loslassen, wird's nur doof. lieber bei nichtnegativen zhalen bleiben, wenn man in c++ mit % arbeitet.

    gescht ist
    "Least number m such that 2^m = +- 1 mod 2n + 1."
    also
    "kleinste zahl m, so daß 2^m = +-1 mod 2n+1"

    oder anders:
    2^m +-1 = 0 mod 2n+1

    also man n==5 nehmen, deine ausnahme.

    2n+1==11

    welche zweierpotenz ist nur um eins von nem vielfachen von 11 weg?
    2 nicht. 4 auch nicht. 8 nicht. 16 nicht. 32 aber! 32 ist nur um eins von 33 weg. treffer.
    2^5==32.

    oh, hatte ich erwähnt, daß die folge A003558 gegenüber deiner folge verschoben ist? nee, gell? dann verrate ich es jetzt: sie ist verschoben.

    mal ne größere zahl probieren. mal n==8 testen. dann ist ne zweierpotenz zu suchen, die dicht bei nem vielfachen von 17 liegt. jo, 26, da brauche ich gar nicht lange gucken. also m==4.

    das ergibt dann die folge 1,2,3,3,5,6,4,4,9,6,11...
    das programm gab aus: 1,1,2,3,3,...

    also ne verschiebung um eins.

    können wir in der formel heilen.

    wir suchen einfach
    "kleinste zahl m, so daß 2^m = +-1 mod 2n-1"

    test mit ner zahl, die sich nicht leicht mit nachbarn verwechseln läßt aus der programmausgabe:

    21 10
    22 7
    23 12
    

    n sei 22.
    zu suchen ist ne zweierpotenz dicht an nem vielfachen von 2*n-1, also von 21.
    2, 4, 8, 16, 32 offensichtlich nicht. 64 liegt aber ganz dicht an 63.

    und warum kommt jetzt 6 raus und nicht 7?
    ach, details. entweder isses kein fehler oder du hast dich verlesen.

    zum codieren bleibt wohl nur ne schleife übrig. (komisch, da muss es duch was schneleres geben tun).

    int calc(int n){
       int mod=2*n-1;
       for(int x=2,r=1;;x*=2,++r)
          if(x%mod==1 || x%mod==mod-1)
             return n;//oder muss hier n+1 hin?
       return 0;//only to make the compiler happy
    }
    

    die hat ein doofes problem, wenn x zu groß wird und nicht mehr in nen int paßt.
    besser ist die her:

    int calc(int n){
       int mod=2*n-1;
       for(int x=2,r=1;;x=x*2%mod,++r)
          if(x==1 || x==mod-1)
             return n;//oder muss hier n+1 hin?
       return 0;//only to make the compiler happy
    }
    

    beachte, daß nach jedem verdoppeln von x sofort %mod gerechnet wird. daher kann x nur werte zwischen 0 und mod annehmen. außerdem hat x mit 1 angefangen und muß sicher wieder bis zur 1 zurückkommen. spätestens nach mod versuchen, weil's ein zyklus unmöglich länger als mod zahlen lang sein kann, wenn es nur mod verschiedene zahlen geben tut.

    kann aber nicht alles so einfach sein, also hab ich bestimmt wieder ganz viele fehler drin. naja, vielleicht hilft's dir trotzdem.

    edit: im test war natürlich nach nem nachbarn eines vielfachen von 43 gesucht.
    dazu starte ich calc.exe und tippe
    43 //anzeige: 43
    +[enter] //anzeige 86
    //und jetzt so lange enter, bis ich ne 2-erpotenz erkenne. bis 2^17 kenne
    //ich sie praktischerweise noch auswendig.
    [enter] //anzeige 129

    das war's schon. 129, also m==7. stimmt.
    vielleicht ist das prog so auch schneller. sieht ganz fein aus, daß mit drei additionen schon was kam.
    zum test, ob was ein nachbar von ner zweierpotenz ist, teste die beiden nachbarn, ob sie ne zweierpotenz sind.
    zweierpotenz müßte an if(x&-x==0) erkennbar sein. aber we kommste danach an den zweierlogarithmus? entweder mit log(x)/log(2) oder mit __asm bsf (oder ner schleife).



  • Hi,

    mwahaha, super, vielen Dank. 🙂
    Jetzt habe ich Modulo Mal richtig verstanden. mod n bedeutet also, dass man n Klassen hat, wobei die einzelnen Elemente der Klasse jeweils den Abstand n haben.

    Vielen Dank für die Mühe! 🙂

    Ich habe fast alles verstanden, du erklärst sehr gut. Mach Mal dein Tutorial weiter, wenn du Zeit hast. ^^

    MfG Eisflamme



  • Hi,

    so, um den Thread zu erweitern, erkläre ich nun andere Modi.
    Der Modus 1/1 war dieser hier...

    1. 3. 5. 7. 9. 11. 13. 15. 17. 19. ...
    (20.) 18. 16. 14. 12. 10. 8. 6. 4. 2.

    Nun gibt es andere Modi, z.B. den Modus 2/2:

    1. 2. 5. 6. 9. 10. (...)
    8. 7. 4. 3.

    Demnach wird Integral zu:

    Ingralte

    Das ist natürlich ein völlig anderer Modus.
    Ich erwarte nicht, dass du jetzt in der Art weiterforscht, ich weiß ja jetzt, wie Modulo arbeitet und mit dessen Hilfe sollte ich es auch alleine schaffen, wenn ich Zeit habe.
    Dennoch ist es interessant!

    Hier übrigens noch zyzachinishe Sonderregeln, die das ganze Zeug beeinflussen:

    ss (=ß), ch, sh (=sch), qu sind im Zyzachinishen jeweils eigene Zeichen und werden als solche getrennt behandelt.

    Schaden -> Shdnea

    Gut, soweit so gut, ich muss Modulo und die zyzachinishe Umsetzungsformel für Modus 1/1 noch beachten.

    Richtig kompliziert kann es dann noch werden, wenn man eine Formel abhängig von der Anzahl der Buchstaben UND dem Modusverhältnis (1 zu 1, das sind zwei Ziffern, 1/1 ist nur eine Schreibweise und 1 zu 1 spricht man das) versucht zu finden.
    Dann gibt es noch abhängige Modi, wie sie heißen, da sind welche abhängig von der Anzahl der Buchstaben, von dem Durchschnitt der Vokale + 1 (und somit fast immer 1/1, weil i = 0 a = -2 e = -1 o = 1 u = 2).

    Na ja, ein Vorgeschmack auf diese enorme, imaginäre Sprache. ^^

    Danke für die Hilfe jedenfalls, noch eine Frage:
    Wie kann man mit dem mathematischen Modulo den eindeutigen Rest herausfinden, bzw. geht das überhaupt?

    MfG Eisflamme



  • Du erstaunst mich immer wieder volkard, du hast wirklich meinen höchsten Respekt für die Hingabe mit der du dich Problemen widmest.



  • Hi,

    ich stimme dir uneingeschränkt zu, TripH. 🙂

    MfG Eisflamme


Log in to reply