Helloellolloloo Worldorldrldldd


50

入力した単語を取得し、その単語を最初の文字を除いた自分の後ろに追加し、すべての文字がなくなるまで繰り返しますプログラムを作成します。たとえば、catになりcatatt、にhelloなりhelloellollolooます。


英語のアルファベットの26文字のいずれかを入力します。スペースで区切られた複数の単語がある場合があり、変更はすべての単語に適用する必要があります。

出力
入力された単語で、各単語は最初の文字が欠落してから次の文字が欠落し、その後追加される文字がなくなるまで続きます。

その他の例:

ill eel 出力 illlll eelell

laser bat 出力 laserasersererr batatt

darth vader 出力 dartharthrththh vaderaderdererr

これはコードゴルフなので、最短のコードが勝ちます。

明確化:
入力または出力をリストとして扱うことができます。スペースの代わりに改行を使用して単語を区切ることができます。入力に末尾スペースを追加できます。


22
正直なところ、複数の言葉はちょっと面倒です。分割する必要があり、各単語に関数を適用してから再度結合します。また、スペースを手動で確認する必要がある多くのエソランにとっても非常に衰弱しています
ジョーキング

4
入力を単語のリストとして取得し、そのように出力できますか?
クインテック

4
どの長さの単語を処理する必要がありますか?
MickyT

5
(スペースではなく)出力内の単語で単語を区切っても問題ありませんか?
JayCe

10
1.新しい許容値(配列I / O、末尾スペースなど)で仕様を更新してください2.。それらを利用してバイトを節約できる場合は、既存のソリューションに通知してください。
シャギー

回答:


34

Japt -m6 3バイト

入力と出力は単語の配列です。

£sY

それを試してみてください


説明

        :For each word in the input array
£       :Map each letter at index Y
 sY     :  Slice the current word from index Y

1
それは本当にコンパクトです。いいね!
qazwsx

9
@qazwsx:今、50%以上コンパクトに!
シャギー

1
£UTF-8の2バイトではないですか?
Vi。

7
@Vi、ここではUTF-8を使用していません。
シャギー

36

brainfuck60 56バイト

,[>++++++++[-<----<++++>>]<[>>]<[[<]>.[[-]>[.>]<[<]>]],]

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

後続スペースが必要で、先行スペースを印刷します。これらは両方とも回避できますが、最終的には112バイトになります

説明

,[  Loop over each byte of input
  Tape: 32 w o r-32 d'
  >++++++++[-<----<++++>>]   Subtract 32 from the character and add 32 to the previous char
  Tape: 32 w o r d-32 0'
  <[>>]<   If the last character was a space
  Tape: 32 w o r d-32 0'
  or
  Tape: 32 w o r d' space-32
  [
    [<]>.   Move to the end of the word and print out the space
    [   Loop over each letter
      [-]    Remove the first letter (initially space)
      >[.>]  Print the rest of the word
      <[<]>  Move back to the first letter
    ]
    Tape: clear
  ]
,]  Get the next byte of input

21

Haskell、36 21バイト

map$concat.scanr(:)""

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

編集:新しいIO形式(スペースで区切られた単語ではなく単語のリスト)のため、-15バイト


に置き換えることでscanr (:) ""、5文字を削ることができtailsます。
フレリッヒラーベ

1
@FrerichRaabe:はい。ただしimport Data.List、スコアに17バイトを追加する必要があります。
nimi

18

Perl -p36 25 23バイト

s!\b|\S!$'=~s/ .*//r!eg

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

これは単一のregsubです。まず、すべての単語境界またはスペース以外の文字に一致します。

[][H][e][l][l][o] [][W][o][r][l][d]

これらの一致はそれぞれ、単語の残りの部分に置き換える必要があることに注意してください。

[→Hello][Hello][ello][llo][lo][o→] (...)

これは$'、一致後の文字列の一部を保存する特別な変数で実現できます。ただし、ネストされたregsubを適用する必要がありますs/ .*//。これにより$'、入力の残りの単語を削除するために、の最初のスペースを超えるすべてのものが削除されます。

