アルファベットスープのボウルを作る


55

これは、アルファベットスープのボウルと呼ばれるものです。26個の大文字の英字(AZ)が周囲を形成するように時計回りに配置されたほぼ円形のascii-art形状です。

   XYZABC
 VW      DE
U          F
T          G
S          H
 RQ      JI
   PONMLK

AZという1文字の文字を取り込んで、いわば「回転」したアルファベットスープの同じボウルを出力するプログラムを作成します。つまりA、上記の例のように入力文字が表示され、残りのアルファベットが完全に循環します。時計回り。

したがって、入力の出力はA、アルファベットスープの元のボウルと同じになります。

入力の出力Bは次のようになります。

   YZABCD
 WX      EF
V          G
U          H
T          I
 SR      KJ
   QPONML

同様に、の出力は次のHようになります。

   EFGHIJ
 CD      KL
B          M
A          N
Z          O
 YX      QP
   WVUTSR

またはのためにZ

   WXYZAB
 UV      CD
T          E
S          F
R          G
 QP      IH
   ONMLKJ

これは、A〜Zの26文字すべてで機能する必要があります。

詳細:

  • 入力は、A〜Zの1文字のみであると想定できます。
  • 入力および/または出力に小文字のazを使用すると便利な場合は、小文字と大文字を組み合わせて使用​​することもできます。
  • アルファベット順は、反時計回りではなく時計回りに循環する必要があります。
  • スープボウルをインデントして塗りつぶすには、他のものではなくスペースを使用する必要があります。
  • スープボウルが適切に配置されている限り、出力に先頭または末尾の改行またはスペースがあってもかまいません。
  • ボウルの形状は、テキストとしてほぼ円形に見えるように、幅12文字、高さ7であることに注意してください。ボウルは同じ形状である必要があります。

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


12
素晴らしい挑戦です!最初は簡単そうに見えますが、そうではありません
Luis Mendo

回答:


22

05AB1E、21バイト

プログラムfを定義しますAlphabeticCharStringf:AlphabeticCharString

コード:

2AA¹k._•1못*Ć,ãiDΣ•Λ

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


壊す:

2AA¹k._•1못*Ć,ãiDΣ•Λ

2                       # <length>
 AA¹k._                 # <filler>
       •1못*Ć,ãiDΣ•    # <pattern>
                    Λ   # Invoke the canvas function.


説明:

この特定のコンテキストのキャンバスΛ)は、次のシグネチャを持つ関数として機能します。

Λ:(length:Nat, filler:String, pattern:Nat)String

patternパラメータは、このような状況に方向を定義する数です。コードでは、この番号はとして表されます•1못*Ć,ãiDΣ•。これは、大きい番号2232344565666667670012122圧縮バージョンです。方向は次の方法で示されます。


70162543


つまり、大きな数字は次の方向のパターンを表します。

[,,,,,,,,,,,,,,,,,,,,,,,,]

この署名コンテキストを使用して、キャンバスはpatternリストを反復処理し、フィラーからのlength文字を現在の方向に書き込みます。filler

lengthのようにコードで指定された2(コードの先頭に)。以下のためにfiller、我々はそれが与えられた入力から始まるようにアルファベットの回転バージョンが必要です。これは次のコードで行います(ここで試してみてください):

AA¹k._

 A¹k#アルファベットで指定された入力文字の<インデックス>を見つける
A ._#アルファベットを左に<index>回回転します。

擬似コードでは、これはキャンバス関数によって実行されます。

1.Write ab in the direction2.Write bc in the direction3.Write cd in the direction4.Write de in the direction5.Write ef in the direction6.Write fg in the direction

最後に、あなたはフィラー引数は「回転」されていることがわかりますlength1キャンバスには、以下の(循環したがって、無限の)リストを反復することを意味し、右に回:

