文字列をスプリング化する


11

サンドボックスの投稿はこちら

文字列を「スプリング化」する関数またはプログラムを作成します。

  • 入力は標準入力の文字列、または最も近い代替です
  • 入力には、印刷可能なASCIIやスペースのみが含まれます。
  • 出力は、標準出力または最も近い代替出力になります
  • 末尾の改行とスペースは許容されます

文字列をスプリング化する方法

  1. 必要な数のASCIIスプリングコイルに文字列をフォーマットします
  2. コイルをスペースで埋め、最も近いコイルまで
  3. コイルの周りのバネに続いて、文字を読みます

これはASCIIスプリングコイルです。

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

どこ#sが文字列の文字であります

以下に例を示します。

abcdefghijklmnopqrstuvwxyz

になる

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

.可視性のためにsがスペースを置き換える場所。

次に、ASCIIスプリングを下に、ループの周りに文字列を読み戻し、gとをu2回押します。

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

...与える:

abgjklmhfedcginopuxyz vtsrquw (末尾スペース付き)

テストケース

(末尾のスペースを強調するために引用符を追加しました-IOに関しては無視してください)

I: "abcdefghijklmnopqrstuvwxyz"
O: "abgjklmhfedcginopuxyz vtsrquw "

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

I: ""
O: ""

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

I: " "
O: "               "

出力長は常に15の倍数であることに注意してください。これは、スプリングコイルの長さです。

これはであるため、バイト単位の最短回答が優先されます。


コイルに沿ってパターンをたどるのははるかに難しいことでした。
魔法のタコUr

@carusocomputingあなたは逆を意味しますか?
MildlyMilquetoast

codegolf.stackexchange.com/a/107531/59376は、書かれているようにチャレンジを理解していなかったことがわかりました。それがまさにチャレンジです。
魔法のタコUr

回答:


2

ゼリー、26 バイト

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

TryItOnline!

どうやって?

“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

パイソン2、104 102の 98バイト

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

コメントのヘルプをありがとう!

https://tio.run/#2VDVy

元の:

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

あなただけinput()の形式で入力を使用することができます"<stuff>"
ハイパーニュートリノ

素晴らしい最初のゴルフ!Alex L.が指摘しているように、引用符で入力することができます。また、a lambdaを使用して、プログラムではなく匿名関数を指定することもできます。これは多くの場合より短いです。
XNOR

IndexErrorで空の文字列のテストケースに失敗します。13から14に変更し、最終値をポップする必要があるかもしれません(私のゼリーの答えのように)。
ジョナサンアラン

...変更+13する+14+1+(len(t)%14>0)それを行うだろうが、短い方法がなければなりません。
ジョナサンアラン

3

JavaScript(ES6)、79バイト

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から恥知らずに盗まれた16進文字列。


@ETHproductionsありがとう、修正。
ニール

そりゃ素晴らしい!
ドドフ

これは、スニペットは、あなたがそれを入力すると、その結果を見ることができますどのようにうれしいです
MildlyMilquetoast


2

JavaScript(ES7)、144 143 141 114 104 103バイト

10BセーブのETHProductionsに感謝します!

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

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

出力

abgjklmhfedcginopuxyz vtsrquw 

非常に素晴らしい。あなたは、16進文字列に配列を変換し、使用することによって、いくつかのバイトを保存することができます+('0x'+whatever)数に変換する:(_,c)=>b[(c/15|0)*14+ +('0x'+'0169abc7543268d'[c%15])]
ETHproductions

巧妙なトリック。私はすでに配列を書く他の方法を考えていましたが、私はそれを思い付くことができませんでした。16進数を最初に配置してから乗算を配置することで、スペースを不要にすることで、それをさらに短縮できます。
ルーク

'0x'+'...'[c%15]-0+(c/15|0)*14かっこを自分で保存することさえできます:
ETHproductions

あなたが正しい。追加。
ルーク

2

Perl 6、61バイト

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

使い方

基本的な構造は次のとおりです。

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

