単語をアルファベットグリッドに合わせる


55

今日見たミームに触発されました。

チャレンジの説明

無限のアルファベットグリッドを考えてみましょう。

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
...

CODEGOLFこの例では)単語を取り、それをグリッドのサブシーケンスにし、未使用の文字をスペースに置き換え、無限グリッドの最後の文字をすべて削除します。

  C           O           
   DE G       O           
           L              
     F

STACKEXCHANGE

                  ST      
A C       K               
    E                  X  
  C    H                  
A            N            
      G                   
    E

ZYXWVUTSRQPONMLKJIHGFEDCBA

                         Z
                        Y 
                       X  
                      W   
                     V    
                    U     
                   T      
                  S       
                 R        
                Q         
               P          
              O           
             N            
            M             
           L              
          K               
         J                
        I                 
       H                  
      G                   
     F                    
    E                     
   D                      
  C                       
 B                        
A

F

     F

ANTIDISESTABLISHMENTARIANISM

A            N     T      
        I                 
   D    I         S       
    E             ST      
AB         L              
        I         S       
       H    M             
    E        N     T      
A                R        
        I                 
A            N            
        I         S       
            M

ノート

  • 末尾の空白は許可されます。
  • 最後の行にスペースを埋め込む必要はありません。たとえば、入力がの場合、23個の末尾スペースなしでABC出力ABCできます。
  • 入力が[A-Z]+正規表現に一致すると仮定することができます。
  • または、小文字のアルファベットを使用できます[a-z]+。この場合、出力はに一致します。
  • 行を区切るには改行(\n\r\nまたは同等のもの)を使用する必要があります。つまり、文字列のリストは適切な出力形式ではありません。
  • これは課題なので、コードをできるだけ短くしてください。

主要な改行は許可されていますか?
エリックアウトゴルファー

@EriktheOutgolfer確かに、グリッド構造を混乱させない限り。
shooqie

致命的でないエラーがプログラムを停止させても大丈夫でしょうか?
ザカリー

@Zacharýそれがどのようにいくつかのバイトを節約できるかを見ることができますが、私はそれがいと思い、望ましくない、不必要な出力を生成します。だから 編集:終了コードまたは例外スタックトレースまたはstderrに類似した何かを出力しないものを使用して、プログラムを致命的に終了させない限り。
shooqie

7
推奨されるテストケース:(BALLOON同じ2つの隣接する文字)。
ケビンCruijssen

回答:


10

、15バイト

TṪS`?' €…"AZ"ġ>

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

説明

TṪS`?' €…"AZ"ġ>  Implicit input, e.g. "HELLO"
             ġ>  Split into strictly increasing substrings: x = ["H","EL","LO"]
        …"AZ"    The uppercase alphabet (technically, the string "AZ" rangified).
 Ṫ               Outer product of the alphabet and x
  S`?' €         using this function:
                   Arguments: character, say c = 'L', and string, say s = "EL".
       €           1-based index of c in s, or 0 if not found: 2
  S`?'             If this is truthy, then c, else a space: 'L'
                 This gives, for each letter c of the alphabet,
                 a string of the same length as x,
                 containing c for those substrings that contain c,
                 and a space for others.
T                Transpose, implicitly print separated by newlines.

7

Java 10、161 159 152バイト

s->{var x="";int p=0;for(var c:s)x+=p<(p=c)?c:";"+c;for(var y:x.split(";"))System.out.println("ABCDEFGHIJKLMNOPQRSTUVWXYZ".replaceAll("[^"+y+"]"," "));}

@Nevayのおかげで-2バイト。
文字列を返し、Java 10に変換する代わりに、-7バイトを直接印刷する。

説明: "

ここで試してみてください。

s->{                      // Method with String parameter and no return-type
  var x="";               //  Temp-String
  int p=0;                //  Previous character (as integer), starting at 0
  for(var c:s)            //  Loop (1) over the characters of the input
    x+=p<(p=c)?           //   If the current character is later in the alphabet
                          //   (replace previous `p` with current `c` afterwards)
        c                 //    Append the current character to Temp-String `x`
       :                  //   Else:
        ";"+c;            //    Append a delimiter ";" + this character to Temp-String `x`
  for(var y:x.split(";")) //  Loop (2) over the String-parts
    System.out.println(   //   Print, with trailing new-line:
     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                          //    Take the alphabet,
        .replaceAll("[^"+y+"]"," "));}
                          //    and replace all letters not in the String-part with a space

