Làm sáng tỏ một chuỗi


11

Sandbox đăng ở đây .

Tạo một hàm hoặc chương trình "Springifying" một chuỗi.

  • Đầu vào sẽ là một chuỗi trong Stdin hoặc thay thế gần nhất
  • Đầu vào sẽ chỉ chứa ASCII có thể in và / hoặc dấu cách
  • Đầu ra sẽ là Stdout, hoặc thay thế gần nhất
  • Một dòng mới và dấu cách được chấp nhận

Làm thế nào để lò xo chuỗi

  1. Định dạng Chuỗi thành nhiều cuộn lò xo ASCII nếu cần
  2. Đệm các cuộn dây có khoảng trắng, lên đến cuộn gần nhất
  3. Đọc các ký tự, theo mùa xuân xung quanh cuộn dây

Đây là một cuộn lò xo ASCII:

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

Trong đó #s là ký tự của Chuỗi

Đây là một ví dụ:

abcdefghijklmnopqrstuvwxyz

trở thành

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

Trường hợp .s thay thế không gian cho tầm nhìn.

Sau đó, chuỗi được đọc trở lại, theo lò xo ASCII trở xuống, xung quanh các vòng, nhấn guhai lần:

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

... cho:

abgjklmhfedcginopuxyz vtsrquw (có dấu cách)

Các trường hợp thử nghiệm

(trích dẫn được thêm vào để làm nổi bật không gian dấu - vui lòng bỏ qua về IO)

I: "abcdefghijklmnopqrstuvwxyz"
O: "abgjklmhfedcginopuxyz vtsrquw "

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

I: ""
O: ""

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

I: " "
O: "               "

Lưu ý rằng chiều dài đầu ra luôn là bội số của 15, chiều dài của cuộn lò xo

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


Tôi cảm thấy như sẽ có nhiều thách thức hơn khi đi theo mô hình dọc theo cuộn dây.
Bạch tuộc ma thuật Urn

@carusocomputing bạn có nghĩa là nghịch đảo?
MildlyMilquetoast

codegolf.stackexchange.com/a/107531/59376 hóa ra tôi không hiểu thử thách như đã viết, đó chính xác là thử thách ahaha.
Bạch tuộc ma thuật Urn

Câu trả lời:


2

Thạch , 26 byte

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

Dùng thử trực tuyến!

Làm sao?

“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

Python 2, 104 102 98 byte

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

Cảm ơn đã giúp đỡ bình luận!

https://tio.run/#2VDVy

Nguyên:

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

Bạn chỉ có thể sử dụng input()và lấy đầu vào ở định dạng "<stuff>".
HyperNeutrino

Golf đầu tiên tuyệt vời! Như Alex L. chỉ ra, chúng tôi cho phép đầu vào được trích dẫn. Bạn cũng có thể sử dụng một lambdađể cung cấp một chức năng ẩn danh thay vì một chương trình - điều này thường ngắn hơn .
xnor

Thất bại cho trường hợp kiểm tra chuỗi rỗng với IndexError. Tôi nghĩ rằng bạn có thể cần phải thay đổi 13 thành 14 và bật ra giá trị cuối cùng (giống như câu trả lời Jelly của tôi).
Jonathan Allan

... thay đổi +13để +14+1để +(len(t)%14>0)sẽ làm điều đó, nhưng phải có một cách ngắn hơn.
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>

Chuỗi thập lục phân bị đánh cắp một cách đáng xấu hổ từ @ETHproductions.


@ETHproductions Cảm ơn, đã sửa.
Neil

Thật tuyệt vời!
Hristiyan Dodov

Thật tuyệt khi đoạn trích cho phép bạn xem kết quả khi bạn nhập nó
MildlyMilquetoast


2

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

Cảm ơn ETHSản phẩm đã tiết kiệm 10B!

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

Thí dụ

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

Đầu ra

abgjklmhfedcginopuxyz vtsrquw 

Rất đẹp. Bạn có thể lưu một số byte bằng cách chuyển đổi mảng thành chuỗi thập lục phân và sử dụng +('0x'+whatever)để chuyển đổi nó thành một số:(_,c)=>b[(c/15|0)*14+ +('0x'+'0169abc7543268d'[c%15])]
Sản phẩm ETH

Khéo léo thông minh. Tôi đã nghĩ đến những cách khác để viết mảng, nhưng tôi không thể nghĩ ra cách nào. Tôi vẫn có thể rút ngắn điều đó, bằng cách đặt số thập lục phân trước và sau đó là phép nhân, làm cho không gian không cần thiết.
Lu-ca

Bạn thậm chí có thể làm '0x'+'...'[c%15]-0+(c/15|0)*14để tiết kiệm cho mình một cặp dấu ngoặc đơn :-)
Sản phẩm ETH

Bạn đúng. Thêm.
Lu-ca

2

Perl 6 , 61 byte

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

Làm thế nào nó hoạt động

Cấu trúc cơ bản là thế này:

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

