Bir Dizgiyi Yay


11

Göndermeden Sandbox burada .

Bir dizeyi "Springified" yapan bir işlev veya program oluşturun.

  • Giriş, Stdin'de bir Dize veya en yakın alternatif olacaktır
  • Giriş yalnızca yazdırılabilir ASCII ve / veya boşluklar içerecektir
  • Çıktı Stdout veya en yakın alternatif olacaktır
  • Sondaki satırlar ve boşluklar kabul edilebilir

Bir String nasıl yayılır

  1. String'i gerektiği kadar ASCII yay bobinine formatlayın
  2. Bobinleri en yakın bobine kadar boşluklarla doldurun
  3. Bobinlerin etrafındaki yayı takip ederek karakterleri okuyun

Bu bir ASCII yay bobini:

#
# ####
 #    #
# ####
#

Burada #s dizgenin karakterleri

İşte bir örnek:

abcdefghijklmnopqrstuvwxyz

olur

a
b cdef
 g    h
i jklm
n
o
p qrst
 u    v
w xyz.
.

Burada .görünürlük için boşlukların yerini alır.

Daha sonra, ASCII yayı aşağı doğru, ilmeklerin etrafında gve uiki kez vurularak dize geri okunur :

1| a  <-3
 V b cdef
    g    h
4| i jklm
 V n  2->
  ...

... vererek:

abgjklmhfedcginopuxyz vtsrquw (sondaki boşluk ile)

Test Durumları

(sondaki boşlukları vurgulamak için teklifler eklendi - lütfen ES cinsinden yoksay)

I: "abcdefghijklmnopqrstuvwxyz"
O: "abgjklmhfedcginopuxyz vtsrquw "

I: "!@#"
O: "!@         #   "

I: ""
O: ""

I: "12345 67890"
O: "12690  7 54368 "

I: " "
O: "               "

Çıkış uzunluğunun her zaman 15'in bir katı olduğunu, bir yay bobininin uzunluğuna dikkat edin

Bu , bu yüzden bayttaki en kısa cevap kazanır.


Bobin boyunca paterni takip etmek çok daha zor olurdu.
Sihirli Ahtapot Urn

@carusocomputing ters mi demek istiyorsun?
MildlyMilquetoast

codegolf.stackexchange.com/a/107531/59376 ortaya çıkıyor Zorluğu yazılı olarak anlamadım, tam olarak sorun ahaha.
Sihirli Ahtapot Urn

Yanıtlar:


2

Jöle , 26 bayt

“4ṘƝ;þ¦Ɱ’b®¤ị
;⁶x14©¤s®ṖÇ€

TryItOnline!

Nasıl?

“4ṘƝ;þ¦Ɱ’b®¤ị - Link 1, output for a single coil: char array
           ¤  - nilad followed by link(s) as a nilad
“4ṘƝ;þ¦Ɱ’     - base 250 number, 13140239220751650
          ®   - retrieve from register (14 from main link)
         b    - convert to base, [1,2,7,10,11,12,13,8,6,5,4,3,7,9,0]
            ị - index into the char array

;⁶x14©¤s®ṖÇ€ - Main link: theString
      ¤      - nilad followed by link(s) as a nilad
 ⁶           - a space character
  x          - repeated
   14©       - place 14 into the register and yield 14
;            - concatenate theString with the 14 spaces
       s     - split into chunks of length
        ®    -     retrieve from register (14)
         Ṗ   - pop last entry from the result (removes the space only last entry of 14 chars or less)
          Ç€ - call the last link (1) as a monad for €ach
             - implicit print

5

Piton 2, 104 102 98 bayt

f=lambda t:''.join((t+' '*13)[ord(x)-97+y*14]for y in range(len(t)/14+1)for x in'abgjklmhfedcgin')

Yorum yardımı için teşekkürler!

https://tio.run/#2VDVy

Orijinal:

t=raw_input()+' '*13
print''.join(t[ord(x)-97+y*14]for y in range(len(t)/14)for x in'abgjklmhfedcgin')

Sadece input()formatta girdi kullanabilir ve alabilirsiniz "<stuff>".
HyperNeutrino

Büyük ilk golf! Alex L.'nin işaret ettiği gibi, girdilerin tırnak içine alınmasına izin veriyoruz. Ayrıca lambdabir program yerine anonim bir işlev vermek için a kullanabilirsiniz - bu genellikle daha kısadır .
xnor

