Satır Satır Dalgalı Dize Yazdırma


23

Meydan okuma

Bir dizgede sve tamsayıda nparametre olarak alan bir program veya işlev yazın . Programınız, aşağıdaki gibi dönüştürüldüğünde dizeyi yazdırmalı (veya döndürmelidir):

Sol üstten başlayıp aşağı ve sağa hareket ederek, sbir yükseklik dalgası olarak yazın n. Ardından, yukarıdan aşağıya doğru, her satırı bir dize olarak (boşluksuz) birleştirin.

Örnek

"WATERMELON" dizgisine ve 3 yüksekliğe göre:

Dalga şöyle görünmeli:

W   R   O
 A E M L N
  T   E

Ardından, yukarıdan aşağıya doğru satırları birleştirin:

WRO
AEMLN
TE

Bu nedenle, programınız "WROAEMLNTE" dizesini döndürmelidir.

Aynı şekilde, yüksekliği 4 olan "WATERMELON" şu dalgayı üretmelidir:

W     E
 A   M L
  T R   O
   E     N

Programınız daha sonra "WEAMLTROEN" dizesini döndürmelidir.

kurallar

Giriş

Giriş, herhangi bir makul formatta alınabilir. Dize istediğiniz durumda olabilir. Bunu varsayabilirsin0 < n <= s.length

Çıktı

Çıktı yalnızca dönüştürülmüş dizgiden (döndürülmüş veya STDOUT'a basılmış olsun) artı izleyen yeni satırlardan oluşmalıdır.

puanlama

Bu , bayt cinsinden en kısa cevap! Standart boşluklara izin verilmez.

Test Kılıfları

Input                        Output

programmingpuzzles, 5 ->     piermnlsomgzgapzru
codegolf, 3           ->     cgoeofdl
elephant, 4           ->     enlatehp
1234567, 3            ->     1524637
qwertyuiop, 1         ->     qwertyuiop

n> 1 olduğunu varsayabilir miyiz ? Lütfen açıklığa kavuşturun ve bir test davası
Luis Mendo 16:18

1
Kabul edebilirsin n > 0ama n=1geçerli bir dava. Soruyu şimdi güncelleyeceğim.
Cowabunghole

2
@Cowabunghole biliyorum. :) İlgili sadece, biraz benzer ve mevcut cevapların bu zorluk için yardımcı olabileceği anlamına gelir. Sadece sağdaki bağlantılı sorularda görünmelerini sağlarım. Related! = Çoğaltıldı. ;)
Kevin Cruijssen

5
Daha önce sadece bir ray ile kodlanmış bir ray çit şifresi görmedim. Sadece söylüyorum
wooshinyobject

1
@ Veskah Ah evet, yaşlı çift rot13 numarası.
wooshinyobject 17:18

Yanıtlar:


5

Kabuğu , 6 bayt

δÖK…¢ḣ

Çevrimiçi deneyin!

De için çalışıyor n = 1.

açıklama

δÖK…¢ḣ  Implicit inputs, say n=4 and s="WATERMELON"
     ḣ  Range: [1,2,3,4]
    ¢   Cycle: [1,2,3,4,1,2,3,4,1,2,3,4..
   …    Rangify: [1,2,3,4,3,2,1,2,3,4,3,2..
δÖK     Sort s by this list: "WEAMLTROEN"
        Print implicitly.

Üst düzey işlev δ, kaputun altında böyle çalışır. Birlik işlevini ve listeyi alan ve yeni bir liste döndüren daha yüksek bir düzen işleviniz olduğunu varsayalım. Örneğin, Öbir işlevi alır ve onu anahtar olarak kullanarak bir listeyi sıralar. Sonra δÖbir ikili fonksiyon alır ve iki liste, listeleri birlikte sıkıştırır Ö, ikili işlevi anahtar olarak kullanarak çiftleri sıralamak için uygulanır ve son olarak çiftleri ikinci koordinata yansıtır. Kİlk argümanını döndüren ve ikincisini görmezden gelen anahtar işlev olarak kullanıyoruz .


6

MATL , 16 bayt

Zv3L)t?yn:)2$S}i

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