Biểu thức được sử dụng để lập chỉ mục vào mỗi phân đoạn 14 ký tự "abgjklmhfedcgin".ords X- 97, hoạt động như sau:

  1. Lấy chuỗi mã hóa cứng abgjklmhfedcgin.
  2. Lấy mật mã của nó : 97 98 103 106 107 108 109 104 102 101 100 99 103 105 110.
  3. Trừ 97 từ mỗi số : 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//" "}

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Cấu trúc cơ bản là thế này:

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

Các chỉ số tương tự như trên, nhưng vì .flatdù sao chúng ta cũng đang gọi , nên chúng ta có thể sử dụng biểu thức lồng nhau (nhưng ngắn hơn 1 byte) cho chúng : 0,1,6,9..12,7,5...2,6,8,13.

(Trông có vẻ tầm thường, nhưng thực sự dựa vào đặc thù phân tích cú pháp của Rakudo Perl 6 có lẽ là một lỗi . Để viết nó mà không khai thác lỗi đó, người ta sẽ phải thêm parens xung quanh 5...2.)


2

Befunge-93, 97 byte

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

Hãy thử trực tuyến!

Đây là một sự cố của mã nguồn với các phần thành phần khác nhau được tô sáng.

Mã nguồn với các đường dẫn thực thi được tô sáng

*Vòng lặp chính bắt đầu thực hiện từ phải sang trái, quấn quanh phía bên phải của sân chơi. Đây là nơi chúng ta đọc ký tự đầu tiên từ stdin và chấm dứt nếu đó là EOF.
*Phần tiếp theo đảm bảo mọi ký tự EOF được chuyển đổi thành khoảng trắng bằng công thức c = c + 31*!(c+1). Mặc dù điều này sẽ không áp dụng cho lần lặp đầu tiên, nhưng nó có thể xảy ra ở các lần tiếp theo.
*Một bản sao của ký tự được lưu vào bộ nhớ tạm thời, và sau đó việc tra cứu chỉ mục hiện tại được thực hiện trên bảng trên dòng bốn ( *) để xác định xem ký tự có nên xuất ra hay không.
*Nếu nhân vật cần được xuất ra, chúng ta lấy nhánh bên trái. Một trao đổi được thực hiện ở đây để hủy bỏ trao đổi sẽ xảy ra tiếp theo, và sau đó một số 0 được đẩy để buộc chi nhánh phải.
*Nếu ký tự không xuất ra, chúng ta trao đổi nó xuống ngăn xếp bên dưới bộ đếm chỉ mục (đây là trao đổi bị hủy ở nhánh bên trái). Và trong cả hai trường hợp, chúng ta lưu ký tự vào bộ nhớ ở phần bù chỉ số hiện tại, tăng chỉ số và kiểm tra xem nó có lớn hơn 13.
*Nếu không, chúng ta đọc ký tự tiếp theo từ stdin và lặp lại vòng lặp bên trong.
*Nếu đúng như vậy, chúng ta sẽ hoàn thành một bộ gồm 14 ký tự, 7 ký tự đầu ra ( abgjklm) và 7 ký tự còn lại trên ngăn xếp ( cdefhin). Chúng tôi thả người cuối cùng hai, sản lượng còn lại 5 ( hfedc), và sau đó lấy ra và những trường hợp đặc biệt g, intừ bộ nhớ.
*Và điều đó đưa chúng ta trở lại điểm bắt đầu của vòng lặp chính, nơi chúng ta lặp lại quá trình một lần nữa cho 14 ký tự tiếp theo.


Giải thích hay, thực hiện tốt
MildlyMilquetoast

1

Toán học, 77 72 byte

Cảm ơn JungHwan Min vì đã tiết kiệm 5 byte!

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

Hàm không tên lấy danh sách các ký tự làm đầu vào và trả về danh sách các ký tự. Partition[#,14,14,{1,1}," "]chia đầu vào thành các danh sách con có độ dài 14, đệm với khoảng trắng nếu cần. LetterNumber@"abgjklmhfedcgin"ước tính {1,2,7,10,11,12,13,8,6,5,4,3,7,9,14}, trong đó chỉ ra thứ tự đưa từng danh sách con có độ dài 14 vào (lặp lại phần tử thứ 7 một cách thích hợp). Sau đó [[;;,...]]lấy các yếu tố của tất cả các danh sách con dài 14 theo thứ tự đó và Join@@kết hợp các câu trả lời lại với nhau.

Trình trước:

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

1
LetterNumber@"abgjklmhfedcgin"là một cách ngắn hơn để nén danh sách. Ngoài ra ;;thay vì Alltiết kiệm một byte.
JungHwan Min

Gợi ý tuyệt vời!
Greg Martin


0

PHP, 94 byte

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

chia đối số dòng lệnh thành các đoạn 14 byte và các vòng lặp thông qua chuỗi dịch làm chỉ mục cho chuỗi con. Chạy với php -nr '<code>' <string>.

Tôi rất vui khi biết rằng ??cũng chấp nhận chuỗi rỗng (đối với chỉ mục "không hợp lệ") là null.


0

Ruby, 83 byte

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

Ý tưởng đầu tiên là sử dụng số hex, nhưng ord-48 lưu một byte khác (bị đánh cắp từ câu trả lời của throx).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.