Implementare questo codice chiave


13

Implementare questo codice chiave

Obbiettivo

Utilizzare l'algoritmo (spiegato nella sezione Algoritmo) per implementare un determinato codice.

Il programma deve leggere l'input da STDIN o l'equivalente disponibile più vicino, utilizzare l'algoritmo per generare il testo cifrato e una chiave.

Il testo cifrato e la chiave verranno scritti in STDOUT o nell'equivalente disponibile più vicino. È consentito qualsiasi formato, purché generi il testo cifrato e la chiave.

Algoritmo

Converti i caratteri nella stringa nei rispettivi valori ASCII. Per esempio:

Hello -> 72 101 108 108 111

Successivamente, dovrai generare una chiave fintanto che la stringa con numeri casuali nell'intervallo 0-9.

Hello -> 62841

Aggiungi i numeri interi nella sequenza numerica casuale ai valori ASCII della stringa. Negli esempi sopra, 72 diventerebbero 78 e 101 diventerebbero 104.

72 + 6 = 78, 101 + 2 = 103, 108 + 8 = 116, etc

Successivamente, converti i nuovi valori in caratteri. Negli esempi sopra, il testo Helloè diventato Ngtpp.

Esempi

(Questi sono semplicemente esempi di come potrebbe apparire l'output . L'output può e può variare.)

Hello World

Lfrlu)_supg
41606984343

This will be encoded

Zhjs$~koo gj$iuhofgj
60104723305544750226

Regole

  • Si può presumere che l'input conterrà solo caratteri nell'intervallo az, AZ e spazi.
  • Gli invii devono essere programmi o funzioni completi.
  • Le iscrizioni verranno classificate in byte.
  • Sono vietate le scappatoie standard .
  • Questo è code-golf, quindi vince il codice più corto.

(Questa è una delle mie prime sfide, se c'è qualcosa che non va, sentiti libero di dirmi come potrei migliorarlo.)


5
Questa sfida mi sembra buona, tranne per un paio di pensieri. 1. È consentita una funzione anziché un programma completo? Una domanda correlata è: i valori potrebbero essere restituiti anziché stampati? 2. Hai detto che preferably with the format (ciphertext)\n(key)."funzioni preferite" e code golf non si mescolano molto bene. Dovresti renderlo obbligatorio o consentire altri formati di output. 3. La chiave deve essere stampata senza spazi? Che ne dici di stamparlo in formato elenco, ad esempio [0, 5, 2, ...]?
James,

La chiave può avere zero iniziali?
TheBikingViking

1
Bella prima sfida ma non sono così sicuro dei rigidi formati IO. Solitamente le funzioni sono consentite e di solito le risposte possono essere lette da uno dei metodi IO accettati. Ciò include l'output di un array con gli oggetti
Downgoat,

1
Le cifre della chiave devono essere generate con una distribuzione uniforme?
Dennis,

1
Uh ... 101 + 2 è 103, non 104. :-)
YetiCGN

Risposte:


5

Gelatina , 12 9 byte

⁵ṁX€’Ṅ+OỌ

Provalo online!

Come funziona

⁵ṁX€’Ṅ+OỌ  Main link. Argument: s (string)

⁵             Set the return value to 10.
 ṁ            Mold; create an array of 10's with the length of s.
  X€          Pseudo-randomly pick a integer between 1 and 10, for each 10.
    ’         Decrement, so the integers fall in the range [0, ..., 9].
     Ṅ        Print the key, as an array, followed by a linefeed.
      +O      Add the integers to the ordinals (code points) of s.
        Ọ     Unordinal; convert back to characters.

5

Python 3, 130 byte

Grazie a @Rod per aver segnalato un bug

from random import*
def f(x):l=10**len(x);k=str(randint(0,l-1)+l)[1:];print(''.join(chr(ord(i)+int(j))for i,j in zip(x,k))+'\n'+k)

Una funzione che accetta l'input tramite argomento come stringa e stampa su STDOUT.

