でこぼこのひもを描く


26

この挑戦に触発された。)

stringがあるとしましょうABBCBA。私たちは、間に上昇があることを言うことができるABするために、B次のA。我々は、間に実行があることを言うことができるBB何が変わるため、。そして最後に、私たちは間に秋があると言うことができるCとはB。このようなグラフを描くことができます:

             A   B   B   C   B   A
Rising:        o       o
Continuing:        o
Falling:                   o   o

ラベルなしで、空白を最小化:

o o
 o
   oo

これは、inputの期待される出力ですABBCBA

o出力では、空白文字以外の文字を使用して置換できます。さらに、各列には、オプションで次のように余分なスペースがあります。

o   o
  o 
      o o

入力は少なくとも3文字で構成されます。文字列は完全に大文字で構成されますが、代わりに小文字を使用することもできます。

テストケース

TEST CASE
LINE 1
LINE 2
LINE 3

HELLOWORLD
 o oo o
  o
o    o oo

TESTCASE
 oo  o

o  oo o

EXAMINATION
o o o o o

 o o o o o

ZSILENTYOUTH
  o ooo o

oo o   o oo

ABC
oo



ABCBA
oo

  oo

連続する各osの間にスペースがありますか、または出力をコンパクトにする必要がありますか?
ジョンファンミン

@JHM確かに、それは結構です。
コナーオブライエン

また、出力は文字列である必要がありますか、それとも例に似ている必要がありますか?
ジョンファンミン

@JHMあなたは何を考えていますか?
コナーオブライエン

私が念頭に置いているコードは、グリッドを生成します。
ジョンファンミン

回答:


6

ゼリー、11 バイト

OIṠ“ o ”ṙZY

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

OIṠ“ o ”ṙZY  Main link. Argument: s (string)

O            Ordinal; replace all characters with their code points.
 I           Increments; compute the differences of consecutive code points.
  Ṡ          Sign function.
   “ o ”ṙ    Rotate that string -1, 0, or 1 unit(s) to the left.
         Z   Zip; transpose rows and columns.
          Y  Join, separating by linefeeds.

11

Mathematica、93 83 68 64バイト