メソッドの最初の部分は、入力ワードを区切り文字付きの部分に分割します。
例:CODEGOLFCO;DEGO;L;FまたはBALLOONB;AL;LO;O;N

2番目の部分はこれらの部分をループし、正規表現[^...]を使用して、スペースと一致しないすべてのものを置き換えます。
たとえば、とを.replaceAll("[^CO]"," ")残し、他のすべてをスペースに置き換えます。CO


1
そうではないでしょうB;AL;LO;O;Nか?
NieDzejkob

1
-2バイト:for(char c:s)x+=p<(p=c)?c:";"+c;
ネヴァイ




4

JavaScript(ES6)、79

編集主要な改行が受け入れられると、2バイト節約できます

s=>eval("for(o='',v=i=0;c=s.charCodeAt(i);v%=27)o+=v++?c-63-v?' ':s[i++]:`\n`")

1バイト以上の場合、小文字または大文字の入力を受け入れることができます。

s=>eval("for(o='',v=i=0;c=s[i];v%=27)o+=v++?parseInt(c,36)-8-v?' ':s[i++]:`\n`")

少ないゴルフ

s=>{
  var i,o,c,v
  for(o = '', v = 1, i = 0; c = s.charCodeAt(i); v %= 27)
    o += v++ ? c-63-v ? ' ' : s[i++] : '\n'
  return o
}  

テスト

f=s=>eval("for(o='',v=i=0;c=s.charCodeAt(i);v%=27)o+=v++?c-63-v?' ':s[i++]:`\n`")

function update() {
  var i=I.value
  i=i.replace(/[^A-Z]/gi,'').toUpperCase()
  O.textContent=f(i)
}

update()
<input id=I value='BALLOON' oninput='update()' >
<pre id=O></pre>


\n-1バイトのバックティック内のリテラルの改行で置き換えることができます。
ジャスティンマリナー

無@JustinMariner私はできない、ではないevalの中に二重引用符の内側
edc65

ああ、それは残念だ。私の悪い。
ジャスティンマリナー

4

MATL24 23バイト

