Yeni Şifre Fikir: Kelime-walker


23

Şifrelerimi oluşturmanın yeni bir yolunu düşündüm ve muhtemelen uzun vadede çok akıllıca olmasa da eğlenceli bir kod golfü yapabilirdi.

Bir kelime dizisi alarak, şifre şöyle üretilir:

  • Nth kelimesindeki nth karakterini seçin
  • Eğer , n kelimesi daha büyük olan, sayım geriye doğru devam

Örnek:

This is a fun task!
T     s a  u      !

T, ilk karakter
s, ikincisi
a, birinci, ama ileri geri gidiyor, aynı zamanda üçüncü
u, ikincisi ama geriye saydığı için dördüncü
“!” 'görevindeki beşinci karakter!' ve böylece son şifreye dahil edilecektir,Tsau!

kurallar

  • Giriş bir dize olacak
  • Dizgiyi boşluklar üzerinde ayırın, diğer tüm karakterlerin dahil edilmesi gerekir
  • Büyük harfler, büyük harflerle, büyük harflerle aynı olmalıdır
  • Sen almak n her kelimenin adımları, nerede n artı bir önce gelmiş kelimelerin sayısıdır
  • Eğer n kelimeden daha büyükse, kelimeden geriye doğru adım atmalısınız, başlangıca vurursanız, n kere adım atıncaya kadar tekrar ileri gidersiniz.
  • İlk ve son karakter sadece bir kez basılır, bu nedenle örnek olarak yedinci pozisyonda 'eğlence', 'funufun' 'a gider ve' funnuff 'yerine n ile biter ve f üzerinde biter.
  • Çıktı bir dize olmalı

Örnekler:

Input              Output
Once Upon A Time   OpAe
There was a man    Taaa
Who made a task    Waak
That was neat!     Taa
This is a long string to display how the generator is supposed to work  Tsagnoyotoipto

Bayt cinsinden en kısa kod kazanır!


3
toUzun dizesinde (0-endeksli) 12. kelimedir ve bu nedenle kod harfi olmalıdır t, değil o.
Neil

@Neil <s> sıra 1-indeksli, aksi halde ilk kelimenin ilk harfiyle başlayamazsın </s> (denedim)
Troels MB Jensen

14
Tsau!çinceFuck!
sergiol

1
Ayrıca, huni üzerinden funufun seçimi için adım planı çıktıdaki ünlülerin yüzdesini artıracaktır. Kriptografik olarak, bu güçlü bir şifre üreticisi değil.
Criggie

1
@Criggie Kullanmak istemedim, ama dediğim gibi, eğlenceli bir mücadele yaratacak ve golfçüler aynı fikirde görünüyor
Troels MB Jensen

Yanıtlar:



7

05AB1E , 11 bayt

#vyN©Fû}®è?

Çevrimiçi deneyin!

açıklama

#             # split input on spaces
 vy           # for each word in input
   N©F        # N times do, where N is the current iteration
      û}      # palendromize the word
        ®è    # use N to index into the resulting word
          ?   # print


4

Java 10, 148 117 114 110 bayt

s->{int i=-1,j;for(var a:s.split(" "))System.out.print(a.charAt((j=a.length()-1)>0*i++?i/j%2<1?i%j:j-i%j:0));}

@ 3174646 'nın JavaScript cevabını içeren bir bağlantı noktası oluşturarak @SamYonnou sayesinde -31 bayt . Yine @SamYonnou sayesinde , Java algoritmasını optimize ederek -4 byte .

Çevrimiçi deneyin.

Açıklama:

