Geheimschrift MIX (Zeichenketten)
Ein Text (Zeichenkette) soll zunächst in zwei gleich lange Teile aufgeteilt werden, und danach werden diese Teile zeichenweise wieder zusammengefügt. Besteht der Text aus einer ungeraden Anzahl Zeichen, wird beim Aufteilen der erste Teil um ein Zeichen länger gemacht als der zweite. Beim Zusammenfügen wird mit dem ersten Buchstaben des ersten Teils begonnen, dann mit dem ersten Buchstaben des zweiten Teils weitergemacht; nun kommt der zweite Buchstabe des ersten Teils, und weiter geht es mit dem zweiten Buchstaben des zweiten Teils usw.
Programmieren Sie zur Überprüfung Ihres Programms die "Entschlüsselungsmethode", sprich die Umkehrung dieser einfachen Geheimschrift.
0 Kommentare
6 Lösung(en)
def encode(s):
count = len(s)/2
if (len(s) % 2):
count+=1
s1 = s[0:count]
s2 = s[count:len(s)]
out =''
for i in range(count):
out+=s1[i]
if i < len(s2):
out+=s2[i]
return out
def decode(s):
s1=''
s2=''
j=0
while j < len(s):
s1+=s[j]
j+=1
if j < len(s):
s2+=s[j]
j+=1
return (s1+s2)
print decode(encode("1234567"))
print decode(encode("123456"))
print decode(encode("Das ist ein Test"))
package ch.santis.programmierenlernen.kapitel7;
public class Aufgabe_7_6 {
public static void main(String[] args) {
new Aufgabe_7_6().top();
}
// Geheimschrift MIX
void top() {
String text = "Geheimschrift Programm einfachb";
int stringlange = text.length();
System.out.println(stringlange);
String teil1 = stringteiler1(text, stringlange);
System.out.println(teil1);
System.out.println(teil1.length());
String teil2 = stringteiler2(text, stringlange);
System.out.println(teil2);
System.out.println(teil2.length());
String encrypted = encription(teil1, teil2);
System.out.println("Encrypted: " + encrypted);
String decrypted = decription(encrypted);
System.out.println("Decrypted: " + decrypted);
}
public String decription(String encrypted) {
int stringlange = encrypted.length();
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
String decrypted = "";
for(int index = 0; index < stringlange; index++) {
if(index % 2 == 0) {
sb1.append(encrypted.substring(index,index+1));
}
else if(index % 2 == 1) {
sb2.append(encrypted.substring(index,index+1));
}
}
decrypted = sb1.toString() + sb2.toString();
return decrypted;
}
public String encription(String teil1, String teil2){
int teil1lange = teil1.length();
int teil2lange = teil2.length();
int stringlange = teil1lange + teil2lange;
StringBuilder sb = new StringBuilder();
String encrypted = "";
int teil1counter = 0;
int teil2counter = 0;
for(int index = 0; index < stringlange;) {
if(index % 2 == 1) {
sb.append(teil2.substring(teil2counter,teil2counter+1));
teil2counter++;
index++;
}
else if(index % 2 == 0) {
sb.append(teil1.substring(teil1counter,teil1counter+1));
teil1counter++;
index++;
}
}
encrypted = sb.toString();
return encrypted;
}
public String stringteiler1(String text, int stringlange) {
String teil1;
double teil1lange = (double) stringlange / 2;
teil1lange = Math.ceil(teil1lange / 1);
teil1 = text.substring(0, (int)teil1lange);
return teil1;
}
public String stringteiler2(String text, int stringlange) {
String teil2;
double teil2lange = (double) stringlange / 2;
teil2lange = Math.ceil(teil2lange / 1);
teil2 = text.substring( (int)teil2lange, stringlange);
return teil2;
}
}
Lösung von: Jan Roth (Santis Training AG)
codeMIX = {
encode: function(str) {
let mid = Math.ceil(str.length / 2),
sub1 = str.substr(0, mid),
sub2 = str.substr(mid),
out = '';
for (let i = 0; i < sub1.length; i++) {
out += sub1[i];
if (i < sub2.length) out += sub2[i];
}
return out;
},
decode: function(str) {
let out = '';
for (let i = 0; i < str.length; i += 2)
out += str[i];
for (let i = 1; i < str.length; i += 2)
out += str[i];
return out;
}
}
console.log(codeMIX.encode('strenggeheim'));
console.log(codeMIX.decode(codeMIX.encode('strenggeheim')));
// lissalanda@gmx.at
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
# frozen_string_literal: false
def mix(data = '')
len = data.length
if (len % 2).zero?
str1 = data[0..((len / 2) - 1)]
str2 = data[(len / 2)..len]
else
str1 = data[0..(len / 2)]
str2 = data[((len + 1) / 2)..len] + ' '
end
mixed = ''
(0..(str1.length - 1)).each do |i|
mixed += str1[i]
mixed += str2[i]
end
mixed[0..(mixed.length - 2)]
end
def demix(data = '')
str1 = ''
str2 = ''
(0..(data.length - 1)).step(2).each do |i|
str1 += data[i] if data[i]
str2 += data[i + 1] if data[i + 1]
end
str1 + str2
end
a = mix('Streng geheim')
puts 'codiert: ' << a
b = demix(a)
puts 'wieder decodiert: ' << b
puts 'Vorgabe per Mix "decodiert":'
c = mix('Srn eemtegghi')
puts '"decodiert": ' << c
Lösung von: Ich Bins (tubs)
import math
from itertools import zip_longest
def encode(s):
l = math.ceil(len(s)/2)
a, b, out = s[:l], s[l:], ""
for x in zip_longest(a, b, fillvalue=""):
out += "".join(x)
return out
def decode(s):
a, b = "", ""
for i in range(len(s)):
if i % 2 == 0:
a += s[i]
else:
b += s[i]
return a+b
s = input("Input: ")
print(f"Encode: {encode(s)}")
print(f"Decode: {decode(s)}")
Lösung von: Name nicht veröffentlicht
// C++ 14 | VS-2022
#include <iostream>
#include <string>
std::string encode_text(const std::string& str) {
std::string out{};
auto odd{ str.length() / 2 + (str.length() & 1 ? 1 : 0) };
for (size_t i{ 0 }; i < odd; i++) {
out.push_back(str[i]);
out.push_back(str[i + odd]);
}
if (str.length() & 1) out.push_back(str.back());
return out;
}
std::string decode_text(const std::string& str) {
std::string t1, t2;
for (size_t i{ 0 }; i < str.length(); i+=2) {
t1.push_back(str[i]);
t2.push_back(str[i + 1]);
}
return t1.append(t2);
}
int main() {
const auto s1{ "streng_geheim" };
std::cout << encode_text(s1) << "\n";
const auto s2{ "sgterheenigm_" };
std::cout << decode_text(s2) << "\n";
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
"Streng geheim" → "Sgterheenigm "
Srn eemtegghi → "Streng geheim"
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 1 |
Schwierigkeit: | Schwer |
Webcode: | 5z5i-vp58 |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |