Computer-Chiffre


14

Einführung:

In einem Dokument, das ich als Kind zusammengestellt habe, sind viele verschiedene Chiffren gespeichert. Ich habe einige ausgewählt, die meiner Meinung nach am besten für Herausforderungen geeignet sind (nicht zu trivial und nicht zu schwierig), und sie in Herausforderungen umgewandelt. Die meisten von ihnen sind noch im Sandkasten und ich bin mir noch nicht sicher, ob ich sie alle oder nur einige veröffentlichen werde. Aber hier ist der erste von ihnen, der etwas anfängt von.


Eine Computer-Chiffre verschlüsselt den gegebenen Text in 'zufällige' Zeichengruppen einer gegebenen length . Wenn eine solche Gruppe eine Ziffer enthält, wird diese Ziffer verwendet, um das verschlüsselte Zeichen in eine eigene Gruppe einzuteilen. Wenn in der Gruppe keine Ziffer vorhanden ist, wird das erste Zeichen verwendet.

Angenommen, wir möchten den Text this is a computer ciphermit einer bestimmten Länge von verschlüsseln 5. Dies ist eine mögliche Ausgabe (Hinweis: Zahlen sind im folgenden Beispiel 1-indiziert):

t     h     i     s     i     s     a     c     o     m     p     u     t     e     r     c     i     p     h     e     r       (without spaces of course, but added as clarification)
qu5dt hprit k3iqb osyw2 jii2o m5uzs akiwb hwpc4 eoo3j muxer z4lpc 4lsuw 2tsmp eirkr r3rsi b5nvc vid2o dmh5p hrptj oeh2l 4ngrv   (without spaces of course, but added as clarification)

Nehmen wir ein paar Gruppen als Beispiele, um zu erklären, wie die Gruppe entschlüsselt werden kann:

  • qu5dt: Diese Gruppe enthält eine Ziffer 5der (1-indizierte) 5. Zeichen dieser Gruppe ist das Zeichen für den entschlüsselten Text verwendet wird , so: t.
  • hprit: Keine Ziffern enthält diese Gruppe, so das erste Zeichen dieser Gruppe implizit für den entschlüsselten Text verwendet wird: h.
  • osyw2: Diese Gruppe enthält eine Ziffer 2, so dass die (1-indizierte) 2. Zeichen dieser Gruppe das Zeichen für den entschlüsselten Text verwendet wird: s.

Herausforderung:

Geben Sie bei einer bestimmten Ganzzahl lengthund Zeichenfolge word_to_enciphereinen Zufallsgenerator aus verschlüsselte Zeichenfolge wie oben beschrieben.

Sie haben nur die angegebenen chiffrieren lengthund word_to_encipher, so dass keine Notwendigkeit als auch eine Entschlüsselung Programm / Funktion zu erstellen. Ich könnte jedoch in Zukunft eine Teil-2-Herausforderung für die Entschlüsselung stellen.

Herausforderungsregeln:

  • Sie können davon ausgehen, dass der lengthWert im Bereich liegt [3,9].
  • Sie können davon ausgehen, dass das word_to_enciphernur Buchstaben enthält.
  • Sie können entweder Groß- oder Kleinbuchstaben verwenden (bitte geben Sie an, welche Sie in Ihrer Antwort verwendet haben).
  • Ihre Ausgaben, jede Gruppe und die Positionen der Ziffern in einer Gruppe (falls vorhanden) sollten einheitlich zufällig sein . Alle zufälligen Buchstaben des Alphabets haben also die gleiche Wahrscheinlichkeit, vorzukommen. Die Position des verschlüsselten Buchstabens in jeder Gruppe hat die gleiche Wahrscheinlichkeit des Auftretens. und die Position der Ziffer hat die gleiche Chance aufzutreten (außer wenn es sich um das erste Zeichen handelt und keine Ziffer vorhanden ist; und es kann sich offensichtlich nicht an derselben Position wie das verschlüsselte Zeichen befinden).
  • Sie können auch 0-indizierte Ziffern anstelle von 1-indizierten verwenden. Bitte geben Sie an, welche der beiden Antworten Sie verwendet haben.
  • Die Ziffer 1(oder 0wenn sie mit 0 indiziert ist) wird niemals in der Ausgabe vorhanden sein. Es b1ndhist also keine gültige Gruppe, um das Zeichen 'b' zu verschlüsseln. Jedoch b4tbwgilt, wo die 4chiffriert die ban der 4. (1-indizierte) Position und die anderen Zeichen b, t, wzufällig sind (die zufällig auch ein enthält b). Andere mögliche gültige Gruppen von length5 bis chiffrieren das Zeichen ‚b‘: abcd2, ab2de, babbk, hue5b, usw.

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp, verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu (z. B. TIO ).
  • Außerdem wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.

