Nowa idea hasła: Word-walker


23

Pomyślałem o nowym sposobie generowania haseł i chociaż na dłuższą metę prawdopodobnie nie jest to zbyt sprytne, wciąż mogłoby się przydać do gry w golfa.

Biorąc ciąg słów, hasło jest generowane w ten sposób:

  • Wybierz n-ty znak w n-tym słowie
  • Jeśli n jest większe niż słowo, kontynuuj liczenie wstecz

Przykład:

This is a fun task!
T     s a  u      !

T jest pierwszą postacią
s jest drugą
a jest pierwszą, ale
przewijanie tam i z powrotem jest również trzecią u jest drugą, ale z powodu liczenia do tyłu jest także czwartym
„!” jest piątą postacią w „zadaniu!” i dlatego zostaną uwzględnione w ostatecznym haśle,Tsau!

Zasady

  • Dane wejściowe będą ciągiem
  • Oddziel ciąg spacji, wszystkie pozostałe znaki muszą być uwzględnione
  • Wielkie litery muszą pozostać wielkie, tak samo jak małe litery
  • Robisz n kroków w każdym słowie, gdzie n jest liczbą słów, które pojawiły się przed, plus jeden
  • Jeśli n jest większe niż słowo, musisz przejść do tyłu przez słowo, jeśli osiągniesz początek, idź do przodu, aż zrobisz krok n razy
  • Pierwsza i ostatnia postać jest wykonywana tylko raz, więc „zabawa” na siódmej pozycji jako przykład idzie „funufun” i kończy się na n, a nie „funnuff” i kończy się na f
  • Dane wyjściowe muszą być ciągiem

Przykłady:

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

Najkrótszy kod w bajtach wygrywa!


3
tojest dwunastym słowem (o indeksie 0) w długim łańcuchu, dlatego litera kodowa powinna być t, a nie o.
Neil

@ Neil <s> sekwencja jest indeksowana 1, w przeciwnym razie nie możesz zacząć od pierwszej litery na pierwszym słowie </s> (próbowałem) źle, widzę to teraz
Troels MB Jensen

14
Tsau!jest chiński dlaFuck!
sergiol

1
Również twój plan stopniowego wybierania funufuna zamiast funnuffa zwiększy procent samogłosek na wyjściu. Kryptograficznie nie jest to silny generator haseł.
Criggie

1
@ Criggie Nigdy nie zamierzałem go używać, ale jak powiedziałem, byłoby to zabawne wyzwanie i wydaje się, że golfiści się zgadzają
Troels MB Jensen

Odpowiedzi:



7

05AB1E , 11 bajtów

#vyN©Fû}®è?

Wypróbuj online!

Wyjaśnienie

#             # 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 bajtów

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));}

-31 bajtów dzięki @SamYonnou poprzez utworzenie portu odpowiedzi JavaScript @ user71546 .
-4 bajty dzięki @SamYonnou ponownie, optymalizując algorytm dla Javy.

Wypróbuj online.

Wyjaśnienie:

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)

Nie działa dla przypadków testowych 0, 2 i 5
TFeld

1
grał w golfa do 117 „stosując bardziej arytmetyczne podejście”, podobnie jak w przypadku wersji 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));}}
user71546

1
@SamYonnou Thanks! I udało mi się zagrać w golfa jeszcze trzy bajty, usuwając nawiasy i zmieniając ==0na <1.
Kevin Cruijssen

1
grał w golfa do 110, pozbywając się ++i>(j=a.length()-1)warunku, ponieważ matematyka działa w ten sam sposób, niezależnie od wyniku tego warunku: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 Jeszcze raz dziękuję! Nieznacznie zmieniłem 0<(j=a.length()+i-++i)?na, (j=a.length()-1)>0*i++?więc wyjaśnienie było trochę łatwiejsze do wpisania (jednak nie zapisano bajtów).
Kevin Cruijssen

3

Węgiel drzewny , 16 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

  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

Często nie używam ostatniego parametru Slice.


Podoba mi się, że węgiel drzewny używa glifu nożyczek
Jonah

3

JavaScript (Node.js) , 78 70 69 68 bajtów

-1 bajt @Arnauld

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

Wypróbuj online!

Wyjaśnienie

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

Czerwony , 135 bajtów

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]

Wypróbuj online!

Czytelny:

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 bajtów

s.e@+b_Ptbkc

Wypróbuj online

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 -P, 11 bajtów