2バイトの@nwellnhofに感謝します。


あなたは置き換えることができ[^ ]\S
nwellnhof


17

ゼリー、3バイト

ḊƬ€

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

K配列の入出力が許可されるようになったため、もうs は必要ありません。

ḊƬ€
  €   For each word:
Ḋ       Remove the first letter
 Ƭ      until there are none left.

私はあなたが必要だと思いますḊƬẎ)(またはḊƬF)、あなたが望むなら)。
エリックアウトゴルファー

@EriktheOutgolfer私はそうは思いません。各単語は、出力では個別の配列で表されます
-dylnan

1
配列がネストされており、それを許可するために質問に何も指定されていないため、あなたがそれを主張できるかどうかはわかりません。
エリックアウトゴルファー

15

APL(Dyalog)、19 9バイト

{⌽∊,\⌽⍵}¨

脳をジョギングしてくれた@ H.PWizに感謝

これは、APLのすべての文字列が文字配列であるため機能します。

{⌽∊,\⌽⍵}¨ 
        ¨ - for each string
      ⍵} - string argument - ex. "hello"
     ⌽ - reverse - "olleh"
   ,\ - scan magic - "o" "ol" "oll" "olle" "olleh"
  ∊ - enlist(join together) "oolollolleolleh"
{⌽ - reverse - "helloellolloloo"

TIO


15

JavaScript(ES6)、33バイト

@ShieruAsakotoのおかげで1バイト節約

I / O形式:単語の配列。

a=>a.map(g=w=>w&&w+g(w.slice(1)))

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


JavaScript(ES6)、35バイト

I / O形式:単語の配列。

a=>a.map(w=>w.replace(/./g,"$&$'"))

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


2
44:s=>s.replace(/\S+/g,g=s=>s&&s+g(s.slice(1)))
浅本しえる

1
今日は私の「何か新しいもの」をありがとう。$'(または$<backtick>)を知らなかった。
シャギー

13

R82 75 67バイト

write(sapply(x<-scan(,""),substring,1:(y=max(nchar(x))),y),1,y,,"")

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

JayCeのおかげで数バイト節約

出力を改行で区切ります。

このsapply(...)式は、適切なサブストリングのマトリックス/列ベクトルを生成し""、必要に応じて埋め込みます。write次に、行列の要素をy1行ごとに印刷し""ます。


4
眠そうな赤ちゃんを抱きながら、別のアプローチをしました。後で説明を追加します。
ジュゼッペ

2
単語の長さが制限されている場合、たとえば99文字または...substring,1:1e6,1e6)...
〜1e6の

2
単語を改行で区切ることができる場合:tio。私はコメントでこれを尋ねました。with @ MickyTのコメントで動作可能
JayCe

@JayCeは、MickyTの提案を組み込む前に67バイトになる可能性があります
ジュゼッペ

8

brainfuck94 93バイト

-[-[-<]>>+<]>-<<+[[[-]<,[->+>+<<]>[-<+>]>>[-<->>+<]<]<<[>>+<<[-]]<[<]>[[.>]<[<]>[-]>]>>>>.<<]

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

  • 保存された1バイトのおかげNitrodon -ゴルフ.[-]>[.>]<[<]>[.>]<[<]>[-]>

説明

[[[ (dynamic) tape layout: ... NUL STR ... STR CHR FLG BUF SPC NUL ... ]]]

load a 32 into SPC
-[-[-<]>>+<]>-

while FLG
<<+[

 read a word
 [
  clear FLG; read CHR
  [-]<,
  copy CHR to BUF (using FLG as a temporary)
  [->+>+<<]>[-<+>]
  subtract SPC from BUF and save SPC
  >>[-<->>+<]
  move tape layout one to the right
  <
 ]

 strip trailing space; set FLG to true
 << [>>+<<[-]]
 to STR's first character
 <[<]>
 print word in all reduced forms
 [
  [.>]<[<]>[-]>
 ]

 print SPC; move to FLG
 >>>>.<<
]

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