Testfälle:

Input:
 Length:           5
 Word to encipher: thisisacomputercipher
Possible output:
 qu5dthpritk3iqbosyw2jii2om5uzsakiwbhwpc4eoo3jmuxerz4lpc4lsuw2tsmpeirkrr3rsib5nvcvid2odmh5phrptjoeh2l4ngrv

Input:
 Length:           8
 Word to encipher: test
Possible output:
 ewetng4o6smptebyo6ontsrbtxten3qk

Input:
 Length:           3
 Word to encipher: three
Possible output:
 tomv3h2rvege3le

2
Wie bedeutet "Uniform"
l4m2

@ l4m2 Dass es für jede Ausgabe die gleiche Chance gibt. Alle zufälligen Buchstaben des Alphabets haben also die gleiche Wahrscheinlichkeit, vorzukommen. Die Position des verschlüsselten Buchstabens in jeder Gruppe hat die gleiche Wahrscheinlichkeit des Auftretens. und die Position der Ziffer hat die gleiche Chance aufzutreten (außer wenn es sich um das erste Zeichen handelt und keine Ziffer vorhanden ist und auch nicht an der gleichen Position wie das verschlüsselte Zeichen).
Kevin Cruijssen

Also abcd2, ab2de, babbkalle gleich? Ist das auch b1akkgültig?
14.

@ l4m2 Ja, alle drei sind mögliche Ausgaben, die das Zeichen 'b' verschlüsseln. Da b1akkwürde ich nein sagen. Wird es in der Herausforderungsbeschreibung bearbeiten, um zu verdeutlichen. Wenn das erste Zeichen das verschlüsselte ist, darf keine Ziffer vorhanden sein.
Kevin Cruijssen

1
Wenn beispielsweise length = 3, char = "a"; Die Form "a??"hat 676 mögliche Ergebnisse, aber "1a?", "?a1", "2?a", "?2a", hat only104 Ergebnisse. Wenn ich also versuche, aus all diesen 780 Ergebnissen ein Ergebnis auszuwählen, ist die Verteilung von "Position des verschlüsselten Buchstabens" 13: 1: 1, nicht 1: 1: 1. Und ich würde das als "einheitlich zufällig" betrachten.
tsh

Antworten:


3

Pyth, 22 Bytes

smsXWJOQXmOGQJdO-UQJJz

Probieren Sie es online aus.

Verwendet Kleinbuchstaben und Nullindizierung.

Erläuterung

Sehr einfacher Algorithmus.

                           Implicit: read word in z
                           Implicit: read number in Q
 m                   z     For each char d in z:
      OQ                     Choose a number 0..Q-1
     J                       and call it J.
         m  Q                Make an array of Q
          OG                 random letters.
        X     d              Place d in this string
             J               at position J.
    W                        If J is not 0,
   X                J        place J in this string
               O             at a random position from
                 UQ          0..Q-1
                -  J         except for J.
  s                          Concatenate the letters.
s                          Concatenate the results.

5

Perl 6 , 125 Bytes

->\n{*.&{S:g{.}=(65..90)>>.chr.roll(n).join.subst(/./,$/,:th($!=roll 1..n:)).subst(/./,$!,:th($!-1??(^n+1$!).roll!!n+1))}}

Probieren Sie es online!

Nimmt die Eingabe und Ausgabe in Großbuchstaben vor. Nimmt Eingaben wie Curry f(n)(string). Verwendet 1 Indizierung.

Erläuterung:

->\n{*.&{ ...  }}   # Anonymous code block that takes a number n and returns a function
     S:g{.}=        # That turns each character of the given string into
                          .roll(n)      # Randomly pick n times with replacement
            (65..90)>>.chr              # From the uppercase alphabet
                                  .join # And join
            .subst(                         ) # Then replace
                   /./,  ,:th($!=roll 1..n:)  # A random index (saving the number in $!)
                       $/               # With the original character
            .subst(                )    # Replace again
                   /./,$!,:th( ... )    # The xth character with $!, where x is:
                           $!-1??          # If $! is not 1
                                 (^n+1$!).roll       # A random index that isn't $!
                                               !!n+1  # Else an index out of range

4

Python 2 , 187 177 176 156 154 148 Bytes