[ab,bc,cd,de,ef,fg,gh,hi,ij,jk,...

これにより、目的のアルファベットスープアスキーアートの形になります。


はい、あきらめます。より短い選択肢を見つけようとしましたが、私はそれを見ていません。AA¹k._代わりににすることもできますA¹¡RJ«が、同じバイト数です。•1못*Ć,ãiDΣ•代わりににすることもできます•õÕ₆qηµñ–†f•·が、同じバイト数です。まぁ。素敵な答え!
ケビンクルーッセン

11

Perl 6、100バイト

{"2XYZABC
 VW5DE
U9F
T9G
S9H
 RQ5JI
2PONMLK".trans(/\S/=>{(try ' 'x$/+1)||chr ($/.ord+.ord)%26+65})}

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

文字列内のすべての文字をシフトされた対応する文字に置き換え、数字をそれらが表すスペースの数に1を加えたものに置き換えます。

説明

{                                                            }# Anonymous code block
 "...".trans(/\S/=>{                                       }) # Translate non-whitespace
                    (try ' 'x$/+1)      # If digits, the amount of spaces plus one
                                  ||chr ($/.ord+.ord)%26+64  # Else the shifted letter

9

ルビー、107バイト

->n{a=(0..6).map{' '*11}
(?A..?Z).map{|i|j,k=(1i**((i.ord-n.ord-6)/6.5)).rect;a[3.5*k+=1][5.2*j+6]=i}
a*$/}

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

構文の改善"i".to_c-> 1i(ヨルダンによる提案)

座標系を変更して、上ではなく0度が右になるようにしました。これにより0.5->6

調整済みの乗数jおよびk短さ

出力を印刷するのではなく、puts a配列要素を連結して文字列を返しますa*$/

ルビー、119バイト

->n{a=(0..6).map{' '*11}
(?A..?Z).map{|i|j,k=("i".to_c**((i.ord-n.ord+0.5)/6.5)).rect;a[3.5-j*3.3][6+k*5.17]=i}
puts a}

複素数を累乗して、楕円にマッピングします。完全なターンは26なので、各象限は6.5です。

このアプローチは、有効なマッピングを実現できるように、楕円に十分に似た必要な出力に依存しています。

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


@Jordanありがとう、以前にその構文を見たことがない!
レベル川セント

8

、33バイト

GH→→↘→↘↓↓77←←←←↖←↖↑↑↗→↗→→²✂⁺αα⌕αS

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

GH

パスをトレースします。

→→↘→↘↓↓77←←←←↖←↖↑↑↗→↗→→

ボウルの輪郭を描きます。それぞれがに7展開され↙←ます。

²

一度に1文字ずつ移動します(このAPIは、各行の終わりを次の行とオーバーラップします)。

✂⁺αα⌕αS

二重アルファベットを使用して描画しますが、入力文字の位置から開始します。


8

MATL、49バイト

7I8*32tvB[1b]&Zvc2Y2j7+_YSy&f7-w4-_Z;YPE\,&S])yg(

なんて混乱。しかし、書くのは楽しかったです。アークタンジェントも含まれます。

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

説明

コード

7I8*32tvB

数値の配列を作成し、それらをバイナリに変換します。これにより、ゼロ1行列が得られます

0 0 0 1 1 1
0 1 1 0 0 0
1 0 0 0 0 0
1 0 0 0 0 0

これは、文字の位置を指定するマトリックスの左上の象限です。

[1b]&Zv

最後の行を繰り返さずにその象限を垂直に反映し、最後の列を水平に繰り返して完全な行列を生成します。

0 0 0 1 1 1 1 1 1 0 0 0
0 1 1 0 0 0 0 0 0 1 1 0
1 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 1
0 1 1 0 0 0 0 0 0 1 1 0
0 0 0 1 1 1 1 1 1 0 0 0

これで、位置を含むマスクができました。コード

c

最終結果はchar行列になるため、これをcharに変換します。文字0はスペースとして表示され、ゼロ以外のエントリは適切な文字で書き込まれます。

2Y2

'abc···xyz'26文字を含む文字列をプッシュします。この文字列は、入力に従って循環的にシフトする必要があります。それをするために、

j7+_YS

入力文字を読み取り、ASCIIコードに7を追加し、結果を否定します。入力の'a'場合、これは26の倍数である-104を与えるため、この量だけ循環シフトしても何も起こりません。入力がbこれである場合、-105 が得られ、ストリングを1ステップ左にシフトして'bcd···yza'、; が生成されます。等

次のステップでは、シフトされた文字列が行列の非ゼロエントリに書き込まれる順序を定義します。この目的を達成するために、

y&f

行列のコピーを作成し、非ゼロの1ベースの行と列の位置を含む2つのベクトルをプッシュします。それから

7-w4-_

後者から7を減算し、前者を先頭にし、4を減算して、否定します。7と4は座標の原点を指定するため、その原点に対する非ゼロエントリの位置ベクトルの角度が目的の順序を定義します。

Z;YPE\

これらの角度を生成するために2 * piを法とする2つの引数の逆正接を計算します。ここで、最小の角度(0)は、最初の文字が移動するエントリに対応し、残りは反時計回りに進みます。

,&S])