Come funziona

from random import*  Import everything from the random module
def f(x):            Function with input string x
l=10**len(x)         Define l for later use as 10^length(x)
randint(0,l-1)+l     Generate a random integer in the range [0, l-1] and add l, giving a
                     number with l+1 digits...
k=str(...)[1:]       ...convert to a string and remove the first character, giving a key of
                     length l that can include leading zeroes, and store in k
for i,j in zip(x,k)  For each character pair i,j in x and k:
chr(ord(i)+int(j))    Find the UTF-8 code-point (same as ASCII for the ASCII characters),
                      add the relevant key digit and convert back to character
''.join(...)         Concatenate the characters of the ciphertext
print(...+'\n'+k)    Add newline and key, then print to STDOUT

Provalo su Ideone


il generatore di chiavi non genera chiavi che iniziano con 0. aumentando i limiti di un fattore 10 e rimuovendo la 1a cifra dovrebbe essere risolto: m=10**len(x);k=str(randint(m,m*10))[1:];e si salva anche un byte nel processo c:
Rod

@Rod Grazie per aver segnalato il bug. Ciò non salverà alcun byte, tuttavia, poiché randintè inclusivo, il che significa che dovresti farlo m*10-1. Ho appena pensato a un modo per risolverlo per lo stesso numero di byte.
TheBikingViking


3

In realtà, 17 byte

