Bir sütunu döndür


28

Bir tamsayıdır verilen k (benzer bir metnin bir bloğu olduğu), her bir karakter ya da elemanını döndürmek ve metnin bir bloğu ya veya iç diziler eşit olmayan uzunluklara sahip olabilir, bir 2d dizi k sonraki pozisyona inci sütun yukarı ya da aşağı Varolan.

Örnek

Aşağıdaki metnin 20. sütununu döndürün (1 tabanlı):

A line with more than k characters.
A longer line with more than k character.
A short line.
Rotate here: ------v--
This is long enough.

This is not enough.
Wrapping around to the first line.

Çıktı:

A line with more thtn k characters.
A longer line with aore than k character.
A short line.
Rotate here: ------m--
This is long enoughv

This is not enough.
Wrapping around to .he first line.

Aynı girişin k. Sütununun, 35 < k <42, giriş metnini değişmeden vereceği şekilde döndürmek .

kurallar

  • Verileri temsil etmek için ham metin, satır dizisi, 2d karakter dizisi veya herhangi bir makul biçimi kullanabilirsiniz. Karakterler dışında veri türlerini de kullanabilirsiniz.
  • Kod uzunluğunuz buna bağlı ise, öğelerin veri türünün olası değerlerinin sayısı en az 20, aksi takdirde en az 2 olmalıdır. Bu, karakterlerin veya yerel türdeki diğer değerlerin bir alt kümesi olabilir.
  • Boşluklar ve her türlü boş değer, girdiye izin verirseniz, sadece normal değerlerdir. Bunları ayrıca element türünde hariç tutabilirsiniz.
  • Kural değişikliği: Verileri saklamak için eşit uzunluktaki dizileri kullanmayı tercih ederseniz, daha kısa dizileri genel bir varsayılan değerle (boşluklar gibi) doldurmanıza izin verilir.
  • k 0 tabanlı veya 1 tabanlı olabilir. Girişteki en uzun satırın içinde olması garanti edilir (girişin boş olmayan en az bir çizgiye sahip olduğunu gösterir).
  • Yukarı mı yoksa aşağı mı döneceğini seçebilirsiniz.
  • Ya sadece bir pozisyon döndürün, ya da n'nin girişte verilen pozitif bir tamsayı olduğu n pozisyonlarını döndürün .
  • En kısa kod kazanır.

Yanıtlar:


8

APL (Dyalog Genişletilmiş) , 9 bayt SBCS