''jt8+t1)wdh26X\Ys(26e!

小文字を使用します。

MATL Online試しください

説明

''     % Push empty string
jt     % Push input string. Duplicate
8+     % Add 8 to each char (ASCII code). This transforms 'a' 105,
       % 'b' into 106, which modulo 26 correspond to 1, 2 etc
t1)    % Duplicate. Get first entry
wd     % Swap. COnsecutive differences.
h      % Concatenate horizontally
26X\   % 1-based modulo 26. This gives a result from 1 to 26
Ys     % Cumulative sum
(      % Write values (converted into chars) at specified positions
       % of the initially empty string
26e    % Reshape into a 26-row char matrix, padding with char 0
!      % Transpose. Implicitly display. Char 0 is shown as space

4

Japt18 16バイト

@Shaggyのおかげで-2バイト

;ò¨ £B®kX ?S:Z
·

大文字入力のみ。

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

説明

;

代替変数に切り替えBます。大文字はアルファベットです。

ò¨

入力文字列を、最初の文字が¨2番目の文字以上()の文字に分割します。

£

関数によって各パーティションをマップします。ここXで、は現在のパーティションです。

大文字のアルファベットの各文字をZ、現在の文字である以下にマップします。

kX

現在の文字から現在のパーティションのすべての文字を削除します。現在の文字が現在のパーティションに含まれている場合、空の文字列になります。

?S:Z

それが真実である場合(空の文字列Sではない場合)、スペース()を返します。そうでない場合、現在の文字を返します。

·

前の行の結果を改行で結合し、結果を印刷します。


以下のための10バイトのr"[^{Z}]"Sビットばかげているようだが、私はどちらか...任意のより良い方法を見つけることができません
ETHproductions



@Shaggy良い考えでkX
ジャスティンマリナー

実際に私はあなたが変えることができると思うkX ?S:ZoX ªS、2つのバイトを保存するために
ETHproductions


3

ゼリー、19バイト

<2\¬0;œṗfȯ⁶$¥€@€ØAY

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


OI<1®;-> >2\0;1バイトを節約するために(私も実際>2\0;œṗµØAf€ȯ€⁶µ€Yに18 でしたが、個人的には解析しやすいと思います)
ジョナサンアラン

@JonathanAllan私はそれがBALLOON何かに失敗すると思う。
エリックアウトゴルファー

あなたは正しいです、そうです-それは何かのような別のバイトを必要とするでしょう<2\1;¬; しかたがない。
ジョナサンアラン

@JonathanAllanとにかく、答えにあなたのアイデアを実装します...完了しました。
エリックアウトゴルファー

3

C(gcc)、91 63バイト

-28 ASCIIのみのおかげ

_;f(char*s){for(_=64;*s;)putchar(++_>90?_=64,10:*s^_?32:*s++);}

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


前:

i,j;f(char*s){while(s[i]){for(j=65;j<91;j++)s[i]==j?putchar(s[i++]):printf(" ");puts("");}}

はい、もっと短い解決策がありますが、これを書いた後に気づきました... オンラインで試してみてください!


82バイト、先頭の改行が許可されている場合は80
ASCIIのみ



3

Mathematica、101バイト

StringRiffle[
  Alphabet[]/.#->" "&/@
   (Except[#|##,_String]&@@@
     Split[Characters@#,#==1&@*Order]),"
",""]&

Split厳密に増加する文字シーケンスへの入力Order。隣接する文字をと比較します。の場合Order[x,y] == 1、アルファベットのxyにあるため、同じ行に表示できます。

文字のシーケンスごとにExcept、それらの文字の文字列に一致するパターンを作成します。#|##はの省略形ですAlternativesAlphabetパターンに一致するの文字をスペースに置き換えます。


中間ステップの図:

"codegolf";
Split[Characters@#,#==1&@*Order]  &@%
Except[#|##,_String]&@@@         #&@%
Alphabet[]/.#->" "&/@               %
{{"c", "o"}, {"d", "e", "g", "o"}, {"l"}, {"f"}}

{Except["c" | "c" | "o", _String], 
 Except["d" | "d" | "e" | "g" | "o", _String], 
 Except["l" | "l", _String],
 Except["f" | "f", _String]}

{{" "," ","c"," "," "," "," "," "," "," "," "," "," "," ","o"," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," ","d","e"," ","g"," "," "," "," "," "," "," ","o"," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," "," "," "," "," "," "," "," "," ","l"," "," "," "," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," "," "," ","f"," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "}}

2

Golfscript、22 21バイト

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

n組み込みの慎重な最終再定義のおかげで-1バイト。

{.n>{}{'
'\}if:n}%:n;

説明(わずかに異なるバージョン):

{.n>{}{"\n"\}if:n}%:n; # Full program
{                }%    # Go through every character in the string
 .n>         if        # If ASCII code is greater than previous...
                       # (n means newline by default, so 1st char guaranteed to fit)
    {}                 # Do nothing
      {"\n"\}          # Else, put newline before character
               :n      # Redefine n as the last used character
                   :n; # The stack contents are printed at end of execution
                       # Literally followed by the variable n, usually newline
                       # So because n is by now an ASCII code...
                       # ...redefine n as the new string, and empty the stack

2

網膜、80バイト

^
;¶
{`;.*
¶;ABCDEFGHIJKLMNOPQRSTUVWXYZ
¶¶
¶
)+`;(.*)(.)(.*¶)\2
$.1$* $2;$3
;.*

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

常に1つの先頭の改行があります。このコードでは、単語にアルファベットとマーカー(セミコロン)が多少不格好に追加されます。次に、マーカーを単語の最初の文字まで移動し、スペースに渡す他のすべての文字を変更します。また、単語の最初の文字も削除します。単語の最初の文字がマーカーの後になくなるまでこれを繰り返します。次に、そのマーカーとアルファベットの残りの部分をクリアし、新しい行に置き換え、アルファベットをマーカーに再び置き換えます。入力語が空になるまでこれを繰り返し、最後のアルファベットとマーカーをクリーンアップして、目的の出力を残します。


2

05AB1E、18バイト

ćIgµ¶?AvDyÊið?ë¼?ć

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

ć最後の要素が抽出された後、スタックに空の文字列/リストを残す05AB1E (抽出1)で問題が発生しました。このソリューションは、それがなければ1〜2バイト短くなります。

ćIgµ¶?AvDyÊið?ë¼?ć  Implicit input 
ć                   Extract the 1st char from the string
 Igµ                While counter != length of the string
    ¶?              Print a newline
      Av            For each letter of the lowercased alphabet
        DyÊ         Is the examined character different from the current letter?
           ið?      If true, then print a space

              ë¼?ć  Else increment the counter, print the letter and push
                    the next character of the string on the stack

実際にð,は、「スペースと改行を印刷する」という意味です。
エリックアウトゴルファー

あなたが正しい。実際に改行を印刷するようにコードを修正しました。
スコチネット

2

網膜130の 126バイト

$
¶A
{-2=`
$'
}T`RL`_o`.$
+`(?<=(.)*)((.).*¶(?<-1>.)*(?(1)(?!)).+\3.*$)
 $2
(?<=(.)*)((.).*¶(?<-1>.)*(?<-1>\3.*$))
¶$2
}`¶.*$

オンラインでお試しください!編集:@MartinEnderのアルファベットジェネレーターを使用して4バイトを保存しました。説明:

$
¶A
{-2=`
$'
}T`RL`_o`.$

アルファベットを追加します。

+`(?<=(.)*)((.).*¶(?<-1>.)*(?(1)(?!)).+\3.*$)
 $2

できるだけ多くの文字をアルファベットの位置に合わせます。

(?<=(.)*)((.).*¶(?<-1>.)*(?<-1>\3.*$))
¶$2

整列できなかった最初の文字の前に新しい行を開始します。

}`¶.*$

アルファベットを削除しますが、文字の位置がずれなくなるまですべてを繰り返します。


これは、後続の行の文字を揃えずに、1行のみを印刷するようです。
ジャスティンマリナー

@JustinMariner私の悪い、私は私の最後のゴルフでタイプミスをして、それを適切にチェックすることに失敗しました。
ニール

2

q / kdb +48 45バイト

解決:

-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:;

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

注: q / kdb +にはTIOがないため、このソリューションのK(oK)ポートへのリンクです。

例:

q)-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:"STACKEXCHANGE";
                  ST
A C       K
    E                  X
  C    H
A            N
      G
    E

q)-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:"BALLOON";
 B
A          L
           L  O
              O
             N

説明:

Qは右から左に解釈されます。ソリューションは2つの部分に分かれています。最初に、次の文字が現在以下の文字列を分割します。

"STACKEXCHANGE" -> "ST","ACK","EX","CH","AN","G","E"

次に、26個のブランクのストリングを取得し、入力がアルファベットで表示されるインデックスで入力を適用し、stdoutに出力します。

"__________________________" -> __________________ST______

壊す:

-1{@[26#" ";.Q.A?x;:;x]}each(0,where (<=':)x) cut x:; / ungolfed solution
-1                                                  ; / print to stdout, swallow return value
                                                  x:  / store input as variable x
                                              cut     / cut slices x at these indices
                            (               )         / do this together
                                     (<=':)x          / is current char less-or-equal (<=) than each previous (':)?
                               where                  / indices where this is true
                             0,                       / prepended with 0
                        each                          / take each item and apply function to it
  {                    }                              / lambda function with x as implicit input
   @[      ;      ; ; ]                               / apply[variable;indices;function;arguments]
     26#" "                                           / 26 take " " is "      "...
            .Q.A?x                                    / lookup x in the uppercase alphabet, returns indice(s)
                   :                                  / assignment
                     x                                / the input to apply to these indices

ノート:

  • prevをK4バージョンに置き換えて-3バイト

2

Powershell、70 63バイト

-7バイト、@ Veskahに感謝

$args|%{if($_-le$p){$x;rv x}
$x=("$x"|% *ht($_-65))+($p=$_)}
$x

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

説明:

飛び散った引数の各文字に対して:

  • 現在の文字のコードが前の文字のコード以下または同等()の場合、出力文字列$xとクリア$x値(Remove-Variableのrvエイリアス)。-le
  • スペースと現在の文字を追加し$x、保存し$xます。また、前の文字値を更新します。

最後に出力し$xます。


1
スプラッティングを使用した63バイト|% *htいくつかのバイトを節約するために使用しようとしましたが、それが壊れたように見えます。
ベスカ



1

JavaScript(ES6)、87バイト

f=([...s])=>s[0]?(g=i=>i>35?`
`+f(s):(i-parseInt(s[0],36)?" ":s.shift())+g(i+1))(10):""

大文字または小文字の入力を受け入れます。出力は入力の大文字と小文字を一致させます。

テスト


1

Haskell、81 74 73バイト

q@(w:y)!(x:z)|w==x=x:y!z|1<2=min ' 'x:q!z
x!_=x
a=['A'..'Z']++'\n':a
(!a)

Laikoniのおかげで1バイト節約できました

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

Haskell Hugsの最適化

  1. Hugsインタープリターを使用すると(!cycle$['A'..'Z']++"\n")、次の代わりに1バイトを節約できます(!cycle(['A'..'Z']++"\n"))が、GHCは前者を好みません(これは現在廃止されています。ライコニは既に1バイトを節約する方法でその行を書き直しました。)

  2. どうやら、抱擁もリストパターンマッチの周りに括弧を必要としないので、私は行くから、さらに2つのバイトを救うことができる:q@(w:y)!(x:z)q@(w:y)!x:z


でバイトを保存できますa=['A'..'Z']++'\n':a;(!a)。興味深いことに、Hugsは多少緩い規則を持っているようです。
ライコニ

@Laikoni私は今何ヶ月もHaskellを見ていますが、私を驚かせることはありません。a=...:aトリックが大好きです。ありがとう!
クリスチャンルパスク

これを知っているかどうかはわかりませんが、言及する価値があると思います。ここでHugsが異なる理由は、ghcよりもユーザー定義演算子の方が演算子の優先順位が低いためです。
小麦ウィザード

@WheatWizard知らなかった。GHCで得たエラーを考えると、これは理にかなっています。
クリスチャンルパスク



1

、15バイト

Fθ«J⌕αι⁺ⅉ‹⌕αιⅈι

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

 θ              Input string
F «             Loop over characters
     α     α    Uppercase letters predefined variable
      ι     ι   Current character
    ⌕     ⌕     Find index
             ⅈ  Current X co-ordinate
         ‹      Compare
        ⅉ       Current Y co-ordinate
       ⁺        Sum
   J            Jump to aboslute position
              ι Print current character


1

K(ngn / k)29 28バイト

{{x@x?`c$65+!26}'(&~>':x)_x}

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

{ } 引数付きの関数 x

>':x 各文字について、前の文字よりも大きいですか?

~ 否定する

& ここで(どのインデックスで)trueになりますか

( )_xxそれらのインデックスで切り取り、文字列のリストを返します

{ }' それらの各文字列について

`c$65+!26

英語のアルファベット

x?内の各文字の最初の出現のインデックスを見つけます。見つからない場合は(特別な「null」値)をx使用し0Nます

x@インデックスx付き インデックス0Nを返します" "ので、我々はからの手紙をした長さ26の文字列を取得x彼らのアルファベット位置にあるとし、他のすべては空白です


1

R129 117バイト

function(s){z={}
y=diff(x<-utf8ToInt(s)-64)
z[diffinv(y+26*(y<0))+x[1]]=LETTERS[x]
z[is.na(z)]=" "
write(z,1,26,,"")}

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

説明(変更なし):

function(s){
 z <- c()                  # initialize an empty vector
 x <- utf8ToInt(s)-64      # map to char code, map to range 1:26
 y <- diff(x)              # successive differences of x
 idx <- cumsum(c(          # indices into z: cumulative sum of:
    x[1],                  # first element of x
    ifelse(y<=0,y+26,y)))  # vectorized if: maps non-positive values to themselves + 26, positives to themselves
 z[idx] <- LETTERS[x]      # put letters at indices
 z[is.na(z)] <- " "        # replace NA with space
 write(z,"",26,,"")        # write z as a matrix to STDOUT ("") with 26 columns and empty separator.

1

R、95バイト

単語のカウンター位置にある文字に遭遇し、それ以外の場合はスペースを印刷する場合、カウンターを1ずつ進めながら、大文字のアルファベットを繰り返し実行します。

function(s)while(F>""){for(l in LETTERS)cat("if"((F=substr(s,T,T))==l,{T=T+1;l}," "));cat("
")}

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


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