(use 0、not O

Row[Column@Insert[{,},0,2-#]&/@Sign@Differences@LetterNumber@#]&

説明

LetterNumber@#

入力の各文字のアルファベットの位置を取得します。

Sign@Differences@

連続する各要素間の差を取り、符号を取ります(-1負/下降、00 /継続、1正/上昇)

Insert[{,},0,2-#]&

a 0を2つNullのsのリストに挿入します。上昇する場合は最初の位置に、継続する場合は中間に、下降する場合は3番目の位置に挿入します。

Row[Column@ ... ]

出力をフォーマットします。


出力が問題の出力と異なる場合、上記のコードは41バイトに短縮できます。

ListPlot@*Sign@*Differences@*LetterNumber

...これは次のようなものを作成します(「ABBCBA」の場合):

ここに画像の説明を入力してください


41バイトはどのように見えますか?
コナーオブライエン

@ ConorO'Brien編集をご覧ください。
ジョンファンミン

10

MATL15、14のバイト

dZSqtQtQv~79*c

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

説明:

彼らは写真は千の言葉の価値があると言っているので、ここではスタックの更新時に最新のスタックの価値を示すベータのオンライン通訳があります。まだベータ版であるため、複数回実行する必要がある場合があります。

したがって、最初に呼び出しますdZSdは、連続する各要素の差を示し、各要素ZSの符号(-1、0、または1)を示します。入力として「HELLOWORLD」を使用すると、最初のステップの後、次のようになります。

-1  1  0  1  1 -1  1 -1 -1

さて、qこれをデクリメントして取得するだけです:

-2  0 -1  0  0 -2  0 -2 -2

そして、2回スタックの最上部を複製し、配列をインクリメントします(tQ)この後、

-2  0 -1  0  0 -2  0 -2 -2
-1  1  0  1  1 -1  1 -1 -1
0   2  1  2  2  0  2  0  0

これで、すべての「0」が文字を出力する場所になりました。したがって、これらの3つの配列を行列に結合し(v)、論理的に否定します(~)。次に、マトリックス内のすべての値にASCII値 'O'(79*)を乗算し、で文字列として表示しcます。


ベクトル[-1、1、0、1、...]を取得したら、それらを列インデックス[1,2,3,4、...]を持つスパース行列の行インデックスとして使用できます。それを完全な行列に変換します。
ニック・アルジェ

OK用事、提案は、何も保存していないようことを試してみました
ニック・アルジェ

@NickAlgerとにかく先端をありがとう!好奇心から、あなたが思いついたものを見ることができますか?
DJMcMayhem

はい。以下は19文字ですが、おそらくいくつか改善される可能性があります、dZS2 + tn:tnZ?XPg79 * c
Nick Alger

、カップルの最適化を16にdZSqq_tnそれを手に入れた:LZ 79 * C?
ニック・アルジェ

8

Haskell、63バイト

f w=[do(e,y)<-zip w$tail w;max" "['o'|b e y]|b<-[(<),(==),(>)]]

出力の行を表す3つの文字列のリストを返します。サブリミナルメッセージは含まれていません。

dianne は、リストの内包do表記とのmax代わりに、表記法を使用して3バイトを節約しましたlast


3
素晴らしい、サブリミナルメッセージは含まれていません!それらは何ですか?
コナーオブライエン

5
['o'|b e y]..
イザベラ

はい、私のマスターは何が起こっているのですか?
電卓

7

CJam、19バイト

l2ew{:-g)S3*0t}%zN*

0代わりに使用しますo

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

説明

l      e# Read input.
2ew    e# Get all pairs of consecutive letters.
{      e# Map this block over the pairs...
  :-   e#   Compute the difference between the two letters.
  g    e#   Signum. Gives -1 for rises, 1 for falls, 0 otherwise.
  )    e#   Increment. Gives 0 for rises, 2 for falls, 1 otherwise. Call this i.
  S3*  e#   Push a string with three spaces.
  0t   e#   Replace the i'th space (zero-based) with a zero.
}%
z      e# Transpose.
N*     e# Join with linefeeds.

6

Python 2、76 71バイト

lambda s:[''.join(' o'[cmp(*x)==n]for x in zip(s,s[1:]))for n in-1,0,1]

文字列のリストを返すことが許可されていることを通知してくれた@xnorに感謝します。

Ideoneでテストします。


3つの文字列のリストを出力できますlambda。これにより、を実行できます。
-xnor

わたし?それがすべてを変えます。
デニス

LynnのHaskellの答えがそれをやっていたので、私はコメントで尋ねました。
-xnor

6

JavaScript(ES6)、96 95 89 87 82バイト

使用して保存された2バイト0の代わりに、oコナー・オブライエンによって示唆されるように、
2 6バイトETHproductionsのおかげで保存しました

let f =

s=>[1,0,-1].map(k=>s.replace(/./g,(c,i)=>i--?(c>s[i])-(c<s[i])-k&&' ':'')).join`
`

console.log(f("HELLOWORLD"));
console.log(f("EXAMINATION"));


1
任意のキャラクターを使用できるので、置き換え'o'0助けになりますか?
コナーオブライエン

@ ConorO'Brien-確かにそうです。;)
Arnauld

1
s=>[1,0,-1].map(k=>[...s].map(c=>(r=p?(c>p)-(c<p)-k&&' ':'',p=c,r),p=0).join``).join`\n` 2バイトを節約して動作すると思います。
ETHproductions

手動で追跡する代わりに、毎回前の文字を取得することにより、別のバイトを保存できますs=>[1,0,-1].map(k=>[...s].map((c,i)=>(p=s[i-1])?(c>p)-(c<p)-k&&' ':'').join``).join`\n` s.replaceまた、で数バイト節約できます[...s].map().join()
ETHproductions

4

Perl、47バイト

+1を含む -p

STDINに入力を与えます。

bumpy.pl <<< ABBCBA

bumpy.pl

#!/usr/bin/perl -p
$_ x=3;s%.%/\G(.)(.)/?$2cmp$1^$.&&$":--$.>0%eg

4

MATL、16 14バイト

dZSqq_tn:79Z?c

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

これは、DJMCMahemの答えの議論から生まれました。この回答は同じ長さの2文字の長さですが、方法は多少異なるため、独立して興味があるかもしれません。

2バイトを節約する提案をしてくれたLuis Mendoに感謝します(コメントを参照)

説明:

「dZS」は、各エントリが連続文字間の差の符号であるベクトルを取得し、「qq_」は各エントリを2ずつ減らし、符号を反転します。したがって、文字が増加しても1のままであれば、2そしてそれが減少する場合3。例えば、

dZSqq_ applied to 'HELLOWORLD' creates the vector [3 1 2 1 1 3 1 3 3]

次に、「t」はスタック上に前のベクトルのコピーを作成し、「n:」はスタック上にもベクトル[1,2,3,4、...]を配置します。次に、'79 'は値79をスタックに配置します。値79が選択されるのは、後で出力されるUnicode文字「o」の番号だからです。(値79を後でではなくここに置くというアイデアをくれたLuis Mendoに感謝します)

tn:79 applied to [3 1 2 1 1 3 1 3 3] creates the following items:
[3 1 2 1 1 3 1 3 3]   <-- first item on the stack
[1 2 3 4 5 6 7 8 9]   <-- second item on the stack
79                    <-- third item on the stack

この時点で、行のインデックス、列のインデックス、および出力文字が必要な場合は値79、空白を出力する場合は0を持つスパース行列の非ゼロ値が正確にあります。これら3つのアイテムをスタックから取り出し、MATLのスパースマトリックスコマンド「Z?」でこのスパースマトリックスを作成します。あれは、

dZSqq_tn:79 Z? applied to 'HELLOWORLD' outputs the following:
[0  79 0  79 79 0  79 0  0 ]
[0  0  79 0  0  0  0  0  0 ]   <-- 3-by-n sparse matrix
[79 0  0  0  0  79 0  79 79]

残っているのは、行列を数値からUnicode文字に変換することだけです。これは、コマンド 'c'によって行われます。79は「o」になり、0はスペースになります。

dZSqq_tn:79Z?c applied to 'HELLOWORLD' outputs:
[  o   o o   o    ]
[    o            ]   <-- 3-by-n sparse matrix of characters.
[o         o   o o]

結果として得られるcharのマトリックスは、暗黙的に表示されます。


スパース行列の非ゼロ値として79を直接使用して、2バイトを節約できます。また、MATLの回答でスパース行列が使用されるのはこれが初めてだと思います:-)
ルイスメンドー

@LuisMendoありがとう!私はあなたがお勧め変更するためにポストを編集した
ニック・アルジェ

3

PHP、95バイト

for($b[1]=$b[0]=$b[-1]=" ";($s=$argv[1])[++$i];)$b[$s[$i-1]<=>$s[$i]][$i]=8;echo join("\n",$b);

1.インデックス-1から1の代替を持つ文字列の配列を作成します $b=array_fill(-1,3," ");

2.宇宙船のオペレーターと入力の位置に依存する文字列を入力します

3.出力は、新しい行で配列を結合します

First Way 111バイト

for($o=" ";$i<$l=strlen($s=$argv[1])-1;)$o[$l*(1+($s[$i]<=>$s[$i+1]))+$i++]=8;echo join("\n",str_split($o,$l));

宇宙船のオペレータの使用<=> 宇宙船演算子を


1
あなたがあなたのプログラムをエンコードした場合は、ラテン-1 のための便利なショートカットです"\n"いいえ、真剣に!
リン

1
と同じこと" "ができます例。これらを表示するときに、ブラウザのエンコードをLatin-1に設定します。
リン

@Lynnまたは〜³〜†〜 '〜'アイデアをありがとう。私はユニコードを好むだろう
ヨルグヒュルサーマン

2

JavaScript(ES6)、81バイト

s=>[s,s,s].map(f=([c,...s],n)=>(p=s[0])?((c<p)-(c>p)+n-1&&" ")+f(s,n):"").join`
`

@Arnauldの回答に大きく影響されましたが、最初から書かれています。再帰を使用して、各行の内容を計算します。



2

Java 7、158 156バイト

String c(char[]z){String a,b,c=a=b="";for(char i=1,q=z[0],o=79,s=32,x;i<z.length;a+=(x=z[i])>q?o:s,b+=x==q?o:s,c+=x<q?o:s,q=z[i++]);return a+"\n"+b+"\n"+c;}

@Froznのおかげで2バイト節約されました。

未ゴルフ&テストケース:

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

class M{
  static String c(char[] z){
    String a,
           b,
           c = a = b = "";
    for(char i = 1,
             q = z[0],
             o = 79,
             s = 32,
             x; i < z.length; a += (x = z[i]) > q
                                     ? o
                                     : s,
                              b += x == q
                                     ? o
                                     : s,
                              c += x < q
                                     ? o
                                     : s,
                              q = z[i++]);
    return a + "\n" + b + "\n" + c;
  }

  public static void main(String[] a){
    print("HELLOWORLD");
    print("TESTCASE");
    print("EXAMINATION");
    print("ZSILENTYOUTH");
    print("ABC");
    print("ABCBA");
    print("ABBCBA");
    print("UVVWVVUVVWVVUVVW");
  }

  static void print(String s){
    System.out.println(c(s.toCharArray()));
    System.out.println("-------------------------");
  }
}

出力:

 O OO O  
  O      
O    O OO
-------------------------
 OO  O 

O  OO O
-------------------------
O O O O O 

 O O O O O
-------------------------
  O OOO O  

OO O   O OO
-------------------------
OO


-------------------------
OO  

  OO
-------------------------
O O  
 O   
   OO
-------------------------
O O   O O   O O
 O  O  O  O  O 
   O O   O O   
-------------------------

1
これが機能するかどうかはわかりませんa,b,c=b=a=""が、もっと短くなります。
Frozn

@Froznありがとう、編集。確かに機能します。PS:あなたはそれをフォークすることでイデオネで自分自身をチェックすることができたでしょう。;)
ケビンクルーイッセン