各14文字のセグメントにインデックスを付けるために使用される式は"abgjklmhfedcgin".ords X- 97、次のように機能します。

  1. ハードコードされた文字列を取得しますabgjklmhfedcgin
  2. コードポイントを取得します97 98 103 106 107 108 109 104 102 101 100 99 103 105 110
  3. 各番号から97を引きます0 1 6 9 10 11 12 7 5 4 3 2 6 8 13

Perl 6、64バイト

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

オンラインでお試しください!

使い方

基本的な構造は次のとおりです。

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

上記と同じインデックスですが、.flatとにかく呼び出しているため、ネストされた(ただし1バイト短い)式を使用できます0,1,6,9..12,7,5...2,6,8,13

(些細なように見えますが、実際にはおそらくバグであるRakudo Perl 6の構文解析特性に依存しています。そのバグを悪用せずに記述するには、5...2


2

Befunge-93、97バイト

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

オンラインでお試しください!

これは、さまざまなコンポーネントパーツが強調表示されたソースコードの内訳です。

実行パスが強調表示されたソースコード

*メインループは右から左への実行を開始し、プレイフィールドの右側に回り込みます。これは、stdinから最初の文字を読み取り、EOFの場合は終了する場所です。
*次のセクションでは、式を使用してEOF文字がスペースに変換されるようにしますc = c + 31*!(c+1)。これは最初の反復には適用されませんが、後続のパスで発生する可能性があります。
*文字のコピーが一時メモリに保存され、現在のインデックスのルックアップが4行目(*)のテーブルで実行され、文字を出力するかどうかが決定されます。
*文字を出力する必要がある場合は、左のブランチを使用します。ここでスワップが実行され、次に発生するスワップがキャンセルされます。その後、ゼロがプッシュされ、ブランチが右に強制的に移動されます。
*文字が出力されなかった場合、インデックスカウンターの下のスタックにスワップダウンします(これは左ブランチでキャンセルされるスワップです)。どちらの場合も、現在のインデックスオフセットで文字をメモリに保存し、インデックスをインクリメントし、13より大きいかどうかを確認します。
*そうでない場合は、stdinから次の文字を読み取り、内側のループを繰り返します。
*そうである場合、14文字のセットが終了します。7文字が出力され(abgjklm)、7文字がスタックに残ります(cdefhin)。私たちは、最後の二つをドロップアウトプット残り5( hfedc)した後、特殊なケースを取得し、出力giおよびnメモリから。
*そして、メインループの最初に戻り、次の14文字についてプロセスを繰り返します。


良い説明、よくやった
MildlyMilquetoast

1

Mathematica、77 72バイト

5バイト節約してくれたJungHwan Minに感謝します!

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

入力として文字のリストを取り、文字のリストを返す名前のない関数。Partition[#,14,14,{1,1}," "]入力を長さ14のサブリストに分割し、必要に応じてスペースを埋め込みます。LetterNumber@"abgjklmhfedcgin"は、に評価されます{1,2,7,10,11,12,13,8,6,5,4,3,7,9,14}。これは、長さ14の各サブリストを取り込む順序を示します(7番目の要素を適切に繰り返す)。次に[[;;,...]]、すべての長さ14のサブリストの要素をこの順序で取得しJoin@@、回答を結合します。

以前の提出:

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

1
LetterNumber@"abgjklmhfedcgin"リストを圧縮する短い方法です。また、バイト;;All保存する代わりに。
ジョンファンミン

素晴らしい提案!
グレッグマーティン


0

PHP、94バイト

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

コマンドライン引数を14バイトのチャンクに分割し、サブストリングのインデックスとして変換ストリングをループします。で実行しphp -nr '<code>' <string>ます。

??空の文字列( "無効な"インデックス)をnullとして受け入れることもわかりました。


0

Ruby、83バイト

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

最初のアイデアは16進数を使用することでしたが、ord-48は別のバイトを節約します(throxの答えから盗まれました)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.