;`X9J`M;(O¥♂cΣ@εj

Provalo online!

Spiegazione:

;`X9J`M;(O¥♂cΣ@εj
;                  dupe input
 `X9J`M            for each character in input copy:
  X9J                discard the character, push a random integer in [0, 9]
       ;           duplicate the offset array
        (O         bring input to top of stack, ordinal array
          ¥♂c      pairwise addition with offset array, turn each ordinal into a character
             Σ     concatenate
              @εj  concatenate the copy of the offset array

2

CJam - 14 byte

Quando ho visto la matematica del codice ASCII, ho saputo che dovevo scrivere una risposta CJam.

q_{;Amr}%_@.+p

Provalo online qui .


2

MATL, 13 byte

"10r*]v!kGy+c

L'output è simile al seguente:

9 5 8 2 1
Qjtnp

Provalo online!

Spiegazione:

"    ]          % For each character:
 10             % Push a 10 onto the stack
   r            % Push a random float in [O, 1)
    *           % Multiply. This essentially the same thing as pushing a number in [0, 10)
      v!k       % Join all of these together, and take the floor
         G      % Push the input again
          y     % Duplicate the array of random numbers
           +    % And add these together. Since MATL treats strings as an array of chars, we don't need to explicitly convert types
            c   % Display as string

Non sono sicuro che sia il formato giusto ...
Leaky Nun,

@Leaky Nun Ho cambiato un po 'le regole.
m654,

@ m654 Dove hai detto che possono esserci spazi tra i valori?
Leaky Nun,

@LeakyNun Inizialmente c'era una regola contro di loro ma l'ho rimossa.
m654,

1
Buona idea usare il loop. In realtà è più corta rispetto alla versione multiple-input di roYr
Luis Mendo

2

PowerShell v2 +, 79 77 byte

param($n)-join(($x=[char[]]$n|%{0..9|Random})|%{[char]($_+$n[$i++])});-join$x

Riceve input $n, passa in rassegna ogni personaggio e ottiene un Randomelemento da 0..9ogni iterazione. Memorizza quei numeri (come un array) in $x. Instrada quell'array in un altro loop. Ogni iterazione, prende l'elemento corrente $_, lo aggiunge al carattere posizionale tagliato fuori da $n(cast implicito da carattere a int), quindi rilancia come [char]. Lascia quello sulla pipeline. Questo è incapsulato in parentesi e messo -joininsieme per formare la parola. È rimasto in cantiere. Inoltre, il numero $xviene anche modificato -joininsieme e lasciato sulla pipeline. Quelli sono implicitamente stampati con un Write-Outputalla fine dell'esecuzione, il che si traduce in loro di essere stampati con una nuova riga per impostazione predefinita.

Esempio

PS C:\Tools\Scripts\golfing> .\implement-this-key-cipher.ps1 'Hello World!'
Lhoot(Yt{mf"
433358259121

2

C #, 252 247 245 232 216 byte

Le dimensioni sono piuttosto scarse rispetto alle altre soluzioni ma tuttavia ...

using System;using System.Linq;class p{static void Main(){var c="";var i=Console.ReadLine();var r=new Random();for(int b=0;b++<i.Count();){int d=r.Next(10);Console.Write((char)(i[b]+d));c+=d;}Console.Write("\n"+c);}}

Questa è la mia seconda risposta in assoluto a un codegolf e sono piuttosto un principiante considerando C # quindi apprezzerei sentire come accorciarlo :)

Ungolfed:

using System;
using System.Linq;

class p
{
    static void Main()
    {
        var c = "";
        var i = Console.ReadLine();
        var r = new Random();
        for (int b = 0; b++ < i.Count();)
        {
            int d = r.Next(10);
            Console.Write((char)(i[b] + d));
            c += d;
        }
        Console.Write("\n" + c);
    }
}
  • 5 byte salvati grazie a @FryAmTheEggman
  • Salvato 2 byte grazie a @theLambGoat
  • Salvato 7 byte rimuovendoli static dalla classe p
  • 24 byte salvati grazie a @milk

1
Il trucco non è confrontare con altre lingue;) Non sono particolarmente esperto nel golf C #, ma puoi fare b++<i.Count()e lasciare vuota la terza clausola? Inoltre, non penso che tu abbia bisogno di una nuova riga finale, quindi l'ultima chiamata WriteLinepotrebbe essere Writeinvece.
FryAmTheEggman,

Inoltre non sono molto esperto in C # ma penso che tu possa spostare il = r.Prossimo (10) fino alla dichiarazione di d e salvare su una serie di parentesi nella scrittura. O il casuale non restituisce un int quindi non puoi farlo?
theLambGoat

Penso di poterlo fare, fammi controllare
Tom Doodler,

Puoi sostituire i tipi con var. cioè- var c=invece di string c=radere qualche byte.
latte

Perché non lasciare il risultato di Console.ReadLine()come stringa? i.Lengthè più corto di i.Count(), non avrai bisogno di System.Linq. stringa ha un indicizzatore di caratteri. Anche la creazione di nuovi oggetti a caso nel circuito è meno byte: new Random().Next(10).
latte

2

CJam, 11 byte

Nq{Amr_o+}/

Provalo online!

Come funziona

N            Push a linefeed on the stack.
 q           Read all input from STDIN and push it on the stack.
  {      }/  For each character in the input:
   Amr       Pseudo-randomly pick an integer in [0 ... 9].
      _o     Print a copy.
        +    Add the integer to the character.
             (implicit) Print the linefeed, followed by the modified characters.

2

05AB1E , 18 17 byte

vžh.RDyÇ+ç`?}J¶?,

Spiegazione

v           }      # for each char in input
 žh.RD             # push 2 copies of a random number in [0..9]
      yÇ+          # add 1 copy to the current chars ascii value
         ç`?       # convert to char, flatten and print
             J     # join stack (which contain the digits of the key)
              ¶?,  # print a newline followed by the key

Provalo online


2

Python 3, 112 byte

c è una funzione che restituisce il testo crittografato e la chiave

from random import*
c=lambda t:map(''.join,zip(*[(chr(a+b),str(b))for a,b in((ord(i),randint(0,9))for i in t)]))

Ecco un codice che fa la stessa cosa ed è un po 'più leggibile

def encrypt(text):
    # keep the codes of the letters in the input and a random key
    # that will be used later to encrypt this letter
    letter_and_key = ((ord(letter),randint(0,9)) for letter in text)

    # encrypt the letter and keep the key used as a string
    output_and_key = [(chr(letter_code+key), str(key))
                      for letter_code, key in letter_and_key]

    # At this point the values are kept in the format:
    # [(firstletter, firstkey), (secondletter, secondkey), ...]

    # to reorder the list to be able to output in the format "text key"
    text, key = map(''.join, zip(*output_and_key))

    # same as print(*output_and_key)
    return text, key

Produzione:

>>> text, key = c('Hello World')
>>> print(text, key, sep='\n')
Liuot#`oylk
44935390707

Benvenuti in questo sito!
James,

1

PHP, 63 86 82 byte

Modifica: dimenticato di stampare la chiave ...

Grazie ad Alex Howansky per avermi salvato 4 byte.

for(;$i<strlen($a=$argv[1]);$s.=$r)echo chr(ord($a[$i++])+$r=rand(0,9));echo"
$s";

L'input viene fornito tramite un argomento della riga di comando. Accetta ogni carattere nella stringa e aggiunge un int casuale da 0-9 al suo codice ASCII, quindi converte il codice in ASCII. Viene aggiunto ogni numero casuale $s, che viene stampato alla fine.


È necessario stampare anche la chiave.
Alex Howansky,

Puoi mettere il $s.=$rdopo il secondo semi nel ciclo for, salvando un byte perché puoi scaricare il suo semi finale. Quindi il tuo ciclo sarà solo un'istruzione in modo da poter ritagliare le parentesi graffe, salvando altri 2 byte. Quindi, alla fine, è possibile inserire l' $sinterno della stringa tra virgolette salvando l' .operatore per un altro byte. :)
Alex Howansky,

@AlexHowansky: è vero. Grazie
Business Cat,

1

J, 32 byte

<@:e,:~[:<[:u:3&u:+e=.[:?[:$&10#

equivalente pitone:

from random import randint
def encrypt(message):
    rand_list = list(map(lambda x: randint(0, 9), range(len(message))))
    return (''.join(list(map(lambda x,y: chr(x+y), rand_list, map(ord, message)))), rand_list)

1

Perl, 34 byte

Include +1 per -p

#!/usr/bin/perl -p
s%.%$\.=$==rand 10;chr$=+ord$&%eg

0

Perl, 65 byte

for(split'',$ARGV[0]){$;.=$a=int rand 9;$b.=chr$a+ord}say"$b\n$;"

Mi ci è voluto un po 'per capire come ottenere l'input senza una nuova riga alla fine. Lo prende come arg da riga di comando


La tua soluzione ha alcuni problemi. L'input non viene letto dal formato STDIN, $;non inizia a vuoto, quindi stampa il vecchio contenuto e il rand non può mai generare 9. Sono facili da correggere e l'uso di STDIN renderà il codice più breve :-)
Ton Hospel

@TonHospel Di solito i requisiti di input sono allentati e gli argomenti sono accettabili rispetto a STDIN e mentre prendere input da STDIN è più breve, dover rimuovere la nuova riga da esso rende più lungo. E mentre rand genera numeri <9, il metodo int di Perl arrotonda invece di piani quindi qualsiasi cosa> = 8.5 dovrebbe finire con 9
theLambGoat

I requisiti di input di solito sono sciolti, ma qui non lo era. Ottenere non newline da STDIN semplice è: <>=~/./g. E no, intin perl tronca verso 0, non arrotonda. perl -wle 'print int 8.6'uscite8
Ton Hospel il

0

Python 2, 84 99 byte

def f(x):y=`id(x)**len(x)`[1:len(x)+1];return''.join(map(chr,[ord(a)+int(b)for a,b in zip(x,y)])),y

Utilizza il id()valore della stringa per generare numeri casuali.

Provalo


Devi produrre la chiave e il testo cifrato.
TheBikingViking

@TheBikingViking non sa come mi sia perso. Grazie - risolto
atlanteologo

Penso che anche questo abbia lo stesso problema di una versione precedente della mia risposta Python; non produce mai chiavi con zeri iniziali.
TheBikingViking

@TheBikingViking Risolto nuovamente
atlanteologo

cambiare map(chr,[ord(a)+int(b)for a,b in zip(x,y)])in map(lambda x,y:chr(ord(x)+int(y)),x,y)? ciò dovrebbe salvare qualcosa
ljeabmreosn,

0

Senva , 74 byte

Ecco il programma più corto che ho realizzato:

2'(`>0.>{@}0'{v}2-2'0,{@}1'{v}0'{+}{'}9%+{^}{1-}1'"{+}{~}>$10.~0'2+"0,-:>$

Una piccola spiegazione? (Nota: BM significa Back-Memory ):

// === Input and informations storing ===

2'  // Go to the 3rd cell (the two first will be used to store informations)
(   // Ask the user for a string (it will be stored as a suite of ASCII codes)
`   // Go the end of the string
>   // Make a new cell
0.  // Put a 0 to mark the end of the string
>   // Make a new cell, here will be stored the first random number
{@} // Store its adress in BM
0'  // Go to the 1st cell
{v} // Paste the adress, now the 1st cell contains the adress of the first random number
2-  // Subtract 2 because the string starts at adress 2 (the 3rd cell)
2'  // Go to the 3rd cell (where the string begins)

// === String encryption and displaying ===

0,  // While the current cell doesn't contain 0 (while we didn't reach the string's end)
  {@}  // Store the character's adress into the memory
  1'   // Go to the 2nd cell
  {v}  // Paste the value, now the 1st cell contains the adress of the current char
  0'   // Go to the 1st cell
  {+}  // Add the adress of the first random number to the current char adress
  {'}  // Go to this adrses
  9%+  // A random number between 0 and 10
  {^}  // Store this number in BM
  {1-} // Decrease BM (random number between 0 and 9)
  1'   // Go to the 1st cell
  "    // Go to the adress pointed by the cell (the adress of the current char)
  {+}  // Add it to the random number value
  {~}  // Display it as an ASCII character
  >    // Go to the next cell (the next character)
$   // End of the loop
10. // Set the new line's ASCII code into the current cell (which is now useless, so it can be overwritten)
~   // Display the new line
0'  // Go to the first cell
2+  // Add 2 to the adress, because we are not in the string loop : we cancel the 2 substraction
"   // Go to the pointed adress (the first random number's one)

// === Display the random numbers ===

0,  // While we didn't reach the end of the random numbers suite
    // That was why I stored numbers between 1 and 10, the first equal to 0 will be the end of the suite
  - // Decrease it (number between 0 and 9)
  : // Display the current random number as an integer
  > // Go to the next cell (the next number)
$ // End of the loop

Ora sembra più grande, vero: p? Forse è possibile ottimizzare questo codice, ma per il momento è il più corto che ho trovato.


0

C #, 174 byte

using static System.Console;class b{static void Main(){var c=new System.Random();var d="\n";foreach(var e in ReadLine()){var f=c.Next(10);Write((char)(e+f));d+=f;}Write(d);}}

Ungolfed:

using static System.Console;

class b
{
    static void Main()
    {
        var c = new System.Random();
        var d = "\n";

        foreach (var e in ReadLine())
        {
            var f = c.Next(10);
            Write((char)(e + f));
            d += f;
        }

        Write(d);
    }
}

Abbastanza semplice, davvero.


0

Perl 6: 55 o 70 byte

Come funzione anonima che accetta un parametro stringa e restituisce un elenco di due stringhe (54 caratteri, 55 byte) :

{my @n=^9 .roll(.ords);(.ords Z+@n)».chr.join,@n.join}

Come programma che legge da STDIN e scrive su STDOUT (69 caratteri, 70 byte) :

my @a=get.ords;my @n=^9 .roll(@a);say (@a Z+@n)».chr.join;say @n.join
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.