Bazı “enciph5r47g” yapalım


35

Bu bazı "deciph4r4ng" yapalım tersidir


Bu zorlukta, göreviniz bir dize şifrelemek. Neyse ki, algoritma oldukça basittir: soldan sağa okuma, her tipik yazma karakterinin (ASCII aralığı 32-126) N + 1 karakteriyle aynı olduğunu belirtmek için N (0-9) arasında bir sayı ile değiştirilmesi gerekir. ondan önce konumlandırır. Bunun istisnası, karakterin orijinal dizedeki önceki 10 konumda görünmediği durumdur. Bu durumda, karakteri tekrar basmanız gerekir. Etkili bir şekilde, işlemi asıl zorluğun tersine çevirebilmelisiniz.

Örnek

Giriş dizesi "Programming"şu şekilde kodlanır:

Örnek 1

Bu nedenle, beklenen çıktı "Prog2am0in6".

Açıklamalar ve kurallar

  • Giriş dizesi, yalnızca 32 - 126 aralığında ASCII karakterlerini içerecektir. Asla boş olmayacağını varsayabilirsin.
  • Orijinal dize, herhangi bir rakam içermemesi garantilidir.
  • Bir karakter kodlandıktan sonra, sırayla sonraki bir basamağa referans gösterilebilir. Örneğin, "alpaca"olarak kodlanmalıdır "alp2c1".
  • Referanslar dizgenin etrafına asla sarılmaz: yalnızca önceki karakterlere referans verilebilir.
  • Tam bir program veya sonucu yazdıran veya çıkaran bir fonksiyon yazabilirsiniz.
  • Bu kod golf, yani bayt cinsinden en kısa cevap kazanır.
  • Standart boşluklar yasaktır.

Test durumları

Input : abcd
Output: abcd

Input : aaaa
Output: a000

Input : banana
Output: ban111

Input : Hello World!
Output: Hel0o W2r5d!

Input : this is a test
Output: this 222a19e52

Input : golfing is good for you
Output: golfin5 3s24o0d4f3r3y3u

Input : Programming Puzzles & Code Golf
Output: Prog2am0in6 Puz0les7&1Cod74G4lf

Input : Replicants are like any other machine. They're either a benefit or a hazard.
Output: Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.

6
Test durumlarınızın her zaman bir değiştirme için mümkün olan en düşük rakamı kullandığını görüyorum. Bu gerekli bir davranış mıdır yoksa birden fazla ihtimal olduğunda daha yüksek rakamlar kullanabilir miyiz?
Leo,

@Leo Geçerli olduğu sürece 0-9 istediğiniz tek bir basamağı kullanabilirsiniz.
Mühendis Toast,

Bu bir hamle-ön kodlayıcıya benziyor, hareket etmeden :)
pipe

Yanıtlar:


6

05AB1E , 20 19 18 bayt

-2 Emigna'ya teşekkürler

õ¹vDyåiDykëy}?yìT£

Çevrimiçi deneyin!

õ                  # Push an empty string
 ¹v y              # For each character in input
   D               # Duplicate the string on the stack (call this S)
     åi            # If this character is in S
       Dyk         #   Push the index of that that character 
          ë }      # Else
           y       #   Push the character 
             ?     # Print without newline
              yì   # Prepend this character to S
                T£ # Remove all but the first 10 elements from S

Bence de )¹vDyåiDykëy}?y¸ìT£işe yarıyor.
Emigna

Aslında cevabını benimkiyle birleştirmek õIvDyåiDykëy}?yìT£18 - :) veriyor
Emigna

@Emigna, kendinizinkini güncellemekten çekinmeyin :)
Riley

Cevabınız olmasaydı, bunu düşünmezdim, o yüzden buna sahip olmalısınız. Aferin!
Emigna

@Emigna Bence bu adil. Teşekkürler!
Riley,

12

Retina , 24 23 bayt

(.)(?<=\1(.{0,9}).)
$.2

Çevrimiçi deneyin!

