Springify a String

11

Posting kotak pasir di sini .

Buat fungsi atau program yang "Springify" string.

  • Input akan berupa String di Stdin, atau alternatif terdekat
  • Input hanya akan berisi ASCII dan / atau spasi yang dapat dicetak
  • Output akan ke Stdout, atau alternatif terdekat
  • Newline dan spasi tambahan dapat diterima

Bagaimana cara membuat String

  1. Memformat String menjadi gulungan pegas ASCII sebanyak yang diperlukan
  2. Pad kumparan dengan spasi, hingga kumparan terdekat
  3. Bacakan karakter, mengikuti pegas di sekitar gulungan

Ini adalah pegas ASCII:

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

Di mana #s adalah karakter dari String

Berikut ini sebuah contoh:

abcdefghijklmnopqrstuvwxyz

menjadi

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

Di mana .s mengganti ruang untuk visibilitas.

Kemudian, string dibaca kembali, mengikuti pegas ASCII ke bawah, di sekitar loop, memukul gdan udua kali:

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

...memberi:

abgjklmhfedcginopuxyz vtsrquw (dengan ruang tambahan)

Uji Kasus

(kutipan ditambahkan untuk menyoroti spasi tambahan - harap diabaikan dalam hal IO)

I: "abcdefghijklmnopqrstuvwxyz"
O: "abgjklmhfedcginopuxyz vtsrquw "

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

I: ""
O: ""

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

I: " "
O: "               "

Perhatikan bahwa panjang output selalu kelipatan 15, panjang pegas

Ini adalah , jadi jawaban tersingkat dalam byte menang.

MildlyMilquetoast
sumber
Saya merasa akan lebih sulit untuk mengikuti pola di sepanjang kumparan.
Guci Gurita Ajaib
@caruscomputing maksud Anda terbalik?
MildlyMilquetoast
codegolf.stackexchange.com/a/107531/59376 ternyata saya tidak mengerti tantangan seperti yang ditulis, itulah tantangannya ahaha.
Guci Gurita Ajaib

Jawaban:

2

Jelly , 26 byte

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

TryItOnline!

Bagaimana?

“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
Jonathan Allan
sumber
5

Python 2, 104 102 98 Bytes

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

Terima kasih atas bantuan komentarnya!

https://tio.run/#2VDVy

Asli:

t=raw_input()+' '*13
print''.join(t[ord(x)-97+y*14]for y in range(len(t)/14)for x in'abgjklmhfedcgin')
tenggorokan
sumber
Anda cukup menggunakan input()dan mengambil input dalam format "<stuff>".
HyperNeutrino
Golf pertama yang hebat! Seperti yang ditunjukkan Alex L., kami mengizinkan input diambil dalam tanda kutip. Anda juga dapat menggunakan a lambdauntuk memberikan fungsi anonim daripada program - ini seringkali lebih pendek .
xnor
Gagal untuk test case string kosong dengan IndexError. Saya pikir Anda mungkin perlu mengubah 13 hingga 14 dan menghapus nilai akhir (seperti jawaban Jelly saya).
Jonathan Allan
... mengubah +13ke +14dan +1ke +(len(t)%14>0)akan melakukannya, tetapi harus ada cara yang lebih pendek.
Jonathan Allan
3

JavaScript (ES6), 79 byte

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>

String heksadesimal tanpa malu-malu dicuri dari @ETHproduksi.

Neil
sumber
@ ETHproduk Terima kasih, sudah diperbaiki.
Neil
Itu brilian!
dodov
Sangat menyenangkan bagaimana cuplikan memungkinkan Anda melihat hasilnya saat Anda mengetiknya
MildlyMilquetoast
2

Retina , 71 byte