Bir IndexError içeren boş dize sınama durumu başarısız olur. Sanırım 13'ten 14'e değiştirmeniz ve son değeri (jöle cevabım gibi) açmanız gerekebilir.
Jonathan Allan

... Değişen +13için +14ve +1için +(len(t)%14>0)yapardı, ama daha kısa yolu olmalı.
Jonathan Allan

3

JavaScript (ES6), 79 bayt

f=
s=>s.replace(/.{1,14}/g,s=>'0169abc7543268d'.replace(/./g,c=>s['0x'+c-0]||' '))
<input oninput=o.textContent=f(this.value)><pre id=o>

@ETHproductions 'dan utanmadan çalınan onaltılık dize.


@ETHproductions Teşekkürler, düzeltildi.
Neil

Harika!
Dodov

Snippet'in, yazarken sonucu görmenizi nasıl sağlaması güzel
MildlyMilquetoast


2

JavaScript (ES7), 144 143 141 114 104 103 bayt

10B tasarruf için ETHProductions sayesinde!

a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``

Misal

f=a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``
f('abcdefghijklmnopqrstuvwxyz')

Çıktı

abgjklmhfedcginopuxyz vtsrquw 

Çok hoş. Diziyi onaltılık bir dizeye +('0x'+whatever)dönüştürerek ve bir sayıya dönüştürmek için kullanarak bazı baytlar kaydedebilirsiniz :(_,c)=>b[(c/15|0)*14+ +('0x'+'0169abc7543268d'[c%15])]
ETHproductions 20:45

Akıllı numara. Zaten diziyi yazmanın başka yollarını düşünüyordum, ama herhangi bir şey bulamadım. Yine de onaltılık sayıyı önce ve sonra çarpmayı yerleştirerek alanı gereksiz hale getirerek kısaltabilirim.
Luke

Hatta '0x'+'...'[c%15]-0+(c/15|0)*14bir çift parantez kurtarmak için bile yapabilirsin :-)
ETHproductions

Haklısın. Katma.
Luke

2

Perl 6 , 61 bayt