Oldukça basit bir regex ikamesi. Her karakterle eşleşir ve önce 0-9 karakterden oluşan bir kopyasını bulmaya çalışırız. Onu bulursak, kopyayı elde etmek için eşleştirmemiz gereken karakter sayısı ile karakteri değiştiririz.

Sonuçlar test durumlarıyla tam olarak uyuşmuyor, çünkü bu mümkün olan en küçük yerine en büyük rakamı kullanıyor.


4
Değişken uzunluk arkası aldatma: p
Dada

8
@Dada Değişken uzunluklu gözetleme aydınlanma yoludur.
Martin Ender

Ne yazık ki ... Sıkılırsanız, onları Perl'de uygulamaktan çekinmeyin!
Dada

Orijinal görevi OP'ın açıklama uyarınca, "Sen bu kadar uzun geçerli olduğundan olarak 0-9 istediğiniz herhangi bir tek rakamı kullanabilirsiniz." ... bu yüzden mümkün olan en büyük geçerli olmalıdır
Doktor J

@DoktorJ evet, OP bu açıklamayı ekledikten sonra değiştirdim.
Martin Ender

8

JavaScript (ES6), 74 57 54 bayt

ETHproductions ile 3 baytlık tasarruf sağlandı, pırıl pırıl p=/./gyerine p={}(Neil esinlenerek)

s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-11?~i:c)

Test durumları


Dize rakam içermemesi garantili olduğundan, syerine kullanabilirsiniz p?
Neil

(Orijinal findsürümünüzü kullanarak lastIndexOf11 harf uzunluğunda olduğu için biraz şaşırtıcı olanı kullanabildim ....)
Neil

@Neil Şu anda bir bilgisayarın önünde değilim, ancak JS dizeleri değişmez olduğu için çalışacağını sanmıyorum.
Arnauld,

2
Dize değişmezleri üzerinde ayar özelliklerinin çalışmadığını onaylayabilirim. Ama ... regex ile çalışıyor gibi görünüyor, bu yüzden muhtemelen s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-10?~i:c)3 byte tasarruf yapabileceğini düşünüyorum .
ETHproductions

1
@YOU Burada ne olduğunu gerçekten bilmiyorum, ancak son düzenlememde tüm tarayıcılar için bir hata sunduğum ortaya çıktı . Bu şimdi sabittir. Fark ettiğiniz için teşekkürler!
Arnauld,

7

Haskell , 72 66 bayt

6 byte golf oynadığı için Laikoni'ye teşekkürler !

(a:r)%s=last(a:[n|(n,b)<-zip['0'..'9']s,b==a]):r%(a:s)
e%s=e
(%"")

Çevrimiçi deneyin!

İşlev %, kısmen işlenen dizgiyi ikinci argümanında ters olarak tutar, bu nedenle bu dizginin ilk 10 öğesini incelenen karakterin oluşumları için arayabilir. Gönderme (%""), önceki işlevi boş dize ile ikinci argüman olarak çağıran adsız işlevden oluşur .


f(a:s)=f s++(last$[a]:[show n|(n,b)<-zip[0..9]s,b==a])İki bayt kaydeder.
Laikoni

Bekle, f(a:s)=f s++[last$a:[n|(n,b)<-zip['0'..'9']s,b==a]]daha da fazla tasarruf sağlar.
Laikoni

Hareket halindeyken kullanmak yerine geri gitmek reverse, bir bayttan daha fazla tasarruf sağlar: Çevrimiçi deneyin!
Laikoni

@Likonik Teşekkürler, bu harika!
Leo,


3

Perl 5 , 36 bayt

35 bayt kodu + -pbayrak.

s/(\D)(.{0,9})\K\1/length$2/e&&redo

Çevrimiçi deneyin!