$
13$* 
M!`.{14}|$
(.)(.)(.)(.)(.)(.)(.)(....)(.)¶
$5$8$6$4$3$2$1$5$7$9

Cobalah online!

Membubuhkan string tidak persis ringkas di Retina ...

Martin Ender
sumber
2

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

Berkat ETHProduk untuk menghemat 10B!

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

Contoh

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

Keluaran

abgjklmhfedcginopuxyz vtsrquw 
Luke
sumber
Sangat bagus. Anda dapat menyimpan beberapa byte dengan mengubah array menjadi string heksadesimal, dan menggunakannya +('0x'+whatever)untuk mengubahnya menjadi angka:(_,c)=>b[(c/15|0)*14+ +('0x'+'0169abc7543268d'[c%15])]
ETHproduksi
Trik cerdas. Saya sudah memikirkan cara-cara lain untuk menulis array, tetapi saya tidak bisa memunculkannya. Saya masih bisa mempersingkat itu, dengan menempatkan angka heksadesimal pertama dan kemudian perkalian, membuat ruang tidak perlu.
Luke
Anda bahkan dapat melakukannya '0x'+'...'[c%15]-0+(c/15|0)*14untuk menyelamatkan diri Anda dari sepasang tanda kurung :-)
ETHproduk
Kamu benar. Ditambahkan.
Luke
2

Perl 6 , 61 byte

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

Bagaimana itu bekerja

Struktur dasarnya adalah ini:

{                                  }  # 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.

Ekspresi yang digunakan untuk mengindeks ke dalam setiap segmen 14 karakter adalah "abgjklmhfedcgin".ords X- 97, yang berfungsi sebagai berikut:

  1. Ambil string yang dikodekan keras abgjklmhfedcgin.
  2. Dapatkan codepoints nya: 97 98 103 106 107 108 109 104 102 101 100 99 103 105 110.
  3. Kurangi 97 dari setiap nomor: 0 1 6 9 10 11 12 7 5 4 3 2 6 8 13.

Perl 6 , 64 byte

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

Cobalah online!

Bagaimana itu bekerja

Struktur dasarnya adalah ini:

{                                    }  # 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.

Indeks yang sama seperti di atas, tapi karena kita panggil .flatpula, kita bisa menggunakan bersarang ekspresi (tapi 1 byte lebih pendek) untuk mereka: 0,1,6,9..12,7,5...2,6,8,13.

(Terlihat sepele, tetapi sebenarnya mengandalkan kekhasan parsing dari Rakudo Perl 6 yang mungkin merupakan bug . Untuk menulisnya tanpa mengeksploitasi bug itu, orang harus menambahkan parens di sekitar 5...2.)

seseorang
sumber
2

Befunge-93, 97 byte

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

Cobalah online!

Ini adalah rincian kode sumber dengan berbagai bagian komponen disorot.

Kode sumber dengan jalur eksekusi disorot

*Loop utama dimulai dari mengeksekusi kanan ke kiri, membungkus di sebelah kanan playfield. Di sinilah kita membaca karakter pertama dari stdin, dan mengakhiri jika itu EOF.
*Bagian selanjutnya memastikan setiap karakter EOF dikonversi ke spasi menggunakan rumus c = c + 31*!(c+1). Meskipun ini tidak akan berlaku pada iterasi pertama, itu bisa terjadi pada lintasan berikutnya.
*Salinan karakter disimpan ke memori sementara, dan kemudian pencarian indeks saat ini dilakukan pada tabel di baris empat ( *) untuk menentukan apakah karakter tersebut akan dihasilkan atau tidak.
*Jika karakter perlu di-output, kita ambil cabang kiri. Swap dilakukan di sini untuk membatalkan swap yang akan terjadi selanjutnya, dan kemudian nol didorong untuk memaksa cabang kanan.
*Jika karakter tidak dihasilkan, kami menukarnya dengan tumpukan di bawah penghitung indeks (ini adalah swap yang dibatalkan di cabang kiri). Dan dalam kedua kasus kami menyimpan karakter ke memori pada offset indeks saat ini, menambah indeks, dan memeriksa apakah itu lebih besar dari 13.
*Jika tidak, kami membaca karakter berikutnya dari stdin dan ulangi loop dalam.
*Jika ya, kita akan menyelesaikan set 14 karakter, 7 telah menjadi output ( abgjklm), dan 7 tersisa di stack ( cdefhin). Kami menjatuhkan dua yang terakhir, mengeluarkan 5 sisanya ( hfedc), dan kemudian mengambil dan mengeluarkan kasing khusus g, dari memori. Dan itu membawa kita kembali ke awal dari loop utama, di mana kita mengulangi proses itu lagi untuk 14 karakter berikutnya.i dan n
*

James Holderness
sumber
Penjelasan yang bagus, bagus sekali
MildlyMilquetoast
1

Mathematica, 77 72 byte

Terima kasih kepada JungHwan Min karena telah menghemat 5 byte!

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

Fungsi yang tidak disebutkan namanya mengambil daftar karakter sebagai input dan mengembalikan daftar karakter. Partition[#,14,14,{1,1}," "]pisahkan input menjadi daftar panjang 14, padding dengan spasi jika perlu. LetterNumber@"abgjklmhfedcgin"mengevaluasi ke{1,2,7,10,11,12,13,8,6,5,4,3,7,9,14} , yang menunjukkan urutan untuk mengambil setiap panjang-14 sublist (mengulangi elemen ke-7 dengan tepat). Kemudian [[;;,...]]ambil elemen-elemen dari semua panjang-14 sublists dalam urutan itu, dan Join@@gabungkan jawaban bersama-sama.

Pengajuan sebelumnya:

Join@@Partition[#,14,14,{1,1}," "][[All,83224017339955102~IntegerDigits~16]]&
Greg Martin
sumber
1
LetterNumber@"abgjklmhfedcgin"adalah cara yang lebih singkat untuk mengompres daftar. Juga ;;bukannya Allmenyimpan byte.
JungHwan Min
Saran bagus!
Greg Martin
1

Python 3 , 86 byte

lambda s:''.join(t[i%14]for t in zip(*[iter(s+' '*13)]*14)for i in b'Tq>]zQ|1/X;:L$o')

Cobalah online!

Sebagai bonus, string Tq>]zQ|1/X;:L$oadalah program CJam yang valid yang mencetak karakter unik pada input standar, diurutkan. Cobalah online! (+ penjelasan)

Lynn
sumber
0

PHP, 94 byte

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

Membagi argumen baris perintah menjadi 14-byte potongan dan loop melalui string terjemahan sebagai indeks untuk sub-string. Jalankan denganphp -nr '<code>' <string> .

Saya senang mengetahui bahwa itu ??juga menerima string kosong (untuk indeks "tidak valid") sebagai nol.

Titus
sumber
0

Ruby, 83 byte

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

Ide pertama menggunakan nomor hex, tetapi ord-48 menyimpan byte lain (dicuri dari jawaban throx).

GB
sumber