¸Ëê ŪD gEÉ

Spróbuj

¸Ë+s1J w)gE

Spróbuj


Objaśnienia

¸Ëê Ū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 bajtów (wersja łańcuchowa), 114 bajtów (wersja drukowana)

Jeśli muszę zwrócić ciąg znaków (długa wersja):

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;}

Wypróbuj online!

W przeciwnym razie po prostu drukuję i nie martwię się o bufor (krótka wersja):

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]);}

Wypróbuj online!


-(j>1)-1+~(j>1)Myślę, że można go zastąpić 1 bajtem mniej.
Shieru Asakoto

106 znaków: putchar( t[ j=strlen(t)-1, k = i++ % (j ? j*2 : 1), k<j ? k : j+j-k ]); Wypróbuj online!
user5329483

Wersja buforowana: Zmienne globalne są domyślnie zerowane. Wymienić *u++z c[i]i usuwania u.
user5329483

Opierając się na @ user5329483 105 bajtach
pułapcatcat

1

AWK, 79 bajtów

Głównie dlatego, że ciekawi mnie lepsze rozwiązanie w awk lub bash!

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

Wypróbuj online!



1

Haskell, 65 62 61 bajtów

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

Wypróbuj online!

Wymaga najnowszej wersji Preludetej <>funkcji.

                   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  

Edycja: -3 bajtów dzięki @ user28667, -1 bajtów dzięki @B. Mehta


Wygląda na to, że zipWith(\i w->(cycle$id<>reverse.drop 1.init$w)!!i)[0..].wordsrównież działa.
user28667

1
Możesz zapisać kolejny bajt, zmieniając lambda na \i->(!!i).cycle.(id<>reverse.drop 1.init)uwzględnienie wyraźnej wwzmianki (TIO)
B. Mehta

1

Stax , 9 bajtów

éñ~╗D¡┤Gq

Uruchom i debuguj

Rozpakowane, niepolowane i skomentowane, wygląda to tak.

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

Uruchom ten


1

PHP , 77 bajtów

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

Wypróbuj online!

  • -3 bajty dzięki Kevinowi
  • -10 bajtów dzięki Titusowi

1
Niezła odpowiedź! Jedna mała rzecz do gry w golfa: możesz pozbyć się nawiasów i jeden dodatkowy trzeci bajt, zmieniając foreach(...){$c=...;echo$c[...];}na foreach(...)echo($c=...)[...];. Wypróbuj online: 87 bajtów
Kevin Cruijssen

Możesz użyć listy argumentów, aby automatycznie podzielić na słowa (-8 bajtów) i .=zapisać dwa bajty: while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)]; wypróbuj online
Titus

Miły! Jedno pytanie: ~ - $ i robi to samo co ($ i-1), prawda?
user2803033

0

PowerShell 208 186 170 bajtów

$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++})}

Nie golfowany:

$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++
    })
}

Wypróbuj poniższe przypadki lub wypróbuj online

@(
    "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
Można tu znacznie skrócić. Czy widzisz wskazówki dotyczące gry w golfa w PowerShell ?
briantistka

Dzięki! Myślałem o użyciu przełącznika zaraz po opublikowaniu, ale reszta jeszcze mi się nie przydarzyła.
Peter Vandivier

Jednym z faktycznych problemów jest to, że tak naprawdę nie pobierasz danych w tym fragmencie. Jesteśmy dość elastyczni, jeśli chodzi o możliwość napisania programu lub funkcji, ale twój ma niejawny wkład. W pierwszym etapie można po prostu wymienić ""|%{się $args|%{, ale myślę, że można bardziej efektywnie golf to też;)
briantist

1
Oto demonstracja w TIO, która pokazuje również, jak używać funkcji argumentów w przypadkach testowych . Zachowanie bloku kodu tylko dla twojego kodu pozwala ci również korzystać z łatwego linkowania i liczenia bajtów TIO dla twojego postu!
briantist

0

J, 43 bajty

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

bez golfa

[: (> {~"_1 #@> | i.@#) [: (, }.@}:)&.> [: <;._1 ' '&,
  • <;._1 ' '&, podzielone na spacje
  • (, }.@}:)&.> dla każdego słowa zabij pierwszy i ostatni wiąz i dołącz do słowa
  • #@> | i.@# weź resztę długości każdego słowa podzieloną na jego indeks
  • > {~"_1 weź ten wynik i wyrwij go z każdego słowa.

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.