文字列内の文字をそれらの角度に従って並べ替えます。これにより、文字が行列の非ゼロエントリに列優先順(下、次に横)で書き込まれると、結果が正しくなります。これは

yg(

たとえば、入力が'a'文字列であり、循環的にシフトされていない場合:

abcdefghijklmnopqrstuvwxyz

角度ごとに並べ替えると、これが

utsvrwqxpyoznamblckdjeifgh

これにより'u'、最初の(列優先順)非ゼロエントリに正しく移動します。これは、マトリックス表記では(3,1)です。't'(4,1)、's'(5,1)に移動します。'v'(2,2)などへ:

   ······   
 v·      ·· 
u          ·
t          ·
s          ·
 ··      ·· 
   ······   

@EriktheOutgolferついに説明を加える時間を見つけました
ルイス・メンド

1
うわー、あなたはそのコメントを削除したので、実際にこれを放棄したと思った。:P
エリック・ザ・アウトゴルファー


7

R139 122バイト

ジュゼッペのおかげで-17バイト

u=utf8ToInt;`*`=rep;o=c(' '*12,'
')*7;o[u("  &3@LKWVUTSRDC5(")]=LETTERS[(13:38+u(scan(,'')))%%26+1];cat(o,sep='')

説明:

o=rep(c(rep(' ',12),'
'),7) 

スペースの空のボックスを作成します

u(" &3@LKWVUTSRDC5(")

以下に対応する文字位置のインデックスのセットです。

c(7:9,23,24,38,51,64,76,75,87:82,68,67,53,40,27,15,16,4:6)

TIO


1
あなたは決して使用しないintToUtf8ものは余分なバイトですので、しかし、あなたが使用している場合*の代わりにrep、あなたは2つのバイトを保存取得しに行くことができます125バイト
ジュゼッペ・

1
ああ、印刷可能なアスキーの代わりに低バイト文字を使用する-32と、122バイトで削ることができます。を使用して自分で生成できますcat(intToUtf8(bytes))
ジュゼッペ

@Giuseppe私はすでにを削除していると確信していたのでintToUtf8、関数のバージョンが多すぎるとすぐに開いてしまいます。ニースはすべてを節約します、ありがとう
アーロンヘイマン

6

JavaScript(Node.js) 121  119バイト

@tshのおかげで2バイト節約

c=>`2XYZABC
0VW5DE
U9F
T9G
S9H
0RQ5JI
2PONMLK`.replace(/./g,x=>''.padEnd(+x+1)||(B=Buffer)([65+([a,b]=B(c+x),a+b)%26]))

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

どうやって?

Bufferxc

c="H"x="B"

// extracting the ASCII codes
Buffer(c + x)  Buffer("HB")  <Buffer 48 42>

// assigning them to variables
[a, b] = Buffer(c + x)  a = 0x48 (72) and b = 0x42 (66)

// computing the ASCII code of the target letter
65 + ((a + b) % 26)  65 + (138 % 26)  65 + 8  73

// turning it back into a character
Buffer([73])  <Buffer 49>  implicitly coerced to "I" by replace()



4

R218 197バイト

ジュゼッペのおかげで-21バイト

function(t,l=letters,`*`=rep,s=" ",n="
",`~`=`[`,r=c(l~l>=t,l))cat(s*3,r~24:26,r~1:3,n,s,r~22:23,q<-s*6,r~4:5,n,r~21,u<-s*10,r~6,n,r~20,u,r~7,n,r~19,u,r~8,n,s,r~17:18,q,r~10:9,n,s*3,r~16:11,sep='')

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

ゴルフをしていない:

alphasoup <- function(startlet){
  startnum <- which(l == startlet)
  rotatedletters <- c(letters[startnum:26], letters[1:(startnum -1)])[1:26]
  cat('   ',rotatedletters[24:26],rotatedletters[1:3], '\n ', 
      rotatedletters[22:23], s6 <- '      ', rotatedletters[4:5], '\n',
      rotatedletters[21], s10 <- rep(' ', 10), rotatedletters[6], '\n',
      rotatedletters[20], s10, rotatedletters[7], '\n',
      rotatedletters[19], s10, rotatedletters[8], '\n ',
      rotatedletters[17:18], s6, rotatedletters[10:9], '\n   ',
      rotatedletters[16:11],
      sep = '')
}

回転した文字ベクトルを作成しcat、ボウルの縁をそのベクトルで塗りつぶすために使用します。


1行の怪物を気にしない場合は203バイト。最大の改善点はおそらく削除し、インデックスとして直接which使用することl>=tでした。これは12バイトの価値がありました。
ジュゼッペ

2
エイリアシング[することにより198バイト~。これは素晴らしい答えです。もっと複雑なアプローチで、最初の数回の試行で約250バイトを費やしていました。
ジュゼッペ

ああ、それは賢いです。文字列の比較を忘れています。
CTホール

3

Java 11、134バイト

c->"2XYZABC_0VW5DE_U9F_T9G_S9H_0RQ5JI_2PONMLK".chars().forEach(i->System.out.print(i<59?" ".repeat(i-47):(char)(i>90?10:(c+i)%26+65)))

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

ゴルフされる可能性のある136バイト版

c->"2XYZABC_0VW5DE_U9F_T9G_S9H_0RQ5JI_2PONMLK".chars().forEach(i->System.out.printf("%"+(i<59?i-47:"")+"c",i>90?10:i<59?32:(c+i)%26+65))

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

説明(最初の回答の)

c->                          // Method with character parameter and no return-type
  "2XYZABC_0VW5DE_U9F_T9G_S9H_0RQ5JI_2PONMLK"
                             //  Template-String
    .chars().forEach(i->     //  Loop over the unicode values of its characters:
    System.out.print(        //   Print:
     i<59?                   //    If the value is below 59 (so a digit character):
      " ".repeat(i-47)       //     Repeat a space that digit + 1 amount of times
     :(char)(i>90?           //    Else-if the value is above 90 (an underscore character):
              10             //     Print a newline
             :               //    Else:
              (c+i)          //     Add the current value and the input together
                   %26       //     Take modulo-26 of it to get the index in the alphabet
                      +65))) //     And add 65 to make it an uppercase letter

数字を印刷できないものに置き換えてみませんか?そのように、あなたは単に省略することができますi-47
無知の具体化

@EmbodimentofIgnoranceバイトを節約できないのではないかと心配しています。スペースの数は3、1、6、および10です。10は3回使用され、文字(\n)としてそれぞれ2バイトです。したがって、printableと3x \nwith iまたはdigits-1 withのどちらを使用してもi-47、どちらも134バイトカウントと同じです。残念ながら、unprintable 0を使用することはできません。そうしないと、代わりに2,0,5,9を使用i+1して、合計で1バイトを節約することができます。
ケビンクルーッセン


2

Haskell、127バイト

("cXYZABC aVWfDE UjF TjG SjH aRQfJI cPONMLK">>=).(?)
t?c|c>'Z'=' '<$['a'..c]|c<'!'="\n"|t<'B'=[c]|c>'Y'=t?'@'|1<2=pred t?succ c

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

エンコードされた文字列の各文字は、関数によってデコードされます ?ます。

t?c                             -- 't' is the starting char,
                                -- 'c' the char from the encoded string
   |c>'Z'=' '<$['a'..c]         -- if 'c' is a lowercase letter, return some spaces
                                -- 'a': one, 'b': two, etc
   |c<'!'="\n"                  -- if 'c' is a space, return a newline
   |t<'B'=[c]                   -- if 't' is the letter A, return 'c'
   |c>'Y'=t?'@'                 -- wrap around Z
   |1<2=pred t?succ c           -- else the result is the same as starting one letter
                                -- earlier (pred t) but looking at the successor of 'c'


2

C#(Visual C#Interactive Compiler)126 118バイト

n=>$@"   XYZABC
 VW{"",6}DE
U {"",9}F
T {"",9}G
S {"",9}H
 RQ{"",6}JI
   PONMLK".Select(b=>b<65?b:(char)((b+n)%26+65))

@someoneのおかげで8バイト節約されました。はい、それは実際に彼のユーザー名です。

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


118バイトの文字列補間。文字コードの配列を返すことは許容される可能性があります(最大8バイトを節約)が、わかりません。
誰か

@someoneニース、文字列の補間を忘れました
無知の

2

TSQLクエリ、238バイト

DECLARE @y char='G'

,@ char(91)=3;WITH C as(SELECT'5585877636333330301125255'z,8a,ascii(@y)x
UNION ALL
SELECT stuff(z,1,1,''),a+left(z,1)/3*13+left(z,1)%3-14,(x+14)%26+65FROM
C WHERE''<z)SELECT
@=stuff(stuff(@,a,1,char(x)),1+a/13*13,1,char(13))FROM
C PRINT @

この回答のテストリンクは改行を壊し、スペースを除外しました。読みやすい結果を表示するために、スペースをピリオドに置き換え、char(13)をchar(13)+ char(10)に置き換えました。

オンラインで試す

ゴルフをしていない:

DECLARE @y char='G'

-- @ is the string being printed last. 
-- @ is populated with 3 to save a byte
-- the number 3 gets replaced later
-- (this could have been any 1 digit value), 
-- @ is automatically filled with spaces, because
-- it is declared as a char(x) and assigned a value
,@ char(91)=3;
-- recursive query
WITH C as
(
-- z string containing digits for the direction of next letter
-- z should not contain 4 because it will point to same position.
-- values in z 0,1,2,3,4,5,6,7,8 can logally convert to 
-- (-1,-1),(-1,0),(-1,1),(0,-1),(0,0),(0,1),(1,-1),(1,0),(1,1)
-- a is the starting position
  SELECT'5585877636333330301125255'z,8a,ascii(@y)x
  UNION ALL
-- stuff remove first character from the z string
-- a calculate next position of the next letter
-- x cycle the input letter
  SELECT stuff(z,1,1,''),a+left(z,1)/3*13+left(z,1)%3-14,(x+14)%26+65
-- repeat recursive until long string is empty
  FROM C
  WHERE''<z
)
SELECT
-- 1st stuff replace the character to created the start of a 
--   logical line in the string @ this is where 3 gets overwritten
-- 2nd stuff replaces a character(space if coded correct) 
--  with the letter at the calculated position.
  @=stuff(stuff(@,a,1,char(x)),1+a/13*13,1,char(13))
FROM C

PRINT @

私は、DBへのアクセスを得ることができればOK @MickyT、おかげであなたのフィードバックのために、私は後で今日それを修正します
t-clausen.dk

@MickyT今すぐ修正する必要があります
t-clausen.dk

1
今よさそうだ。
MickyT

1

PHP236の 229 226バイト

<?=($a=ord(file_get_contents('php://stdin'))-65)?preg_replace_callback('~\w~',function($m)use($a){return chr((ord($m[0])-65+$a)%26+65);},'   XYZABC
 VW      DE
U          F
T          G
S          H
 RQ      JI
   PONMLK'):'';

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

プレゴルフ:

<?php
$adjust = ord(file_get_contents('php://stdin')) - 65;
echo preg_replace_callback('~\w~', function($match) use ($adjust) {
    $new = ord($match[0]) - 65;
    $new = ($new + $adjust) % 26;
    $new += 65;
    return chr($new);
}, '   XYZABC
 VW      DE
U          F
T          G
S          H
 RQ      JI
   PONMLK');

説明:

使用しordて、0〜255の整数に変換します。Aは65、Zは90です。
この知識を使用して、入力を取得し、65を減らして調整値を取得します。
次に、すべてのキャラクターを反復処理しord、それらを呼び出し、65ずつ減らし、調整値だけ増やします。moduloを使用して、26
を超える場合は0にループバックします。その後、再び65 ずつ増やし、で文字に戻しchrます。

残念ながらphp:// stdinは1回しか確認できないため、ループ内の関数に入力を渡す必要があります。バイトを保存しuse($a)たり、関数の外部で変数を宣言したりする必要がないため、<?=エコーメソッドを使用できません。私たちはすべてを巨大な三元に包まなければなりません。


1

C(GCC)286バイト

最短のゴルフではありませんが、機能します

#define r(a)(a+c)%26+65
#define R(a)for(i=10;i;a[--i]<33?:(a[i]=r(a[i])));
i;f(c){char*S="          ",T[]="   XYZABC\n",E[]="VW      DE\n",F[]="RQ      JI\n",B[]="   PONMLK";R(T)R(E)R(F)R(B)printf("%s %s%c%s%c\n%c%s%c\n%c%s%c\n %s%s",T,E,r(85),S,r(70),r(84),S,r(71),r(83),S,r(72),F,B);}

オンラインで試す





0

Javascript(V8)、316バイト

function a(b){n="abcdefghijklmnopqrstuvwxyz".split(b);n=b+n[1]+n[0],console.log(`   ${n[23]+n[24]+n[25]+n[0]+n[1]+n[2]}\n ${n[21]+n[22]}      ${n[3]+n[4]}\n${n[20]}          ${n[5]}\n${n[19]}          ${n[6]}\n${n[18]}          ${n[7]}\n ${n[17]+n[16]}      ${n[9]+n[8]}\n   ${n[15]+n[14]+n[13]+n[12]+n[11]+n[10]}`)}

オンラインで試す

初めてゴルフをコード化しようとしました。ヒント/フィードバックを感謝します。

縮小する前の元のコード:

function a(b){
    var c = ("abcdefghijklmnopqrstuvwxyz").split(b);
    c = b+c[1]+c[0]
    console.log(`   ${c[23]+c[24]+c[25]+c[0]+c[1]+c[2]}\n ${c[21]+c[22]}      ${c[3]+c[4]}\n${c[20]}          ${c[5]}\n${c[19]}          ${c[6]}\n${c[18]}          ${c[7]}\n ${c[17]+c[16]}      ${c[9]+c[8]}\n   ${c[15]+c[14]+c[13]+c[12]+c[11]+c[10]}`)
}

こんにちは、PPCGへようこそ。現状では、送信はスニペットであり、無効なI / Oです。あなたの答えを修正して、完全なプログラムまたは機能のいずれかになります-縮小版ではありません。
ジョナサンフレッチ

@ジョナサンフレッシュありがとう!それで十分でしょうか?
エドウィンチュア

1
はい、これは現在有効な提出です。
ジョナサンフレッチ



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