Bazı açıklamalar:
Amaç, 10 karakterden ( ) önce \Dolan (ve regex'imdeki geri tepime karşılık gelir \1) rakamsız bir karakterin yerine ( .{0,9}) ve grubun uzunluğuna göre aynı karaktere ( (\D)... \1) karşılık gelmektir . ). Ve karakterler değiştirilirken..{0,9}length$2redo


görünüşe göre .*gerekli değildir, değiştirilen haneden önce aralıktaki tüm geçerli karakterler tamam.
colsw

@ConnorLSW Yup, bu yeni güncellemeyi gördüm ve cevabımı değiştirdim, gösterdiğiniz için teşekkürler.
Dada


3

Japt , 18 bayt

£¯Y w bX s r"..+"X

Çevrimiçi deneyin!

açıklama

£   ¯  Y w bX s r"..+"X
mXY{s0,Y w bX s r"..+"X}
                          // Implicit: U = input string
mXY{                   }  // Replace each char X and index Y in U by this function:
    s0,Y                  //   Take U.slice(0,Y), the part of U before this char.
         w bX             //   Reverse, and find the first index of X in the result.
                          //   This gives how far back this char last appeared, -1 if never.
              s           //   Convert the result to a string.
                r"..+"X   //   Replace all matches of /..+/ in the result with X.
                          //   If the index is -1 or greater than 9, this will revert to X.
                          // Implicit: output result of last expression


2

05AB1E , 20 bayt

õIv¹N£RT£©yåi®ykëy}J

Çevrimiçi deneyin!

açıklama

õ                     # push an empty string
 Iv                   # for each [index,char] [N,y] in input
   ¹N£                # push the first N characters of input
      R               # reverse
       T£             # take the first 10 characters of this string
         ©            # save a copy in register
          yåi         # if y is in this string
             ®yk      #   push the index of y in the string in register
                ë     # else 
                 y    #   push y
                  }   # end if
                   J  # join stack as one string


2

C (tcc) , 113 bayt

İşlev bir giriş dizesinin bir kopyasını oluşturduğundan, en büyük giriş boyutu 98 karakterdir (en uzun test girişine uyacak kadar büyük). Tabii ki, bu başka bir değerle değiştirilebilir.

i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j;j=-1;}

Çevrimiçi deneyin!

Düzenle

-15 bayt. Teşekkürler Johan du Toit .


Aah! Girişi 98 karakter ile sınırlayın ve kendinize bir bayt kaydedin!
pipo

Güzel bir çözüm ancak 15 byte daha tasarruf edebilirsiniz: i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j,j=-1;}
Johan du Toit

@JohanduToit Teşekkürler! Bir sorum var. S [i] tam olarak for döngüsünün bir koşulu olarak nasıl çalışır? Bu web sitesinde başkalarının cevaplarında çok defa görmüştüm.
Maxim Mikhaylov

@ Max Lawnboy. Başlangıçta aşağıdakilere sahiptiniz: 's [i] ^' \ 0 '' hangi kısaca 's [i]! =' \ 0 ''. '\ 0' karakter değişmezi sıfıra eşittir, bu nedenle şöyle yazabilirsiniz: 's [i]! = 0'. C'deki if ifadesi yalnızca değerin sıfıra ya da sıfır olmayan olarak değerlendirilip test edilmediğini test eder, bu nedenle '! = 0' gerekli değildir.
Johan du Toit,


2

Java 7, 102 101 bayt

void a(char[]a){for(int b=a.length,c;--b>0;)for(c=b;c-->0&c+11>b;)if(a[c]==a[b])a[b]=(char)(b-c+47);}

Çevrimiçi deneyin!

Kevin Cruijssen sayesinde -1 bayt . Go-to operatörünü kullanmak için her zaman bir bahanenin tadını çıkarırım.


Neden --c>=0? c-->0Bir bayt kaydetmek için ile değiştirebilirsiniz .
Kevin Cruijssen

@KevinCruijssen Nasıl olduysa kafamda önceden karar vermem gerekti, aksi halde gerçek hesaplama yanlış olurdu ... Güzel yakalama!
Poke

1

MATL, 31 30 bayt