{S:g/(.)**1..14/{[~] $0["abgjklmhfedcgin".ords X-97]X//" "}/}

Nasıl çalışır

Temel yapı şudur:

{                                  }  # A lambda.
 S:g/(.)**1..14/{                }/   # Regex-replace segments of 1-14 characters, with:
                     $0               #   The single-char submatches captured by the parens.
                       [  ]           #   Index them using certain indices (see below).
                           X//" "}    #   Replace each undefined element with a space.
                 [~]                  #   Concatenate the characters.

Her 14 karakterlik segmente indekslemek için kullanılan ifade "abgjklmhfedcgin".ords X- 97şöyledir:

  1. Sabit kodlu dizeyi alın abgjklmhfedcgin.
  2. Onun codepoints alın: 97 98 103 106 107 108 109 104 102 101 100 99 103 105 110.
  3. Her bir dizi 97 Çıkarma: 0 1 6 9 10 11 12 7 5 4 3 2 6 8 13.

Perl 6 , 64 bayt

{[~] .comb(14)».comb»[0,1,6,9..12,7,5...2,6,8,13].flat X//" "}

Çevrimiçi deneyin!

Nasıl çalışır

Temel yapı şudur:

{                                    }  # A lambda.
     .comb(14)                          # Split the argument into substrings of <= 14 chars.
              ».comb                    # Split each substring into a list of characters.
                    »[  ]               # Index each list using the same indices (see below).
                         .flat          # Flatten the resulting nested list.
                               X//" "   # Replace each undefined element with a space.
 [~]                                    # Concatenate the list to get a string again.

Aynı endeksleri yukarıdaki gibi, ama biz diyoruz çünkü .flatzaten onlar için bir iç içe (ama 1 bayt daha kısa) ifadesini kullanabilirsiniz: 0,1,6,9..12,7,5...2,6,8,13.

(Önemsiz görünüyor, ama aslında Rakudo Perl 6 bir ayrıştırma kendine özgülüğü dayanıyor muhtemelen bir hata . O böceği istismar etmeden yazmak için, bir etrafına parens eklemek gerekir 5...2.)


2

Befunge-93, 97 bayt

<>0>v%2g3\p89:-1+*"!"!:+1<_@#`0:~
,^\,_\:98g\9p1+:76+`#v_:~^
^,,g96g98g9+67,,,,,$$_
==    =  ====

Çevrimiçi deneyin!

Bu, çeşitli bileşen parçaları vurgulanmış olarak kaynak kodunun dökümüdür.

Yürütme yolları vurgulanmış kaynak kodu

*Ana döngü, oyun alanının sağ tarafına sarılarak sağdan sola doğru yürütülmeye başlar. Burası stdin'in ilk karakterini okuduğumuz ve bir EOF olup olmadığını sonlandırdığımız yerdir.
*Sonraki bölüm, herhangi bir EOF karakterinin formül kullanılarak boşluklara dönüştürülmesini sağlar c = c + 31*!(c+1). Bu, ilk yinelemede geçerli olmasa da, sonraki geçişlerde ortaya çıkabilir.
*Karakterin bir kopyası geçici belleğe kaydedilir ve daha sonra *, karakterin çıktısının alınıp alınmayacağını belirlemek için dördüncü satırdaki tabloda geçerli dizinin aranması gerçekleştirilir .
*Karakterin çıktısının alınması gerekiyorsa, sol dalı alırız. Daha sonra gerçekleşecek olan takas işlemini iptal etmek için burada bir takas yapılır ve ardından dalı sağa zorlamak için bir sıfır itilir.
*Karakter çıktı alınmamışsa, indeks sayacının altındaki yığını aşağı kaydırırız (bu sol dalda iptal edilen takastır). Ve her iki durumda da karakteri geçerli dizin ofsetinde belleğe kaydeder, dizini artırır ve 13'ten büyük olup olmadığını kontrol
*ederiz . Değilse, stdin'den sonraki karakteri okur ve iç döngüyü tekrarlarız.
*Eğer öyleyse, 7 çıktı ( abgjklm) ve 7 yığın ( cdefhin) üzerinde kalan 14 karakterlik bir set bitirmiş oluruz . Biz bırakın son iki çıkış kalan 5 ( hfedc) ve ardından almak ve çıkış özel durumlar g, ive nbellekten.
*Bu da bizi ana döngünün başlangıcına geri götürüyor, burada işlemi sonraki 14 karakter için tekrarlıyoruz.


Güzel açıklama, aferin
MildlyMilquetoast

1

Mathematica, 77 72 bayt

5 bayt kazandığı için JungHwan Min'e teşekkürler!

Join@@Partition[#,14,14,{1,1}," "][[;;,LetterNumber@"abgjklmhfedcgin"]]&

Adsız işlev, karakter listesini giriş olarak alan ve karakter listesini döndüren. Partition[#,14,14,{1,1}," "]girişi, gerekirse boşluklarla doldurmak için 14 uzunluk alt listelerine böler. LetterNumber@"abgjklmhfedcgin"olarak değerlendirilir {1,2,7,10,11,12,13,8,6,5,4,3,7,9,14}, bu da her uzunluk-14 alt listesini alma sırasını gösterir (7. öğeyi uygun şekilde tekrarlayarak). Sonra [[;;,...]]tüm uzunluk 14 alt listelerinin öğelerini bu sırayla alır ve Join@@cevapları birleştirir.

Önceki gönderim:

Join@@Partition[#,14,14,{1,1}," "][[All,83224017339955102~IntegerDigits~16]]&

1
LetterNumber@"abgjklmhfedcgin"listeyi sıkıştırmanın daha kısa bir yoludur. Ayrıca bayt ;;yerine Allkaydeder.
JungHwan Min

Harika öneriler!
Greg Martin


0

PHP, 94 bayt

foreach(str_split($argv[1],14)as$s)for($i=0;$c=abgjklmhfedcgin[$i++];)echo$s[ord($c)-97]??" ";

komut satırı bağımsız değişkenini 14 baytlık parçalara böler ve çeviri dizesinde alt dizenin dizini olarak döngüler. İle çalıştırın php -nr '<code>' <string>.

Ben ??de boş dize ("geçersiz" dizin için) null olarak kabul bulmak sevindim .


0

Ruby, 83 bayt

->s{v="";(s+" "*13).scan(/.{14}/){|y|"0169:;<7543268=".chars{|o|v+=y[o.ord-48]}};v}

İlk fikir onaltılık sayılar kullanmaktı, ancak ord-48 başka bir bayt kurtardı (throx cevabından çalındı).

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.