帰属

EsolangのBrainfuck定数コレクションは、初期のスペースロードに使用されました。


これは終了しないようです。それは意図したものですか?
ジョーキング

1
@JoKingはい。特定の実装では、テープの制限を超え、エラーで終了します。
ジョナサンフレッチ


6

Vim、47バイト(38キーストローク)

入力をVimバッファーの唯一の行として開始します。

:s/<Space>/\r/g<CR>ggqaywPlxqqb99@aj0q99@bgg99J

説明

これにより、各単語が独自の行に配置され、各行が繰り返されてから、すべてが再結合されます。単語が99文字を超える場合、または入力に99単語を超える場合は中断します。

  1. :s/<Space>/\r/g<CR> スペースを改行(\r)に置き換えます
  2. gg 最初の行の先頭にカーソルを置きます
  3. qaマクロ aの記録を開始します:
  4. qbマクロbの記録を開始します。
    • 99@aマクロ 99回実行します(文字数制限が導入されます)
    • j0 次の行の先頭にカーソルを置きます
    • qマクロbの記録を停止します
  5. 99@bマクロbを 99回実行します(単語の制限を導入します)
  6. gg カーソルを最初の行に配置します
  7. 99J 次の99行をスペースで結合します(単語の制限が再びあります)

さらに2バイト(2回のキーストローク)で、単語の制限を999に拡張できます。さらに4バイト、9999など。


6

6 4バイト

ジョナサンアラン(リストとして入力を取得)に感謝-2バイト!

moΣṫ

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

説明

入力を文字列のリストとして受け取り、次の関数をマップします。

Σṫ  -- example argument: "abc"
 ṫ  -- tails: ["abc","bc","c"]
Σ   -- concat: "abcbcc"

分割と結合はおそらく不要になりました。現在、このような仕様はコメントに記載されています。
ジョナサンアラン



5

16ビットx86アセンブリコード、24バイト

     47             inc    di
     B020           mov    al,20h
l1:  3806           cmp    [si],al
     7212           jb     l5 ;less means end of string
     7401           je     l2  ;equal means space was seen
     4F             dec    di ;overwrite extra space
l2:  E80300         call   l3
     46             inc    si ;move to next character in word
     75F1           jne    l1
l3:  56             push   si
l4:  3806           cmp    [si],al
     A4             movsb      ;copy character
     77FB           ja     l4  ;until either zero or space is seen
     5E             pop    si
l5:  C3             ret

si =ソース文字列へのポインター、di =出力バッファーへのポインターで呼び出します。
ソース文字列を終了するにはゼロバイトが必要です。
コードは16ビット、32ビット、または64ビットで同じです(si / diはesi / ediまたはrsi / rdiになります)。
32ビットコードは、拡張された呼び出しのために2バイト大きくなります。
64ビットコードは、rsi / rdiのinc / decがプレフィックスを引き付けるため、さらに3バイト大きくなります(ただし、32ビットメモリ空間内にあることがわかっている場合は、そのペナルティを回避するために、esi / ediを再度使用できます) 。


4

MATL18 16バイト

"@gXH"HX@Jh)]0&h

入力は単語のセル配列です。オンラインでお試しください!

説明

"         % Implicit input: cell array of strings. For each cell
  @g      %   Push content of current cell, that is, a word
  XH      %   Copy into clipboard H
  "       %   For each letter
    H     %     Push word
    X@    %     Push iteration index
    Jh)   %     Index from that until the end into current word
  ]       %   End
  0       %   Push 0. Will be cast to char. Char(0) is displayed as space
  &h      %   Concatenate horizontally all elements so far. Implicit display


4

C ++(clang)、174バイト

#include<map>
#include<string.h>
std::string r(std::string w){while(auto x=strchr(w.c_str(),32))return r(w.substr(0,x-w.c_str()))+" "+r(x+1);return w!=""?w+r(w.substr(1)):w;}

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

それは私の最初の提出であり、印刷する代わりに文字列を返すかどうかはわかりませんでした:)