lambda l,s:''.join([chr(choice(R(65,91))),c,`n`][(j==n)-(j==i)*(n>0)]for c in s for n,i in[sample(R(l),2)]for j in R(l))
from random import*
R=range

Probieren Sie es online!

Verwendet Großbuchstaben und 0-indizierte Zahlen.

-3 Bytes, danke an Kevin Cruijssen


@ KevinCruijssen Danke :)
TFeld

Was sample(R(l),2)[::1|-(random()<.5)]bedeutet
14.

@ l4m2 Nimmt 2 Nummern ab range(l)und mischt sie. Aber anscheinend Probe garantiert keine Bestellung, so ist es nicht erforderlich :)
TFeld

Kannst du die Klammer nicht entfernen (j==i)*(n>0)? Die Multiplikation hat Vorrang vor dem Subtrahieren, nicht wahr?
Kevin Cruijssen

1
@ KevinCruijssen Ja, ich habe vergessen, sie zu entfernen, als ich einige Probleme hatte
TFeld


3

R , 134 132 123 Bytes

function(S,n,s=sample)for(k in utf8ToInt(S)){o=k+!1:n
P=s(n,1)
o[-P]=s(c(P[i<-P>1],s(17:42,n-1-i,T)))+48
cat(intToUtf8(o))}

Probieren Sie es online!

Nimmt Großbuchstaben.

Erklärung des alten Codes (meistens der gleiche Ansatz):

function(S,n){s=sample				# alias
K=el(strsplit(S,""))				# split to characters
o=1:n						# output array
for(k in K){					# for each character in the string
P=s(n,1)					# pick a Position for that character
o[-P]=						# assign to everywhere besides P:
      s(					# a permutation of:
	c(P[i<-P>1],				# P if it's greater than 1
		s(letters,n-1-i,T)))		# and a random sample, with replacement, of lowercase letters
o[P]=k						# set k to position P
cat(o,sep="")}}					# and print

2

Java (JDK) , 193 Byte

s->n->s.flatMap(c->{int a[]=new int[n],i=n,x=0;for(;i-->0;)a[i]+=Math.random()*26+97;a[i+=Math.random()*n+1]=c;x+=Math.random()*~-n;if(i>0)a[x<i?x:x+1]=48+i;return java.util.Arrays.stream(a);})

Probieren Sie es online!

  • Der Index basiert auf 0.
  • Dieser Eintrag verwendet eine IntStream(durchgestrichene String::chars) sowie eine Zahl und gibt eine andere zurückIntStream .
  • Casts von doublebis intsind wegen des Hackes unnötig +=.

2

Japt , 29 Bytes

;£=VöJ;CöV hUÎX hUÅÎUÎ?UÎs:Cö

Probieren Sie es online!

Nullindexiert.

Erläuterung:

;                                :Set C = [a...z]
 £                               :For each character of the input:
  =VöJ;                          : Get two different random indexes from [0,length)
       CöV                       : Get 5 random letters
           hUÎX                  : Replace one at random with the character from the input
                hUÅÎ             : Replace a different random character with:
                    UÎ?          :  If the input character was not placed at 0:
                       UÎs       :   The index of the input character
                          :      :  Otherwise:
                           Cö    :   A random letter
                                 :Implicitly join back to a string

2

C 115 Bytes

g(_,n)char*_;{int i=rand(),j=i%~-n,k=0;for(i%=n;k<n;k++)putchar(k-i?!i|i<k^k-j?rand()%26+97:48+i:*_);*++_&&g(_,n);}

Probieren Sie es online!

0-indiziert, Kleinbuchstaben.

Leicht ungolfed und erweitert:

g(char*_,int n) {
    int i = rand(), j = i%(n-1), k = 0;
    for(i = i%n; k<n; k++)
        putchar(k!=i ? i!=0 || k==j + (k>i)
                          ? rand()%26 + 'A'
                          : i + '0')
                    : *_);
    if (*++_!=0) g(_,n);
}

Der Code sollte ziemlich einfach sein. Die zwei Zufälle i, jdie in einem rand()Aufruf erzeugt werden , sind gut wie unabhängig, da gcd ( n, ~-n) = 1 und RAND_MAXgroß ist.


1
Willkommen bei PPCG! :)
Shaggy

1

Sauber , 256 Bytes

import StdEnv
s::!Int->Int
s _=code {
ccall time "I:I"
ccall srand "I:I"
}
r::!Int->Int
r _=code {
ccall rand "I:I"
}
$n|s 0<1#k=map\e.r e rem n
=flatten o map\c.hd[map(\i|i==x=c=toChar if(i==y&&x>0)(x+48)(r i rem 26+97))[0..n-1]\\x<-k[0..]&y<-k[0..]|x<>y]

