JSL-Programmierherausforderung: Konvertieren Sie von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und wieder zurückHallo JSL-Programmierer,
Ich hatte ein kleines Problem im Rahmen einer größeren Anwendung und dachte, ich würde es mit Ihnen teilen und sehen, ob es eine Möglichkeit gibt, es besser/besser zu machen.
Im Grunde habe ich einen Vektor aus Einsen und Nullen (also [1, 1, 0, 0, 1]), den ich in eine Zeichenfolge aus Ys und Ns (also „YYNNY“) umwandeln muss.Dann muss ich das Gegenteil tun, das heißt, eine Zeichenfolge aus Ys und Ns zurück in einen Vektor aus Einsen und Nullen umwandeln.
Hier sind meine Quick-and-Dirty-Funktionen – mal sehen, ob Ihnen etwas einfällt, das über meine schwache Intelligenz hinausgeht!
// Convert a vector of 1s and 0s to a string with no separators
matrix_10_to_yn = function({matrix_10}, {default local},
yn_txt = "";
if (nrows(matrix_10) > 0,
// Strip out square brackets and commas
yn_txt = substitute(char(matrix_10), "[", "", "]", "", ", ", "");
// Now convert 1s to Y and 0s to N
yn_txt = substitute(yn_txt, "1", "Y", "0", "N");
);
yn_txt;
);
// Convert a YN string with no separators to a vector of 1s and 0s
yn_to_matrix_10 = function({yn_txt}, {default local},
n = length(yn_txt);
matrix_10 = j(n, 1, 0);
for (i = 1, i <= n, i++,
if (substr(yn_txt, i, 1) == "Y",
matrix_10[i] = 1;
);
);
matrix_10;
);
<BR />// Test thing out
a = yn_to_matrix_10("YYYNNNN"); show(a);
b = matrix_10_to_yn(a); show(b);
c = yn_to_matrix_10(""); show(c);
d = matrix_10_to_yn(c); show(d);Betreff: JSL-Programmierherausforderung: Konvertieren von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und zurückSolche coolen Lösungen.Ich kann die Vielfalt der Ansätze zur Lösung dieses relativ einfachen Problems kaum glauben.Nochmals vielen Dank an alle.
Betreff: JSL-Programmierherausforderung: Konvertieren von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und zurückDas sind alles sehr coole Lösungen. PMROZ wies darauf hin, dass ich falsch verstanden habe, dass der Sekanrio mit einer Liste beginnen soll. Er fragte nach meiner überarbeiteten Lösung.Unten wird eine Liste oder eine Zeichenfolge von YNs in einen Vektor von 10ern und ein Vektor von 10ern in eine Zeichenfolge von YNs konvertiert.
Um mit meinem vorherigen Beitrag übereinzustimmen, habe ich die Zeichenfolge einfach mit der Funktion „words()“ in eine Liste umgewandelt und dabei ein leeres Zeichenfolgentrennzeichen verwendet.
exmat = J(25,1, RandomInteger(0,1));
exlst = Insert({}, {"Y", "N"}[2-exmat]);
exstr = ConcatItems(Insert({}, {"Y", "N"}[2-exmat]), "");
convert_yn = Function({usr}, {rslt=empty(), ynList ={"Y","N"} },
if(IsMatrix(usr),
rslt = ConcatItems(insert({},ynList[2-usr]),"")
, //else
IsList(usr),
rslt = J(nitems(usr),1, 1);
rslt[loc(usr,"N")]=0
, //else
IsString(usr),
rslt = J(length(Trim(usr)),1,1);
rslt[loc(words(usr,""),"N")]=0
); //end if
rslt
); //end Function
show(exmat, convert_yn(exmat), exlst, convert_yn(exlst), exstr, convert_yn(exstr) );Betreff: JSL-Programmierherausforderung: Konvertieren von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und zurückIch verwende in den meisten Projekten eine generische „mapply“-Funktion, daher würde ich normalerweise nur die letzten beiden Zeilen benötigen:
Names Default to here(1);
// Utility function to make for loops, combo 'map' and 'apply'
// this is a 'fake' map/apply function because it allows side
// effects (like apply) and it also returns a value (like map)
mapply = function( {x, foo, arg1 = "__missing", arg2 = "__missing"}, { i, r = {}, x, foo, arg1, arg2, arg1missing, arg2missing },
if( N Items( x ) < 1,
return({}), //empty list supplied, return an empty list
for( i = 1, i <= N Items(x), i++,
arg1missing = 0; arg2missing = 0;
If( type(arg1) == "String", If( arg1 == "__missing", arg1missing = 1 ) );
If( type(arg2) == "String", If( arg2 == "__missing", arg2missing = 1 ) );
if(
arg1missing == 1,
r = Insert( r, foo( x[i] ) ),
arg2missing == 1,
r = Insert( r, foo( x[i], arg1 ) ),
r = Insert( r, foo( x[i], arg1, arg2 ) )
)
)
);
return(r);
);
// Solution:
str = "YYYNNNNYYNY";
(numbers = mapply( words(str,""), function( {x}, if( x=="Y", 1, 0) ) ) )
mapply( as list(numbers), function( {x}, if( x==1,"Y", "N") ) )Betreff: JSL-Programmierherausforderung: Konvertieren von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und zurück@pmroz ,
Hier ist meine Meinung/mein Versuch dazu. Vielen Dank, dass Sie diese interessante Herausforderung angeboten haben. Ich weiß, dass ich eine Schleife verwende, von der ich nicht weiß, ob sie sich gut über große Matrizen skalieren lässt, aber ich dachte, einige andere in der Community könnten sich einen schnelleren Weg einfallen lassen.
Clear Log(); Clear Globals();
ex = Associative Array({1,0} ,{"Y", "N"});
Test = [1,0, 1, 1, 1, 0, 0, 1, 0, 1];
Res = {};
for(i = 1, i <= N Rows(Test), i++,
Insert Into(Res, ex << Get Value(Test[i]));
);
Show(Res);
Betreff: JSL-Programmierherausforderung: Konvertieren von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und zurückund jetzt muss ich die Funktion design() studieren!
Betreff: JSL-Programmierherausforderung: Konvertieren von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und zurückWow, die sind erstaunlich.Vielen Dank an alle!
Betreff: JSL-Programmierherausforderung: Konvertieren von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und zurückHoppla, ich habe Craigs Antwort nicht gesehen ... seine Version ist besser, denke ich.
Betreff: JSL-Programmierherausforderung: Konvertieren von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und zurückSie können die String-zu-Matrix-Konvertierung in einer einzigen Zeile durchführen, indem Sie „Char to Blob“ und „Blob to Matrix“ verwenden. Mein Beitrag:
names default to here(1);
a=[1,0, 1, 1, 1, 0, 0, 1, 0, 1];
b="YNYYYNNYNY";
f_YNString_to_IndicatorVector=Function({s},
blob to matrix(char to blob(d),"int", 1, "little", 1)==89;
);
f_IndicatorVector_to_YNString=Function({v},{vv},
vv=As List(v);
vv[loc(v)]="Y";
vv[loc(!v)]="N";
concat items(vv,"");
);
show(a);
show(b);
Show(f_YNString_to_IndicatorVector(b));
Show(f_IndicatorVector_to_YNString(a));
Show(f_IndicatorVector_to_YNString(f_YNString_to_IndicatorVector(b)));
Betreff: JSL-Programmierherausforderung: Konvertieren von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und zurück
Dies lässt sich nicht ohne zusätzlichen Aufwand auf drei Werte oder fehlende/fehlerhafte Werte erstrecken. Es konvertiert String--Blob--Matrix und führt die Y- und N-Erkennung anhand der Nummer des ASCII-Zeichens in der Matrix durch. Die Funktionen „BlobToMatrix“ und „MatrixToBlob“ werden angewiesen, 1-Byte-Little-Endian-Ganzzahlen zu verwenden. Für 1-Byte-Zahlen ist die Endianness nicht kritisch, Big funktioniert genauso gut. Es kommt darauf an, dass die Zeichen Ein-Byte-Darstellungen haben.
source = "YYNNYQ";
// if you are uncomfortable with hard coded constants...
Yvalue = Blob To Matrix( Char To Blob( "Y" ), "int", 1, "little" )[1]; // 89
Nvalue = Blob To Matrix( Char To Blob( "N" ), "int", 1, "little" )[1]; // 78
// forward
numbers = Blob To Matrix( Char To Blob( source ), "int", 1, "little" ) == Yvalue;
// reverse
string = Blob To Char( Matrix To Blob( Nvalue + numbers * (Yvalue - Nvalue), "int", 1, "little" ) );
// display
Show( source, numbers, string );
Quelle = "YYNNYQ";
Zahlen = [1, 1, 0, 0, 1, 0];
string = "YYNNYN";
Betreff: JSL-Programmierherausforderung: Konvertieren von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und zurückEin anderer!!
Names Default to here(1);
yto1 = function({str},
{DEFAULT LOCAL},
list = words(str, "");
design(list, {"Y"});
);
oneToY = function({mat},
list = substitute(as list(mat), 1, "Y", 0, "N");
Concat items(list, "");
);
str = "YYYNNNNYYNY";
nums = yto1(str);
show(nums);
str2 = oneToY(nums);
show(str2, str2==str);Betreff: JSL-Programmierherausforderung: Konvertieren von einer Zeichenfolge aus Ys und Ns in eine Matrix aus Einsen und Nullen und zurückWas funktioniert, funktioniert!Hier ist eine Alternative.
exmat = J(25,1, RandomInteger(0,1));
exlst = Insert({}, {"Y", "N"}[2-exmat]);
convert_yn = Function({usr}, {rslt, ynList ={"Y","N"} },
if(IsMatrix(usr),
rslt = insert({},ynList[2-usr])
, //else
rslt = J(nitems(usr),1, 1);
rslt[loc(usr,"N")]=0
); //end if
rslt
); //end Function
show(exmat, convert_yn(exmat), exlst, convert_yn(exlst));