s->{                            // Method with String parameter and no return-type
  int i=-1,                     // Step integer, starting at -1
      j;                        // Temp integer
  for(var a:s.split(" "))       // Loop over the parts split by spaces
    System.out.print(           // Print:
     a.charAt((j=a.length()-1)  //  Set `j` to the the length of the part minus 1
               >0               //  If the length of the part is larger than 1 (`j` > 0)
                 *i++?          //  (and increase `i` by 1 in the process with `i++`)
                i/j%2<1?        //   If `i` integer-divided by `j` is even:
                 i%j            //    Print the character at index `i` modulo-`j`
                :               //   Else:
                 j-i%j          //    Print the character at index `j` minus `i` modulo-`j`
               :                //  Else:
                0));}           //   Print the first (and only) character
                                //   (the >0 check is added to prevent divided-by-0 errors)

Test durumları 0, 2 ve 5 için işe yaramaz
TFeld

1
user71546'nın sürümünün yaptığı gibi benzer "daha fazla aritmetik bir yaklaşım kullanarak" 117'ye düştü:s->{int i=-1,j;for(var a:s.split(" ")){System.out.print(a.charAt(++i>(j=a.length()-1)?j>0?i/j%2==0?i%j:j-i%j:0:i));}}
SamYonnou 31:18

1
@ SamYonnou Teşekkürler! Ve ben parantez kaldırma ve değiştirerek üç bayt golf almaya başladık ==0için <1.
Kevin Cruijssen

1
kurtularak 110 golfed ++i>(j=a.length()-1)matematik şartıyla sonucu ne olursa olsun aynı şekilde çalışır beri koşulu:s->{int i=-1,j;for(var a:s.split(" "))System.out.print(a.charAt(0<(j=a.length()+i-++i)?i/j%2<1?i%j:j-i%j:0));}
SamYonnou

1
@SamYonnou Tekrar teşekkürler! Ben biraz değiştim 0<(j=a.length()+i-++i)?, (j=a.length()-1)>0*i++?bu yüzden açıklama yazmak biraz daha kolaydı (ancak kaydedilmiş bayt yok).
Kevin Cruijssen

3

Kömür , 16 bayt

⭆⪪S §⁺ι✂ι±²¦⁰±¹κ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

  S                 Input string
 ⪪                  Split on spaces
⭆                   Map over words and join
      ι ι           Current word
       ✂ ±²¦⁰±¹     Slice backwards from 2nd last character to start exclusive
     ⁺              Concatenate
    §          κ    Cyclically index on current word index
                    Implicitly print

Slice'nin son parametresini sık sık kullanmıyorum.



3

JavaScript (Node.js) , 78 70 69 68 bayt

-1 bayt @Arnauld

x=>x.split` `.map((y,i)=>y[a=i%(l=y.length-1)|0,i/l&1?l-a:a]).join``

Çevrimiçi deneyin!

açıklama

x=>
 x.split` `                    // Split the words by spaces
 .map((y,i)=>                  // For each word:
  y[                           //  Get the character at index:
                               //   A walk has cycle of length (2 * y.length - 2)
   a=i%(l=y.length-1)|0,       //   Calculate index a = i % (y.length - 1)
   i/l&1                       //   Check in which half the index i in
   ?l-a                        //   If in the second half of cycle, use y.length - 1 - a
   :a                          //   If in the first half of cycle, use a                  
  ]
 ).join``                      // Join back the letters

2

Kırmızı , 135 bayt

func[s][n: 0 p: copy""foreach w split s" "[append/dup r: copy""append w
reverse copy/part next w back tail w n: n + 1 append p r/(n)]p]

Çevrimiçi deneyin!

Okunabilir:

f: func[s][
    n: 0
    p: copy ""
    foreach w split s "  "[
        r: copy ""
        append/dup r append w reverse copy/part next w back tail w n: n + 1
        append p r/(n)
    ]
    p
]



1

Pyth , 12 bayt

s.e@+b_Ptbkc

Çevrimiçi deneyin

s.e@+b_PtbkcQ   Final Q (input) implicit

           cQ   Split on spaces
 .e             Map the above with b=element, k=index
       Ptb        Remove 1st and last character
      _           Reverse
    +b            Prepend the unaltered element ('abcd' -> 'abcdcb')
   @      k       Get the kth character (0 indexed, wrapping)