Probieren Sie es online!

Wählt:

  • ein Zufall x(Position des Zeichens im Segment)
  • ein Zufall y, der nicht gleich ist x(Position der Ziffer im Segment)
  • Ein zufälliger Kleinbuchstabe für jede Position, die nicht gleich xund nicht gleich ist, yes xsei denn, sie ist Null

1

JavaScript, 134 Byte

l=>w=>w.replace(/./g,c=>eval("for(s=c;!s[l-1]||s[t?t-1||9:0]!=c;t=s.replace(/\\D/g,''))s=(p=Math.random()*36**l,p-p%1).toString(36)"))

Probieren Sie es online!

Diese Antwort wählte die codierte Zeichenfolge aus allen möglichen codierten Zeichenfolgen einheitlich aus. So ist es eher möglich, den verschlüsselten Buchstaben als den ersten zu erstellen.


1

C # (Visual C # Interactive Compiler) , 171 Byte

s=>n=>{var r=new Random();return s.SelectMany(c=>{int i=r.Next(n),j=r.Next(n-1);j+=j<i?0:1;return new int[n].Select((_,k)=>(char)(i==k?c:j==k&i>0?i+49:r.Next(26)+97));});}

Probieren Sie es online!

Erläuterung...

// s is the input string
// n is the input length
s=>n=>{
  // we need to create an instance
  // of Random and use throughout
  var r=new Random();
  // iterate over s, each iteration
  // returns an array... flatten it
  return s.SelectMany(c=>{
    // i is the position of the letter
    // j is the position of the number
    int i=r.Next(n), j=r.Next(n-1);
    // ensure i and j are different
    j+=j<i?0:1;
    // create an iterable of size n
    return new int[n]
      // iterate over it with index k
      .Select((_,k)=>(char)(
        // return the letter
        i==k?c:
        // return the number
        j==k&i>0?i+49:
        // return a random letter
        r.Next(26)+97)
      );
  });
}

1

Holzkohle , 35-30 Bytes

NθFS«≔‽θη≔∧η‽Φθ⁻κηζFθ≡κζIηηι‽β

Probieren Sie es online! Link ist eine ausführliche Version des Codes. 0-indiziert. Erläuterung:

Nθ

Geben Sie die Länge ein.

FS«

Geben Sie das Wort ein und durchlaufen Sie die Zeichen.

≔‽θη

Wählen Sie eine zufällige Position für den entschlüsselten Buchstaben.

≔∧η‽Φθ⁻κηζ

Wählen Sie eine andere zufällige Position für die Ziffer, es sei denn, der Buchstabe befindet sich an Position 0. In diesem Fall setzen Sie die Ziffer auch an Position 0.

Fθ≡κ

Schleife einmal für jedes ausgegebene Zeichen und schalte die Position ein.

ζIη

Wenn dies die Position der Ziffer ist, geben Sie die Position des entschlüsselten Buchstabens aus.

ηι

Wenn dies jedoch die Position des entschlüsselten Buchstabens ist, geben Sie den Buchstaben aus. Dies hat Vorrang vor der Position der Ziffer, da Charcoal die letzte Eingabe vornimmt, wenn mehrere Schaltergehäuse denselben Wert haben.

‽β

Ansonsten geben Sie einen zufälligen Buchstaben aus.


0

05AB1E , 26 Bytes

ε²Ý¨Ω©A.r²£Šǝ®Āi®²Ý¨®KΩǝ]J

0-indiziert.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

ε            # Map over the characters of the first (implicit) input-string:
 ²Ý¨         #  Create a list in the range [0, second input)
    Ω        #  Get a random item from this list
     ©       #  Store it in the register (without popping)
 A           #  Push the lowercase alphabet
  .r         #  Shuffle it
    ²£       #  Leave only the first second input amount of characters
      Š      #  Triple swap, so the stack order becomes:
             #  random index; random string; map-character
       ǝ     #  Insert the map-character at this random index into the random string
 ®Āi         #  If the random index was NOT 0:
    ®        #   Push the random index
    ²Ý¨      #   Push the list in the range [0, second input) again
       ®K    #   Remove the random index from this list
         Ω   #   Get a random item from this list
          ǝ  #   Insert the first random index at the second random index into the string
]            # Close both the if-else and map
 J           # Join all strings together (and output implicitly)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.