2
PPCGへようこそ!はい、文字列を返すことは問題ありません。頑張ってね!
ジョーキング

不等式演算子の対称性を使用してスペースを削除し、バイトを節約return w!=""?できますreturn""!=w?
ジョナサンフレッチ


3

、14バイト

⪫E⪪S ⭆ι✂ιμLι¹ 

オンラインでお試しください!注:末尾のスペース。リンクは、コードの詳細バージョンです。説明:

   S            Input string
  ⪪             Split on spaces
 E              Map over each word
      ι         Current word
     ⭆          Map over each character and join
        ι       Current word
         μ      Current index
           ι    Current word
          L     Length
            ¹   Literal 1
       ✂        Slice
⪫               Join with spaces
                Implicitly print


3

ピップ -s、11バイト

J_@>,#_Mq^s

stdinからスペースで区切られた単語のリストを取得します。オンラインでお試しください!

説明

             s is space (implicit)
        q    Read a line of stdin
         ^s  Split it on spaces
       M     Map this lambda function to each word:
 _            The word...
  @>          sliced starting at index...
    ,#_       range(len(word))
              This creates len(word) slices ["word" "ord" "rd" "d"]
J             Join those into a single string
             The resulting list of modified words is printed; the -s flag uses space
             as the separator





3

K(oK)17 13バイト

{,/|:'|,\|x}'

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

プレフィックス匿名関数。入力は文字列のリストとみなされ、文字列は文字のリストです。

@streetsterに4バイトをありがとう。

どうやって:

{,/|:'|,\|x}' //Main function, argument x → ("ill";"eel")
            ' // For each element of the argument
         |x}  // Flip it. x → ("lli";"lee")
       ,\     // Concatenate each element, keeping intermediates. x → (("l";"ll";"lli");("l";"le";"lee")
      |       // Flip it again. x → (("lli";"ll";"l");("lee";"le";"l"))
   |:'        // Now flip each element. x → (("ill";"ll";"l");("eel";"el";"l"))
{,/           // Concatenation scan. x → ("illlll";"eelell")

あなたは私を見てみるも、リストを返すことができますOKソリューション
streetster

@streetsterああ、いいね。私はまだKを学習しているので、私のソリューションは私が望むほど短くもエレガントでもありません。ヘッドアップをありがとう!
J.サレ

リバースの前にフラット化すると、「リバース-それぞれ」を省略して10バイトに{|,/,\|x}'
減らす

3

Common Lisp、179バイト

(defun r(s)(cond((endp s)nil)((eql(first s)#\Space)(princ " ")(r(rest s)))(t(q s)(r(rest s)))))(defun q (l)(cond((eql(first l)#\Space)t)((endp l)t)(t(princ(first l))(q(rest l)))))

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

ゴルフをするのはこれが初めてです


こんにちは、PPCGへようこそ。空白を削除すると、29バイト節約できます
ジョナサンフレッチ

私はちょうどスペースなしで更新@Johnathan FRECHのおかげ
JRowan

4つの余分なスペースを逃したと思います。
ジョナサンフレッチ

また、あなたの提出物をさらにゴルフするcar代わりに、firstまたはcdrその代わりに使用することができrestます。
ジョナサンフレッチ

ナ、今はそれでいいです笑笑、多分病気で戻ってきて後でそれを台無しにします。Lispを学んでいるだけで、先生は車とcdrを決して使わないと言ったので、それをしている間は頭から外れていました
-JRowan

3

Lua、70バイト

for i=1,#arg do x=arg[i]for i=1,#x do io.write(x:sub(i))end print()end

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

説明

Luaの引数はarg、インデックス1から始まるテーブルに格納されます。単項演算子#はテーブルのサイズをs:sub(a,b)返し、関数はs整数aで区切られた文字列に基づいて部分文字列を返しますb。bが渡されない場合は、残りの文字列を返します。

改行を避けるためにio.write()代わりに使用print()する必要print()があり、反対の理由で最後に追加しました。

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