s               Join on empty string, implicit output

1

Japt, -P11 bayt

¸Ëê ŪD gEÉ

Dene

¸Ë+s1J w)gE

Dene


açıklamalar

¸Ëê ŪD gEÉ
¸               :Split on spaces
 Ë              :Map over each element D at index E
  ê             :  Palindromise
    Å           :  Slice off the first character
     ªD         :  Logical OR with the original element (the above will return an empty string for single character words)
        g       :  Get the character at index
         EÉ     :  E-1
¸Ë+s1J w)gE
¸               :Split on spaces
 Ë              :Map over each element D at index E
   s1J          :  Slice off the first and last characters
       w        :  Reverse
  +     )       :  Append to D
         gE     :  Get the character at index E

1

C (gcc) , 148 bayt (string versiyon), 114 bayt (baskı versiyon)

Bir dizge döndürmem gerekiyorsa (uzun versiyon):

char c[99]={0};char*f(s,t,u,i,j,k)char*s,*t,*u;{for(u=c,i=0;t=strtok(s," ");s=0,i++)*u++=t[j=strlen(t),k=2*j-(j>1)-1,(i%k<j?i%k:k-i%k)%j];return c;}

Çevrimiçi deneyin!

Aksi takdirde, sadece yazdırırım ve bir tampon hakkında endişelenmiyorum (kısa versiyon):

f(s,t,i,j,k)char*s,*t;{for(i=0;t=strtok(s," ");s=0,i++)putchar(t[j=strlen(t),k=2*j-(j>1)-1,(i%k<j?i%k:k-i%k)%j]);}

Çevrimiçi deneyin!


-(j>1)-1+~(j>1)Sanırım daha az 1 bayt ile değiştirilebilir .
Shieru Asakoto

106 karakter: putchar( t[ j=strlen(t)-1, k = i++ % (j ? j*2 : 1), k<j ? k : j+j-k ]); Çevrimiçi deneyin!
user5329483

Arabelleğe alınan sürüm: Genel değişkenler örtük olarak sıfırlandı. Değiştir *u++ile c[i]ve u çıkarın.
kullanıcı5329483

Bina @ user5329483 105 bayt
ceilingcat 19

1

AWK, 79 bayt

Çünkü daha iyi bir awk veya bash çözümü görmeyi merak ediyorum!

{for(i=1;i<=NF;i++){l=length($i);k=int(i/l)%2?l-i%l:k%l;printf substr($i,k,1)}}

Çevrimiçi deneyin!



1

Haskell, 65 62 61 bayt

zipWith(\i->(!!i).cycle.(id<>reverse.drop 1.init))[0..].words

Çevrimiçi deneyin!

Fonksiyonun Preludeözelliklerinin en son sürümünü gerektirir <>.

                   words    -- split the input string into a list of words
zipWith(\i->     )[0..]     -- zip the elements i of [0..] and the words pairwise
                            -- with the function      
      ... <> ...            --   call the functions with a word and concatenate
                            --   the results. The functions are
        id                  --     id: do nothing
        reverse.drop 1.init --     drop last and first element and reverse
    cycle                   --   repeat infinitely
(!!i)                       -- take the ith elemnt of  

Düzenleme: @ user28667, @B sayesinde -1 bayt sayesinde -3 bayt. Mehta


zipWith(\i w->(cycle$id<>reverse.drop 1.init$w)!!i)[0..].wordsAynı zamanda çalışıyor gibi görünüyor .
user28667

1
Sen hiç lambda değiştirerek başka byte kaydedebilirsiniz \i->(!!i).cycle.(id<>reverse.drop 1.init)açık dışarı faktoring wsöz (TIO)
B. Mehta

1

Stax , 9 bayt

éñ~╗D¡┤Gq

Koş ve hata ayıkla

Ambalajsız, ağzı açılmış ve yorumlanmış gibi görünüyor.