Girişlerini düşünün 5, 'programmingpuzzles'.

Zv     % Input, implicit: number n. Symmetric range
       % STACK: [1 2 3 4 5 4 3 2 1]
3L     % Push [1 -1+1j]. When used as an index, this means 1:end-1
       % STACK: [1 2 3 4 5 4 3 2 1], [1 -1+1j]
)      % Index. Removes last element
       % STACK: [1 2 3 4 5 4 3 2]
t      % Duplicate
       % STACK: [1 2 3 4 5 4 3 2], [1 2 3 4 5 4 3 2]
?      %   If non-empty and non-zero
       %   STACK: [1 2 3 4 5 4 3 2]
  y    %   Implict input: string s. Duplicate from below
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2], 'programmingpuzzles'
  n    %   Number of elements
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2], 18
  :    %   Range
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2], [1 2 3 ··· 17 18]
  )    %   Index modularly
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2 1 2 3 4 5 4 3 2 1 2]
  2$S  %   Two-input sort: stably sorts first input as given by the second
       %   STACK: 'piermnlsomgzgapzru'
}      % Else. This branch is entered when n=1. The stack contains an empty array
       %   STACK: []
  i    %   Take input
       %   STACK: [], [], 'programmingpuzzles'
       % End, implicit
       % Display stack, implicit. Empty arrays are not displayed



5

R , 68 bayt

function(s,n)intToUtf8(unlist(split(utf8ToInt(s),-(n:(2.9-n)-1)^2)))

Çevrimiçi deneyin!

  • @Giuseppe sayesinde -10 bayt
  • -17 bayt çünkü aptaldım
  • -9 bayt ve n=1@ J.Doe sayesinde dava düzeltildi
  • @JayCe sayesinde -3 bayt


3

05AB1E (eski) , 11 8 bayt

Σ²Lû¨¾è¼

@ LouisMendo'nun MATL cevabından ilham almıştır . @Adnan
sayesinde -3 bayt, çünkü ben bir aptalım ..>.>

Çevrimiçi deneyin .

Açıklama:

Σ           # Sort the (implicit) input-string by:
 ²L         #  Create a list in the range [1, second input-integer]
            #   i.e. 5 → [1,2,3,4,5]
   û        #  Palindromize it
            #   i.e. [1,2,3,4,5] → [1,2,3,4,5,4,3,2,1]
    ¨       #  Remove the last item
            #   i.e. [1,2,3,4,5,4,3,2,1] → [1,2,3,4,5,4,3,2]
     ¾è     #  Index into it (with wraparound) using the counter_variable (default 0)
            #   i.e. counter_variable = 0 → 1
            #   i.e. counter_variable = 13 → 4
       ¼    #  And after every iteration, increase the counter_variable by 1

NOT: counter_variable05AB1E Python Legacy versiyonunda, çünkü kullanılan Σbir yerleşik SSR değerleri vardı vermedi No 05AB1E yeni İksir yeniden yazma sürümünde var. Öyleyse neden hala Legacy sürümünü kullanıyorum? Çünkü Elixir'de yeniden yazmak, dizgiyi karakter dizisine dönüştürür, }Jçıktısını dizeye dönüştürmek için ek bir ek gerektirir (ve ayrıca şu anda èuzunca bir listeye indekslemek için hiç çalışmadığı bir hata içerir). ..: S)


¹g∍05AB1E için döngüsel indeksleme kullandığından , parçaya ihtiyacınız yoktur è.
Adnan

@Adnan Ah, ben bir salağım ..>.> Teşekkürler!
Kevin Cruijssen

2

Japt , 16 bayt

¬üÏu´VÑ aV°ÃÔc q

Çevrimiçi test edin!

açıklama

 ¬ üÏ   u´ VÑ  aV° Ã Ô c q
Uq üXY{Yu--V*2 aV++} w c q    Ungolfed
                               Implicit: U = input string, V = size of wave