あなたが正しい!私はいつもリンクを見下ろしていて、それだけの価値があるわけではないために日食を始めています:)
Frozn

2

クロラ(20バイト)

<IN?o ;=IN?o ;>IN?o

説明:

各出力行に1つずつ、3つのCloraプログラムがあります。

最初のプログラム、 <IN?o

現在の入力char I<次のchar より小さいかどうかを確認しNます。結果をグローバルフラグに保存します。フラグの結果?を確認し、trueの場合はoutput o、そうでない場合は空白(はい、空白があります。

他のすべてのプログラムは、同じ規則に従い、で区切られ;、すべてのプログラムが実行され、引数として入力を受け取ります。

clora.jsを含めて、自分でテストして実行できます。

(function() {
  var x = new Clora('<IN?o ;=IN?o ;>IN?o ');
  x.execute('EXAMINATION', function(r) {
    console.log(r)
  })
})();

これは、このチャレンジ後に作成されたため、厳密には競合しないようです。これは面白い言語のように見えます!
コナーオブライエン

1

Pyth、21バイト

jCmX*3\ h._d0-M.:CMz2

STDINで引用符で囲まれていない文字列の入力を受け取り、結果を出力するプログラム。

これは、@ MartinEnderのCJam answerと同様のアイデアを使用しています

オンラインで試すか、すべてのテストケースを確認します

使い方

jCmX*3\ h._d0-M.:CMz2  Program. Input: z
                 CMz   Map ordinal over z, yielding the code-points of the characters
               .:   2  Yield all length-2 sublists of that
             -M        Map subtraction over that
  m                    Map the following over that with variable d:
         ._d            Yield the sign of d
        h               Increment that (i)
    *3\                 Yield string literal of 3 spaces, "   "
   X        0           Replace the space at index i with 0
 C                     Transpose that
j                      Join that on newlines
                       Implicitly print

1

PHP 7、81 80 77バイト

注:Windows-1252エンコードを使用

for($x=2;~$x--;print~õ)for($a=$argn;$c=$a[$$x+1];)echo$c<=>$a[$$x++]^$x?~ß:o;

次のように実行します。

echo HELLOWORLD | php -nR 'for($x=2;~$x--;print"\n")for($a=$argn;$c=$a[$$x+1];)echo$c<=>$a[$$x++]^$x?" ":o;';echo

説明

行を反復(番号10-1)。次に、すべての行の入力文字列を反復処理します。宇宙船の比較結果が行番号と等しい場合は、を出力しo、そうでない場合はスペースを出力します。すべての行の後に、改行を印刷します。

微調整

  • $xisの場合-1、反復を停止します。これは、バイナリ否定(result 0)で見つけることができます。追加1(または事前インクリメントの場合は2)と比較して1バイト節約します。
  • を使用して3バイトを保存しました $argn

1
-d error_reporting=30709バイトカウントに追加するのを忘れました。
タイタス

@Titusなぜ世界でそれをバイト数に追加する必要があるのですか?PHPの通知(無視できる)が出力されないようにするためです!
アロス

を追加することもできますが2>/dev/null、致命的エラーを含むすべてのエラーを取り除くことができます
16


のようなものIf you get warnings, set the default value with ...。私の学問を許してください。その値をデコードしませんでした。
タイタス

0

Lua 326 303バイトtl = 0 s = io.read()o1、o2、o3 = ""、 ""、 "" i = 1、#sのt = {} do t [i] = s:sub(i 、i)tl = tl + 1 v = 1、tl-1の場合、t [v] t [v + 1]の場合、o1 = o1 .. "" o2 = o2 .. "" o3 = o3 .. "の場合o "end end print(o1 .." \ n ".. o2 .." \ n ".. o3)

無償版

tl = 0 --set the tables length to 0
s = io.read() --Get the string from input
o1,o2,o3="","","" --Set the 3 output rows to empty strings
t = {} --Make a table for the string to be sent into
for i = 1, #s do --Loop from 1 to the length of the string
    t[i] = s:sub(i, i) --Set the I-th term in the table to the I-th character in the string
    tl = tl+1 --Add 1 to the table length
end --End the loop
for v=1,tl-1, 1 do --Loop from 1 to the tables length - 1, incrementing by 1
    if t[v] < t[v+1] then --Lua supports greater than less than and equals to with charactes, so this if statement detects if the string is rising
        o1=o1.."o" --Adds an o to the end of the first line of output
        o2=o2.." " --Adds a space to the second line
        o3=o3.." " --Adds a space to the third line
    elseif t[v] == t[v+1] then --Detects if the string is continuing
        o1=o1.." " --Adds a space to the first line
        o2=o2.."o" --Adds an o to the second line
        o3=o3.." " --Adds a space to the third line
    elseif t[v] > t[v+1] then --Detects if string is falling
        o1=o1.." " --Adds a space to the first line
        o2=o2.." " --Adds a space to the second line
        o3=o3.."o" --Adds an o to the third line
    end --Ends the if statement
end --Ends the loop
print(o1.."\n"..o2.."\n"..o3) --Prints the output

たとえば、t1 = 0?から空白をゴルフアウトできると思います。へt1=0?そして同様の場所。
コナーオブライエン

私は今それを修正します
アレックスアレン

0

R、114バイト

競合しないR回答。

v=y=z=rep(" ",length(x<-diff(utf8ToInt(scan(,"")))));v[x>0]="#";y[x==0]="#";z[x<0]="#";cat(v,"\n",y,"\n",z,sep="")

説明

  1. コマンドラインから入力を読み取り、ASCII 10進数ベクトルに変換します
  2. 最初の違いを取り、空白を含む同じ長さの3xベクトルを作成します
  3. 次に#、差が>0==0またはの場合、空白ベクトルを置き換え<0ます。
  4. ベクトルを強制し、改行で区切って印刷します

競合しない理由
コナーオブライエン

@ ConorO'Brien他のRの回答と競合していると思いますが、元の解決策は長くなり、一般的な意味で興味深いほどユニークではありませんでした。
ビリーウォブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.