j       split into words
{       start block for mapping
  cDrD  copy word; remove first and last character; reverse
  +     concatenate with original word
  i@    modularly (wrap-around) index using map iteration index
m       perform map

Bunu çalıştır


1

PHP , 77 bayt

while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)];

Çevrimiçi deneyin!

  • Kevin sayesinde -3 bayt
  • Titus sayesinde -10 bayt

1
Güzel cevap! Golf Bir küçük şey: Eğer değiştirerek parantez ve bir ek üçüncü byte kurtulmuş oluruz foreach(...){$c=...;echo$c[...];}için foreach(...)echo($c=...)[...];. Çevrimiçi deneyin: 87 bayt
Kevin Cruijssen

Bağımsız değişkenleri otomatik olarak sözcüklere bölmek için (-8 bayt) ve .=iki bayt kaydeder: while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)]; çevrimiçi deneyin
Titus

Güzel! Bir soru: ~ - $ i ($ i-1) ile aynı şeyi yapar, değil mi?
user2803033

0

Güç kalkanı 208 186 170 bayt

$args|%{$i=0;-join($_.Split()|%{$l=($b=($a=$_)).Length;if($l-gt2){$b=($a|%{-join$a[($l-2)..1]})}for($j=0;$a.Length-le$i;$j++){$a+=($b,$_)[$j%2]}$a.Substring($i,1);$i++})}

Ungolfed:

$args|%{
   $i=0;
    -join($_.Split()|%{
        $l=($b=($a=$_)).Length;
        if($l-gt2){
            $b=($a|%{-join$a[($l-2)..1]})
        }
        for($j=0;$a.Length-le$i;$j++){
            $a+=($b,$_)[$j%2]
        }
        $a.Substring($i,1);
        $i++
    })
}

Aşağıdaki davaları test edin veya çevrimiçi deneyin

@(
    "This is a fun task!",
    "Once Upon A Time",
    "There was a man",
    "Who made a task",
    "That was neat",
    "This is a long string to display how the generator is supposed to work"
)|%{$i=0;-join($_.Split()|%{$l=($b=($a=$_)).Length;if($l-gt2){$b=($a|%{-join$a[($l-2)..1]})}for($j=0;$a.Length-le$i;$j++){$a+=($b,$_)[$j%2]}$a.Substring($i,1);$i++})}

1
Burada kısaltabileceğiniz çok şey var. PowerShell'de golf oynamak için ipuçlarını gördünüz mü ?
briantist

Teşekkürler! Hemen gönderdikten sonra anahtarı kullanmayı düşünmüştüm, ama gerisi henüz başıma gelmemişti.
Peter Vandivier

Ayrıca buradaki asıl sorun, bu snippet'te hiçbir yere gerçekten giriş yapmamanızdır. Bir program ya da işlev yazabilmemiz konusunda oldukça esnekiz, fakat sizinkilerin gizli bir girişi var. İlk adım ""|%{olarak $args|%{, yerine geçebilirsiniz, ama bence daha etkili bir şekilde golf
oynayabilirsiniz

1
İşte TIO'da, test durumları için argümanlar özelliğinin nasıl kullanılacağını gösteren bir gösteri . Kod bloğunuzu kodunuzda tutmak, yalnızca TIO’nun gönderiminiz için kolay bağlantı ve bayt sayısını kullanmanıza izin verir!
Briantist

0

J, 43 bayt

[:(>{~"_1#@>|i.@#)[:(,}.@}:)&.>[:<;._1' '&,

ungolfed

[: (> {~"_1 #@> | i.@#) [: (, }.@}:)&.> [: <;._1 ' '&,
  • <;._1 ' '&, boşluklara bölmek
  • (, }.@}:)&.> her bir kelime için, ilk ve son karayı öldür ve kelimeye ekle
  • #@> | i.@# Her kelimenin uzunluğunun kalanını dizinine bölmek
  • > {~"_1 bu sonucu alın ve her kelimeden koparın.

Çevrimiçi deneyin!

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.