Uq                             Split U into chars.
   üXY{            }           Group the items in U by the following key function:
       Y                         Take the index of the item.
        u--V*2                   Find its value modulo (V-1) * 2.
               aV++              Take the absolute difference between this and (V-1).
                                 This maps e.g. indices [0,1,2,3,4,5,6,7,...] with V=3 to
                                                        [2,1,0,1,2,1,0,1,...]
                                 The items are then grouped by these values, leading to
                                 [[2,6,...],[1,3,5,7,...],[0,4,...]].
                     w         Reverse the result, giving [[0,4,...],[1,3,5,7,...],[2,6,...]].
                       c       Flatten.
                         q     Join back into a single string.

o Bu üyöntem yeni mi?
Luis Felipe De Jesus Munoz,

Evet, Cumartesi :-) tarihinde eklendi
ETHproductions

Bir bayt kaydetmek ve bir çıktı almak için girişi karakter dizisi olarak alabilir ya da bir -Pbaşkasını kaydetmek için bayrak 2 kullanabilirsiniz .
Shaggy

2

Jöle , 8 bayt

6 byter yükseklik 1 için başarısız; bunu ele almak için kullanılan iki bayt ... belki bir 7 bulunabilir?

ŒḄṖȯ1ṁỤị

Olumlu bir tamsayı ve karakter listesini veren bir karakter listesini kabul eden ikili bir bağlantı.

Çevrimiçi deneyin!

Nasıl?

ŒḄṖȯ1ṁỤị - Link: positive integer N; list of characters, T
ŒḄ       - bounce (implicit range of) N -> [1,2,3,...,N-1,N,N-1,...,3,2,1]
  Ṗ      - pop off the final entry         [1,2,3,...,N-1,N,N-1,...,3,2]
   ȯ1    - OR one                          if this is [] get 1 instead
     ṁ   - mould like T (trim or repeat to make this list the same length as T)
      Ụ  - grade-up (get indices ordered by value - e.g. [1,2,3,2,1,2] -> [1,5,2,4,6,3])
       ị - index into T

2

JavaScript (ES6), 75 bayt

@MattH (-3 bytes) tarafından önerilen daha kısa formül

Girişi olarak alır (string)(n).

s=>n=>--n?[...s].map((c,x)=>o[x=x/n&1?n-x%n:x%n]=[o[x]]+c,o=[])&&o.join``:s

Çevrimiçi deneyin!


JavaScript (ES7), 78 bayt

@ETHproductions sayesinde 4 byte kurtarıldı

Girişi olarak alır (string)(n).

s=>n=>--n?[...s].map((c,x)=>o[x=n*n-(x%(n*2)-n)**2]=[o[x]]+c,o=[])&&o.join``:s

Çevrimiçi deneyin!


Benim çözümüm seninkine çok benziyordu. Sen kaydedebilir -3 insert indeksini hesaplamak bayt oile x/n&1?n-x%n:x%nyerine n*n-(x%(n*2)-n)**2.
Matt

@MattH Güzel bitti. Teşekkürler!
Arnauld


1

MBASIC , 146 159 155 bayt

1 INPUT S$,N:DIM C$(N):P=1:D=1:FOR I=1 TO LEN(S$):C$(P)=C$(P)+MID$(S$,I,1)
2 IF N>1 THEN P=P+D
3 IF P=N OR P=1 THEN D=-D
4 NEXT:FOR I=1 TO N:PRINT C$(I);:NEXT

N = 1 işlemek için güncellendi

Çıktı:

? programmingpuzzles, 5
piermnlsomgzgapzru

? codegolf, 3
cgoeofdl

? elephant, 4
enlatehp

? 1234567, 3
1524637

? WATERMELON, 4
WEAMLTROEN

? qwertyuiop, 1
qwertyuiop

Şu anda n = 1 durumunu desteklemiyor.
wooshinyobject

N = 1 durumu ele alınarak güncellendi
wooshinyobject

Karşılaştırmaları temizleyerek 4 bayt kurtardı.
wooshinyobject

1

Perl 6 , 49 bayt