Tam program 2D metin bloğu için stdin ister, ardından k (APL'nin geçerli ayarına bağlı olarak 0 veya 1 tabanlı), ardından n . Pozitif n yukarı döndür, negatif n aşağı döner.

Etki alanı aşağıdakilerden birini içerir:

  1. Boşluklar hariç tüm Unicode karakterleri, 1114111 izin verilen değerleri, gerekli 20 değerinden daha fazla bırakır.

  2. 0 dışındaki tüm sayılar, gerekli 20'den fazla olan, yaklaşık 2 129 izin verilen değer bırakıyor .

APL 2B blokların dikdörtgen olmasını gerektirdiğinden, giriş boşluk / sıfır ile doldurulmalıdır. Bu, dizge listesinin sol tarafına / sayısal listeye girilerek otomatik olarak yapılabilir .

⎕⌽@≠@⎕⍢⍉⎕

Çevrimiçi deneyin! (görünen alanlar aslında boşluksuz alanlardır)

 metin bloğu istemi

⍢⍉ aktarılırken:

@⎕ Aşağıdakileri giriş satırına uygulayın:

  @≠ prototiplerinden farklı öğelerde (karakterler için boşluk, sayılar için sıfır):

   ⎕⌽ "giriş" adımını sola döndür

APL (Dyalog Unicode) , 22+ bayt SBCS

Bu sürüm, tanımlanabilir dolgu öğesi olarak sıfır kullanarak tam karaktere izin verir.

0~¨⍨↓⍉⎕⌽@(0≠⊢)@⎕⍉↑0,¨⎕

Çevrimiçi deneyin!

Elbette bu, sayısal argümanlarda sıfırlara izin verilmediği anlamına gelir. Tüm sayılar için ilgili program, 0değiştirilen üç oluşumuna sahip olacak ' 've böylece boşluk olarak boşluk kullanacaktır:

' '~¨⍨↓⍉⎕⌽@(' '≠⊢)@⎕⍉↑' ',¨⎕

Hem karakterlerin hem de sayıların tam bir karışımını (hatta bir karışımını) gerçekten istiyorsak, null 'u dolgu olarak kullanabiliriz:

n~¨⍨↓⍉⎕⌽@(n≠⊢)@⎕⍉↑⎕,¨⍨n←⎕NULL

Ve son olarak, eğer giriş alanına boş değerler ve nesneler eklemek isteseydik, bir dolgu sınıfını tanımlayabilir ve bunun örneklerini dolgu olarak kullanabiliriz:

~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEWFIX':Class C' ':EndClass'

Şimdi resmi olarak bunu (ve bunun gibi yeni cevapları) geçerli bir cevap olarak ilan edin. Üzgünüm eğer bu sizi çok rahatsız etti.
jimmy23013

Senin boş sürümünden daha kısa: n~¨⍨↓⍉⎕⌽@(≢¨)@⎕⍉↑⎕,¨⍨n←⊂⊂⍬. Belki daha fazla golf oynamaya yardımcı olmak için uzantınıza modded ekleyebilirsiniz (ancak tam olarak ne kadar yararlı olduklarından emin değilim).
jimmy23013

@ jimmy23013 Evet, bunu düşündüm, ama sonra keyfi iç içe geçmiş şeylerin listesini alamaz. Sonuncusu, nihai çözümdür, özellikle de yerelleştirildiyse Cve Iböylece kirletmemeleri için:{~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEW⎕FIX I←C←':Class C' ':EndClass'}
Adám

11

Python 2 , 111 110 109 99 98 96 94 bayt

lambda a,n:[l[:n]+(l[n:]and[L[n]for L in a[i:]+a if L[n:]][1]+l[n+1:])for i,l in enumerate(a)]

Çevrimiçi deneyin!

Girdileri bir satır listesi ve 0 dizinli sütun olarak alır ve bir dizi listesi döndürür.

Sütun 1 döndürülür.

-11 bayt, Jo King sayesinde


7

Java 8, 107 106 135 107 bayt

k->m->{int s=m.length,i=-1;for(char p=0,t;i<s;t=m[i%s][k],m[i%s][k]=p<1?t:p,p=t)for(;m[++i%s].length<=k;);}

Bir hata düzeltme için +29 bayt ..

0 endeksli; örnek gibi aşağı döner.
Bir karakter matrisi olarak giriş; Baytları kurtarmak için yenisini döndürmek yerine char matrisini değiştirir.

Çevrimiçi deneyin.

Açıklama:

k->m->{                 // Method with integer and char-matrix parameters and no return-type
  int s=m.length,       //  Amount of lines in the matrix `s`
      i=-1;             //  Index-integer `i`, starting at -1
  for(char p=0,         //  Previous-character, starting at 0
           t;           //  Temp-char, uninitialized
      i<s               //  Loop as long as `i` is smaller than `s`:
      ;                 //    After every iteration:
       t=m[i%s][k],     //     Set the temp to the `k`th character of the `i`'th line
       m[i%s][k]=       //     Replace the `k`'th character of the `i`'th line with:
         p<1?           //      If `p` is still 0:
          t             //       Set it to the temp we just set
         :              //      Else:
          p,            //       Set it to the previous-character instead
       p=t)             //     And then replace `p` with the temp for the next iteration
    for(;m[++i          //   Increase `i` by 1 before every iteration with `++i`,
             %s].length //   And continue this loop until the length of the `i`'th line
           <=k;);}      //   is smaller than or equal to the input `k`

1
Fark ettiğim bir şey, ilk satırın yeterli karaktere sahip olduğu varsayımını yaptığınızdır - char p=m[0][k]- değilse, bu bir istisna oluşturmaz mı? Güzel iş btw. Benim C # girişimi büyük bir farkla
atıyorsun

@dana Ah, kahretsin, haklısın .. Muhtemelen seni bu kadar büyük bir farkla yeniyorum çünkü yanlışlıkla bu varsayımı yapıyorum .. Düzeltmeye çalışacağım.
Kevin Cruijssen

1
@dana Sabit, fark ettiğiniz için teşekkür ederiz.
Kevin Cruijssen

2
@dana Ve tekrar 107'ye dönün. ;)
Kevin Cruijssen

1
@EmbodimentofIgnorance Ah, değiştirmek için unuttum niçinknkint p=0,t;pm[i%s][k]=(char)(p<1?t:p)

7

Zsh , 94 87 78 74 69 bayt

-7 bir aritmetik üçlüsüne değiştirerek bayt , karakter yerinde (TIL) değiştirerek -9 bayt , stdin üzerine dizini ve argüman olarak dizeleri girerek -4 bayt , bir dizi yerine bir dize kullanarak -5 bayt Dönen karakterleri saklamak için

read i
for s;c+=$s[i]
c=$c[-1]$c
for s;s[i]=$c[$[$#s<i?0:++j]]&&<<<$s

Old Old Old Old Çevrimiçi çevrimiçi deneyin!

İşte bu cevabın çalışmasını sağlayan anahtarlar:

  • $array[0]veya $string[0]her zaman boş
  • $array[n]$string[n]n, dizi / dizginin uzunluğundan büyükse veya boş
  • array[i]=cveya string[i]=celeman / karakterin yerini alacak.
  • Gelen $[$#s<i?0:++j], jolup değil eğer artırılır $#s<i.

Orijinal 94 byte cevabında, <<<yazdırmayı kullanmayı içeren ilginç bir sorun vardı . echoEtrafında dolaşmak için kullanmak zorundaydım:

for s;echo $s[0,i-1]$c[$[$#s<i?0:++j]]${s:$i}

Bunun nedeni burada görülebilir:

echo $ZSH_SUBSHELL   # prints 0
<<< $ZSH_SUBSHELL    # prints 1

Burada dizeler alt kabuklarda çalıştırılır, çünkü başka bir programa stdin olarak verilirler. Eğer verilen bir program yoksa, dolaylı olarak verilir cat. Bunu ile görebilirsiniz <<< $_. <<< $ZSH_SUBSHELLbenzer echo $ZSH_SUBSHELL | cat. Arttırmamız jgerektiğinden, bir deniz kabuğu içinde olamayız.


6

R , 62 bayt

function(L,n){L[A,n]<-rep(L[A<-L[,n]!=' ',n],2)[1+1:sum(A)];L}

Çevrimiçi deneyin!

Girdiyi boşlukla doldurulmuş bir karakter matrisi olarak alır. Yukarı döner. Tüm sayesinde Kirill L.'ye !

R, , 74 bayt

function(L,n){substr(L[A],n,n)=rep(substr(L[A<-nchar(L)>=n],n,n),2)[-1]
L}

Çevrimiçi deneyin!

Bu gönderim, dolgulu hatların ödenmesinden önce gelir.

Aliasing substrişe yaramaz burada çünkü bizler çağıran substrvesubstr<- ilk sıradayız.

Dolgulu olmayan satırların listesi olarak G / Ç; yukarı doğru döner.


Yana konsensüs girişlerini değiştirerek sağlar, yapabileceğimiz bu çılgın şey
Kirill L.

Ayrıca, OP uzay-yastıklı matrisleri, gibi bir şey ile çalışmak artık mümkün böylece, kuralları rahat bu
Kirill L.

@KirillL. R'nin referans olarak geçtiğini sanmıyorum, bu yüzden muhtemelen buna izin verilmiyor; bana bunun argüman Lana ortamda isimlendirilmesi durumunda işe yaradığını söyler . Yine de mutlu bir şekilde boşluk doldurmaya geçeceğim!
Giuseppe

Ah, anladım, haklısın. Ruby'nin cevabına (bu şekilde bir bütün 1 byte tasarruf eden :)) baktım ama bu durumda diller gerçekten farklı davranıyor.
Kirill L.

5

C # (Visual C # Etkileşimli Derleyici) , 82 bayt

k=>a=>{var c='0';a.Where(b=>b.Count>k&&((b[k],c)=(c,b[k])).c>0).ToList()[0][k]=c;}

Çevrimiçi deneyin!

Hangisinin foreach12 baytlık bir tasarruf sağladığını önerdiği için @ASCIIO'ya kredi verin !

@Someone -8 bayt sayesinde!
@EmbodimentofIgnorance sayesinde -1 bayt!



Belki karakter yerine inç kullanıyorsanız 183
Süresi Dolmuş Veriler

@ExpiredData ew int yerine char
ASCII sadece

Çok kötü bir foreachters kullanamazsınız çünkü kullanamazsınız :(
ASCII

1
Bildirimleri dynamicbirleştirmek ve 2 bayt kaydetmek için kullanın (Bunu daha önce hiç görmedim!) Çevrimiçi deneyin!
zamirim monicareinstate

4

Ruby , 57 bayt

->a,k{b=a.map{|i|i[k]}-[p];c=-2;a.map{|i|i[k]&&=b[c+=1]}}

Çevrimiçi deneyin!

Girdiyi bir dizi dizisi olarak alır a. Metni 0 tabanlı konumda aşağı döndürür k. Girişi değiştirerek döndürür a.


3

05AB1E , 21 bayt

ʒg‹}U¹εXyk©diX®<èIèIǝ

Kesinlikle biraz daha golf oynayabilir miyim?

0 endeksli; hem dizge listesi olarak girdi hem de çıktı.
Örnek gibi aşağı doğru döner, ancak bunun yerine yukarı döndürmek <için değiştirilebilir >.

Çevrimiçi deneyin (altbilgi listeye yeni satırlarla katılır, gerçek liste çıktısını görmek için kaldırın).

Açıklama:

ʒ  }             # Filter the (implicit) input-list by:
 g               #  Where length of the current string
                #  is larger than the (implicit) input-integer
    U            # Pop and store this filtered list in variable `X`
¹ε               # Map over the first input-list again:
  Xyk            #  Get the index of the current string in variable `X`
     ©           #  Store it in the register (without popping)
      di         #  If the index is not -1, so the current string is present in variable `X`
        X®<è     #   Get the (index-1)'th string in variable `X`
            Iè   #   Get the character at the index of the input-integer
              Iǝ #   And insert it at the index of the input-integer in the current string

3

K4 , 41 bayt

Çözüm:

{.[x;i;:;.q.rotate[1;x . i:(&y<#:'x;y)]]}

Açıklama:

Bir şey ... 0 endeksini özlüyorum emin değil misiniz, (değiştirmek yukarı döner 1için -1döndürme aşağı için)

{.[x;i;:;.q.rotate[1;x . i:(&y<#:'x;y)]]} / the solution
{                                       } / lambda taking implicit x and y
 .[x; ;:;                              ]  / index apply assignment back into x
         .q.rotate[1;                 ]   / left rotate 1 character
                           (       ; )    / two item list
                                    y     / index to rotate
                               #:'x       / count (#:) each (') input
                             y<           / index less than ?
                            &             / indexes where true
                         i:               / assign to variable w
                     x .                  / index into x
     i                                    / indexes we saved as i earlier

3

Japt v2.0a0, 18 bayt

0 tabanlı, çok satırlı bir dize olarak giriş ve çıkış. 1 kadar döner.

Daha kısa bir yöntem olmalı!

yÈr\S_Y¦V?Z:°TgXrS

Dene

yÈr\S_Y¦V?Z:°TgXrS     :Implicit input of string U & integer V
y                      :Transpose
 È                     :Pass each line X at 0-based index Y through the following function & transpose back
  r                    :  Replace
   \S                  :  RegEx /\S/g
     _                 :  Pass each match Z through the following function
      Y¦V              :    Test Y for inequality with V
         ?Z:           :    If true, return Z, else
            °T         :    Increment T (initially 0)
              g        :    Index into
               XrS     :    X with spaces removed

Yorumlara ve yeni kurallara yakından bakmadım (bu yüzden daha önce olmadığı halde şimdi izin verilen bir yerde olduğu söylenebilir), ancak ilk girdilerin alanlarını atlamasına izin verilir mi? Giriş dizini olarak değiştirdiğinizi varsayalım; 6cevabınız line withilk satırdaki ve Rotate heredördüncü satırdaki boşluğu atlar , oysa diğer yanıtların çoğu da bu alanı döndürür.
Kevin Cruijssen

@KevinCruijssen, ben eğer, tüm ek kurallar ve ödenekleri ile karıştı biraz değilim ama olan bir konu etrafında alabilirsiniz gibi görünüyor o giriş yerleri izin vermeyerek. Bence.
Shaggy

1
Sanırım ” Bu kısım gerçekten de nasıl cevap vereceğimi açıklıyor, haha. Artık neyin zorunlu ve isteğe bağlı olduğu hakkında hiçbir fikrim yok, ancak gerçekten de giriş ve çıkışta boşluk bırakmayı seçebileceğinizi düşünüyorum ; Boşlukları saymayı ya da saymamayı seçebileceğinizi düşünüyorum ; ve çıktıda deneme boşlukları kullanıp kullanamayacağınızı düşünüyorum ; vb. Hepsi oldukça kafa karıştırıcı. Ah iyi ..
Kevin Cruijssen

3

Jöle , 16 bayt

z⁷⁹ịỴFṙ-ṁƲY⁸ṛ⁹¦"

Solda bir satırlar listesi (yeni satır karakterleri içermeyen karakterlerin listesi) ve sağda bir satırlar listesi döndüren bir tamsayıyı kabul eden ikili bir Bağlantı.

Çevrimiçi deneyin! (altbilgi yeni hatlara böler, Bağlantıyı çağırır ve yeniden yeni hatlara katılır)

Nasıl?

z⁷⁹ịỴFṙ-ṁƲY⁸ṛ⁹¦" - Link: lines L; index I        e.g. example in question; 20
z⁷               - transpose L with filler '\n'       ['AAART\nTW', '   oh\nhr', ...]
  ⁹ị             - Ith item                           'am\nv.\n\nt'
    Ỵ            - split at newlines                  ['am', 'v.', '', 't']
         Ʋ       - last four links as a monad - i.e. f(X):
     F           -   flatten                          'amv.t'
       -         -   -1
      ṙ          -   rotate left by                   'tamv.'
        ṁ        -   mould like X                     ['ta', 'mv', '', '.']
          Y      - join with newlines                 'ta\nmv\n\n.'
                 -   -- call this C
           ⁸     - chain's left argument, L
               " - zip with - i.e. [f(L1,C1), f(L2,C2), ...]:
              ¦  -   sparse application...
             ⁹   -   ...to indices: chain's right argument, I
            ṛ    -   ...of: right argument, Cn

2

perl 5 ( -p), 75 bayt

k 0 indeksli, aşağı döndür

s/.*//;$r="^.{$&}";s/
//;/$r(.)/;$c=$1;s/$r\K.(?=(?s:.)*?$r(.)|)/$1||$c/gme

TIO


2

Perl 6 , 38 33 bayt

Yerdeki diziyi değiştirir (kurallara izin verilmez)

{@^a.grep(*>$^b+1)[*;$b].=rotate}

Çevrimiçi deneyin!


joking İlk başta çıkarmak yerine biraz saklamak düşündüm ama hile yapmak biraz zor olurdu, ama kuralları tekrar okuyup, sonuç vermek için gerçek bir şart yok… yaşasın. Bir (…) (…) 31'i senin gibi yapmak için kesinlikle hile yapıyor gibi görünüyorsun, çünkü bir çağrıyı etkin bir şekilde engellemekten vazgeçiyor; Ben onunla gideceğim.
user0721090601

ah ay, yanlış bağlantıyı yapıştırdım. Yine de yorumlamak istediğim şeyi aldın GiriĢi kesmek mükemmel olsa da (bu durumda işe yaramasa da) ve referansa göre verilen bir argümanı değiştirmek izin verilen giriĢin standart bir değeridir
Jo King

2

JavaScript (Node.js) , 52 bayt

k=>a=>a.filter(b=>b[k]&&([b[k],a]=[a,b[k]]))[0][k]=a

Çevrimiçi deneyin!

Shaggy sayesinde -7 bayt!

Henüz bir JavaScript cevabı görmedim! C # cevabımın limanı.


63 bayt . Muhtemelen daha fazla golf oynayabilir.
Shaggy

@Shaggy - nice :) Çoğu zaman JS'nin çılgınca şeyler yaptığını söylerim. Bu sefer bir stratejim olduğundan beri bir şans vereceğimi düşündüm.
Dana

1
Güzel golf oynamış! :)
Shaggy

2

Kömür , 34 28 21 bayt

θJη⁰≔ΦKDLθ↓℅ιζUMζ§ζ⊖κ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Girdi olarak bir dizi dizge alır. 0 endeksli. Düzenleme: Şimdi PeekDirectiondüzeltildi, doğrudan değiştirebilirim. Açıklama:

θ

Giriş dizelerini yazdırın.

Jη⁰

Döndürülecek sütunun üstüne atlayın.

≔ΦKDLθ↓℅ιζ

Yazdırılan hücreleri çıkarın.

UMζ§ζ⊖κ

Yazdırılan her bir hücreyi önceki hücrenin değeriyle değiştirin (döngüsel olarak). Uygun şekilde hücre değerleri PeekDirectionçağrı sırasında okunur, böylece MapCommandçağrının hücrelere yeni değerler yazması önemli değildir.


1

bip -rn , 32 bayt

POgY#(g@_)>aFI,#gFiyAE@ySsg@i@ag

0 indeksli, aşağı döner. Çevrimiçi deneyin!

Rotasyona katılmak için yeterince uzun olan tüm satırların indekslerini bulmak için filtreler. Ardından, her satırdaki uygun karakteri bir temp değişkeni ile değiştirerek, bu satırların üzerinden geçer s. Sonunda ilk sırayı tekrar ziyaret etmek, kukla değeri tekrar değiştirir.


1

Jöle , 19 bayt

ZnÄ×$ịḟ¹ṙ-;ɗɗʋ€⁹¦⁶Z

Çevrimiçi deneyin!

1 endeksli. Aşağı döner. Birinci argüman olarak sağ dizeli Jelly dizelerinin (karakter listelerinin bir listesini) ve ikincisi olarak k alan bir monadik bağlantı. Girişte sağ doldurma dışında boşluk yasaktır, ancak diğer tüm karakterlere izin verilir.

TIO'da uygulandığı gibi, altbilgi tek bir dize girişini bir dizi listesine böler ve sağa kaydırır, ancak bu kolaylık sağlamak içindir; anladığım kadarıyla, bu adımın sonucuna her kural için ana link girişi yapılabilir.


1

GFortran , 199 bayt

-20 ya da öylesine bir dosya yerine stdin'den okuyarak
-14 boşlukların kaldırılmasıyla -4 için örtülü tamsayılar kullanarak i, k, nve
::

Giriş için kullanıcı gerektirir kve nilk satır üzerinde kdöndürülmesi sütun ve nmetin satırları sayısıdır. Sonraki girişler döndürülecek metin satırlarıdır. Bu yazmak için bir acı oldu! Fortran çok bilgili!

character(99),allocatable::A(:);character(1)r,s
read(*,*)k,n;allocate(A(n))
do i=1,n;read(*,'(A)')A(i);r=A(i)(k:k)
if(r.ne.''.or.r.ne.' ')then;A(i)(k:k)=s;s=r;endif;enddo
A(1)(k:k)=s;print'(A)',A;end

0

T-SQL, 195 bayt

WITH C as(SELECT rank()over(order by i)r,sum(1)over()c,*FROM @t
WHERE len(x)>=@)SELECT
isnull(stuff(c.x,@,1,substring(e.x,@,1)),t.x)FROM @t t
LEFT JOIN c ON t.i=c.i
LEFT JOIN c e ON e.r%c.c+1=c.r

Çevrimiçi deneyin ungolfed versiyonu

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.