&=R"X@@f-t10<)l_)t?qV}xGX@)]&h

MATL Online'da deneyin !

açıklama

        % Implicitly grab input as a string
&=      % Perform element-wise comparison with automatic broadcasting.
R       % Take the upper-triangular part of the matrix and set everything else to zero
"       % For each column in this matrix
X@      % Push the index of the row to the stack
@f      % Find the indices of the 1's in the row. The indices are always sorted in
        % increasing order
-       % Subtract the index of the row. This result in an array that is [..., 0] where
        % there is always a 0 because each letter is equal to itself and then the ...
        % indicates the index distances to the same letters
t10<)   % Discard the index differences that are > 9
l_)     % Grab the next to last index which is going to be the smallest value. If the index
        % array only contains [0], then modular indexing will grab that zero
t?      % See if this is non-zero...
  qV    % Subtract 1 and convert to a string
}       % If there were no previous matching values
  x     % Delete the item from the stack
  GX@)  % Push the current character
]       % End of if statement
&h      % Horizontally concatenate the entire stack
        % Implicit end of for loop and implicit display

Biraz uzak olabilirsin ama süper nerede olduğunu söyleyemem. Giriş yerine this is a testverim . İkincisi dönüştürülmez . this 222a1te52this 222a19e52t9
Mühendis Toast

@EngineerToast Haha teşekkürler. Bir bakacağım.
Suever

1

PHP, 104 Bayt

ileri çözüm

for($i=0;$i<strlen($a=&$argn);$f[$l]=$i++)$a[$i]=is_int($f[$l=$a[$i]])&($c=$i-$f[$l]-1)<10?$c:$l;echo$a;

Geriye dönük çözümler

Çevrimiçi Sürümler

PHP, 111 Bayt

for(;++$i<$l=strlen($a=&$argn);)!is_int($t=strrpos($argn,$a[-$i],-$i-1))?:($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

PHP, 112 Bayt

for(;++$i<$l=strlen($a=&$argn);)if(false!==$t=strrpos($argn,$a[-$i],-$i-1))($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

Çevrimiçi sürüm


1

REXX, 124 125 bayt

a=arg(1)
b=a
do n=1 to length(a)
  m=n-1
  c=substr(a,n,1)
  s=lastpos(c,left(a,m))
  if s>0&m-s<=9 then b=overlay(m-s,b,n)
  end
say b

Biraz uzakta olabilirsiniz. Ben REXX bilmiyorum ama hata sahip olduğu hat 7'de olduğu tahmin s<9yerine s<10ya s<=9. Giriş yerine this is a testverim . İkincisi dönüştürülmez . Çevrimiçi deneyinthis 222a1te52this 222a19e52t9
Engineer Toast

Teşekkürler, bir bayt'ı tıraş etmek aptalca bir girişimdi. Kod düzeltildi.
idrougge

1

C (gcc) , 117 103 bayt

i,j;f(char*s){for(i=strlen(s)-1;s[i];i--)for(j=i-1;s[j]&&i-j<11;j--)if(s[i]==s[j]){s[i]=47+i-j;break;}}

Çevrimiçi deneyin!

String.h alma olmadan 103 bayt, w / alert çalışır. Bu kurallara aykırıysa, onu ben çekeceğim

Güzel Kod:

i,j;
f(char *s) {
    // Chomp backwards down the string
    for(i=strlen(s)-1; s[i]; i--)
        // for every char, try to match the previous 10
        for(j=i-1; s[j] && i-j < 11; j--)
            // If there's a match, encode it ('0' + (i-j))
            if (s[i] == s[j]) {
                s[i] = 47+i-j;
                break;
            }
}

Düzenlemeler:

  • Örtülü izin vermek için LLVM'den gcc'ye değiştirildi, j beyanı lib ithal edildi.
  • Uyumluluk için ek fonksiyon sargısı

(i=strlen(s);s[--i];)Bunun yerine öner(i=strlen(s)-1;s[i];i--)
ceilingcat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.