->\n{*.comb.sort({-abs n-1-$++%(2*n-2||1)}).join}

Çevrimiçi deneyin!

Körili bir işlev olarak girdiyi alır.

Açıklama:

->\n{*.comb.sort({-abs n-1-$++%(2*n-2||1)}).join}
->\n{                                           }  # Take an number
     *.comb        # Turn the string into a list of chars
           .sort({                       })   # And sort them by
                           $++    # The index of the char
                              %(2*n-2||1)  # Moduloed by 2*(n-1) or 1 if n is 0
                       n-1-       # Subtract that from n-1
                   abs            # get the absolute value
                  -               # And negate to reverse the list
                                          .join  # and join the characters

Sıralama kriteri şu şekilde görünür (için n=5):

(-4 -3 -2 -1 0 -1 -2 -3 -4 -3 -2 -1 0 -1 -2 -3 -4 -3 -2 -1)

1

J , 24 bayt

4 :'x\:(#x)$}:|i:<:y'::[

Çevrimiçi deneyin!

Açık didik fiil Gibi koş 'codegolf' f 3.

Nasıl çalışır

4 :'x\:(#x)$}:|i:<:y'::[    x: string, y: height
4 :                         Define a dyadic verb:
               i:<:y        Generate a range of -(y-1) .. y-1
            }:|             Take absolute value and remove last
       (#x)$             1) Repeat to match the string's length
    x\:                     Sort x by the decreasing order of above
                     ::[    If 1) causes `Length Error`, return the input string instead

Normalde, açık işlev biçiminde ek 5 bayt alır n :'...'. Ancak hata işleme eklenirse, fark, parenler ve boşluklar nedeniyle 2 bayta iner (tacit)<space>::.


Neden hep kullanma eğilimindeyim sort up? Açık fiiliniz hala 3 byte daha kısa. İyi karar!
Galen Ivanov


1

Powershell, 99 95 bayt

param($s,$n)$r=,''*$n
$s|% t*y|%{$r[((1..$n+$n..1)*$s.Length|gu)[$i++*($n-gt1)]-1]+=$_}
-join$r

Test komut dosyası:

$f = {

param($s,$n)$r=,''*$n
$s|% t*y|%{$r[((1..$n+$n..1)*$s.Length|gu)[$i++*($n-gt1)]-1]+=$_}
-join$r

}

@(
    ,("1234567", 3            ,     "1524637")
    ,("qwertyuiop", 1         ,     "qwertyuiop")
    ,("codegolf", 3           ,     "cgoeofdl")
    ,("elephant", 4           ,     "enlatehp")
    ,("programmingpuzzles", 5 ,     "piermnlsomgzgapzru")
) | % {
    $s,$n,$e = $_
    $r = &$f $s $n
    "$($r-eq$e): $r"
}

Çıktı:

True: 1524637
True: qwertyuiop
True: cgoeofdl
True: enlatehp
True: piermnlsomgzgapzru

açıklama

Senaryo:

  • bir satır dizisi oluşturur,
  • satırları uygun değerlerle doldurur,
  • ve birleştirilmiş satırları döndürür.

İfade ((1..$n+$n..1)*$s.Length|gu , benzer bir dizi oluşturur 1,2,3,3,2,1,1,2,3,3,2,1... ve bitişik kopyaları siler. Get-Uniquegu için takma addır .

  • İçin $n=3deduplicated dizisi olup:1,2,3,2,1,2,3,2,1...
  • İçin $n=1deduplicated dizisi olup:1

İfade $i++*($n-gt1) , tekilleştirilmiş sıradaki bir dizini döndürür. =$i++eğer $n>1, aksi takdirde=0


1

Ruby , 75 65 bayt

->s,h{a=['']*h;x=-k=1;s.map{|c|a[x+=k=h-x<2?-1:x<1?1:k]+=c};a*''}

Çevrimiçi deneyin!

Girdiyi karakter dizisi olarak alır, string döndürür

Wokrs nasıl:

  • hDizeler oluşturun
  • Girdi dizisindeki her karakter için, dizine göre hangi dizgiyi koyacağınıza karar verin (değiştirilecek dizinin dizini, hdaha sonraya 0kadar devam eder)
  • Bir araya gelen tüm dizeleri döndür


@ GB son vaka için işe yaramıyor
Asone Tuhid

1

C, 142 134 bayt

Jonathan Frech sayesinde 8 bayt kurtarıldı

Kod:

t;i;j;d;f(s,n)char*s;{for(t=strlen(s),i=0;i<n;i++)for(j=0;j+i<t;j=d+i+(n<2))d=j-i+2*~-n,putchar(s[i+j]),i>0&i<n-1&d<t&&putchar(s[d]);}

Açıklama:

// C variable and function declaration magic
t;i;j;d;f(s,n)char*s;{
    // Iterate through each "row" of the string
    for(t=strlen(s),i=0;i<n;i++)
        // Iterate through each element on the row
        // Original index iterator here was j+=2*(n-1), which is a full "zig-zag" forward
        // The (n<2) is for the edge case of n==1, which will break the existing logic.
        for(j=0; j+i<t; j=d+i+(n<2))
            // If j+i is the "zig", d is the "zag": Original index was d=j+i+2*(n-i-1)
            // Two's complement swag here courtesy of Jonathan Frech
            d=j-i+2*~-n,
            putchar(s[i+j]),
            // Short circuit logic to write the "zag" character for the middle rows
            i>0 & i<n-1 & d<t && putchar(s[d]);
}

Çevrimiçi deneyin!


1
Merhaba ve PPCG'ye hoş geldiniz; güzel ilk golf. 134 bayt (GCC varsayımıyla).
Jonathan Frech

0

Kömür , 21 bayt

⭆NΦη¬⌊E²﹪⁺μ⎇νι±ι∨⊗⊖θ¹

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. indekslerinin sağladığına dikkat çekerek çalışır.mim±i=0(mod2n2)

 N                      First input as a number
⭆                       Map over implicit range and join
   η                    Second input
  Φ                     Filter over characters
       ²                Literal 2
      E                 Map over implicit range
          μ             Character index
             ι ι        Outer index
              ±         Negate
            ν           Inner index
           ⎇            Ternary
         ⁺              Plus
                   θ    First input
                  ⊖     Decremented
                 ⊗      Doubled
                    ¹   Literal 1
                ∨       Logical Or
        ﹪               Modulo
     ⌊                  Minimum
    ¬                   Logical Not
                        Implicitly print

0

SNOBOL4 (CSNOBOL4) , 191 bayt

	S =INPUT
	N =INPUT
	A =ARRAY(N)
	A<1> =EQ(N,1) S	:S(O)
I	I =I + -1 ^ D
	S LEN(1) . X REM . S	:F(O)
	A<I> =A<I> X
	D =EQ(I,N) 1
	D =EQ(I * D,1)	:(I)
O	Y =Y + 1
	O =O A<Y>	:S(O)
	OUTPUT =O
END

Çevrimiçi deneyin!

Alır Ssonra Nayrı satırlarda.

Açıklama:

	S =INPUT			;* read S
	N =INPUT			;* read N
	A =ARRAY(N)			;* create array of size N
	A<1> =EQ(N,1) S	:S(O)		;* if N = 1, set A<1> to S and jump to O
I	I =I + -1 ^ D			;* index into I by I + (-1)^D (D starts as '' == 0)
	S LEN(1) . X REM . S	:F(O)	;* extract the first character as X and set S to the
					;* remaining characters, jumping to O when S is empty
	A<I> =A<I> X			;* set A<I> to A<I> concatenated with X
	D =EQ(I,N) 1			;* if I == N, D=1
	D =EQ(I * D,1)	:(I)		;* if I == D == 1, D = 0. Goto I
O	Y =Y + 1			;* increment the counter
	O =O A<Y>	:S(O)		;* concatenate the array contents until last cell
	OUTPUT =O			;* and print
END



0

Pyth , 22 21 bayt

|seMhD,V*lz+PUQP_UQzz

Ayrı satırlarda ntakip edilen girişi alır s. Online Deneyin burada ya bir kerede tüm test durumları doğrulamak burada .

|seMhD,V*lz+PUQP_UQzz   Implicit: Q=eval(input()), z=remaining input

             UQ         Range [0-Q)
            P           All but last from the above
                         e.g. for Q=3, yields [0,1]
               P_UQ     All but last of reversed range
                         e.g. for Q=3, yields [2,1]
           +            Concatenate the previous two results
                          e.g. for Q=3, yields [0,1,2,1]
        *lz              Repeat len(z) times
      ,V           z    Vectorised pair the above with z, truncating longer to length of shorter
                          e.g. for Q=3, z=WATERMELON, yields:
                          [[0,'W'],[1,'A'],[2,'T'],[1,'E'],[0,'R'],[1,'M'],[2,'E'],[1,'L'],[0,'O'],[1,'N']]
    hD                  Sort the above by the first element
                          Note this is a stable sort, so relative ordering between equal keys is preserved
  eM                    Take the last element of each
 s                      Concatenate into string
                          Note that if n=1, the result of the above will be 0 (sum of empty array)
|                   z   If result of above is falsey, yield z instead

Düzenleme: boş kontrolü işlemin sonuna götürerek bir bayt kaydetti. Önceki versiyon: seMhD,V*lz|+PUQP_UQ]0z


0

Kırmızı , 153 bayt

func[s n][i: v: m: 1 b: collect[foreach c s[keep/only reduce[v i c]v: v + m
if all[n > 1(i: i + 1)%(n - 1)= 1][m: -1 * m]]]foreach k sort b[prin last k]]

Çevrimiçi deneyin!

Açıklama:

f: func [ s n ] [                      ; s is the string, n is the height
    i: 1                               ; index of the current character in the string
    v: 1                               ; value of the "ladder"
    m: 1                               ; step (1 or -1)
    b: collect [                       ; collect the values in a block b
        foreach c s [                  ; foreach character in the string 
            keep/only reduce [ v i c ] ; keep a block of the evaluated [value index char] 
            i: i + 1                   ; increase the index
            v: v + m                   ; calculate the value 
            if all [ n > 1             ; if height is greater than 1 and
                    i % (n - 1) = 1    ; we are at a pick/bottom of the ladder
                   ]
                [ m: -1 * m ]          ; reverse the step
        ]
    ]
    foreach k sort b [ prin last k ]   ; print the characters in the sorted block of blocks
]

0

Bu soruna iki çözümüm var. İlk yaptığım ilk çözüm daha sonra baytları kurtaracağını düşündüğüm başka bir yol düşündüm ama yine de dahil etmedim.


1. Çözüm

PHP , 152 144 116 bayt

<?php
for($i=0;$i<$n=$argv[2];$i++)
    for($j=$i;$s=$argv[1][$j];$j+=$n<2|(($f=!$f|!$i)?$i<$n-1?$n+~$i:$i:$i)*2)
        echo $s;
  • @JoKing sayesinde 8 bayt
  • @Shaggy sayesinde 28 bayt

Çevrimiçi deneyin!


2. Çözüm

PHP , 162 bayt

<?php
$s=$argv[0];
$n=$argv[1];
$l=strlen($s);
for($i=0;$i<$l;){
    for($j=0;$j<$n&&$i<$l;)
        $a[$j++].=$s[$i++];
    for($j=$n-2;$j>0&&$i<$l;)
        $a[$j--].=$s[$i++];
}
echo join($a);

Çevrimiçi deneyin!


Başlamanıza gerek yok $fve $n-1-$iolabilir $n-~$i. 144 bayt
Jo King

@ JoKing'in geliştirmeleri üzerine -28 bayt .
Shaggy

oop; Ne zaman kırılır n=1. Bu , aynı bayt sayısı için çalışır.
Shaggy

Sonra da kısa etiketleri ve boşluk kaldırabilir echoiçin 5 daha bayt kaydetmek
Shaggy

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.