半対角アルファベット


35

英語のアルファベットの文字が与えられた場合、あなたの仕事は入力に対して半対角アルファベットを作成することです。

半対角アルファベットを作成する方法は?

簡単な説明:最初に、アルファベットの文字の位置を取得しますPPここでは1から始まります)。次に、行に入力(包括的)が来るまで各文字を印刷し、その文字の前にスペースを入れP-1てその文字を繰り返しPます。

  • 与えられたF、あなたのプログラムは出力するはずです:

    A 
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
    
  • 与えられたK、あなたのプログラムは出力するはずです:

    A
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
          GGGGGGG 
           HHHHHHHH 
            IIIIIIIII 
             JJJJJJJJJJ 
              KKKKKKKKKKK 
    
  • 与えられたA、あなたのプログラムは出力するはずです:

    A
    

ルール

  • 小文字または大文字を選択できますが、それは一貫している必要があります。

  • 次のように余分なスペースがある場合があります。

    • 一貫した先行スペース(各行)。
    • 末尾または先頭の改行。
    • 末尾のスペース。
  • 入力および出力は、任意の標準的な平均で取得でき、デフォルトの抜け穴が適用されます。

  • バージョンも提供している限り、代わりに行のリストを出力できます。

  • これはなので、バイト単位の最短コードが勝ちです!

この挑戦に触発された


出力は文字列のリストとして大丈夫ですか?
アダム

2
なぜ下票なのですか?何を改善できますか?

1
「Pはここで1からインデックス付けされます」と言うとき、ここでチャレンジまたは例を参照していますか?
デイブ

3
@pizzakingmeいいえ、できません。

1
私の答えをゴルフ中に偶然面白いパターンを得た:tio.run
##K0nO@f@

回答:


10

Python 3、59バイト

lambda l:[' '*i+'%c '%(i+65)*-~i for i in range(ord(l)-64)]

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

Python 3、61バイト

lambda l:[' '*i+-~i*(chr(i+65)+' ')for i in range(ord(l)-64)]

オンラインでお試しください!(プリティプリント版へのリンク)


8
私は絶対に下票の理由はないと思います。@downvoterは説明できますか?
ミスターXcoder

1
それは単なるクリックミス、またはおそらく説明の欠如を好まない人(後者はIMOの可能性が非常に低い)であると想像します
コナーオブライエン

私はPythonが嫌いで、Pythonで実装できないので、答えは役に立たないのですか?冗談が、ボタンはおそらく、このサイトのルールに適合しないツールチップ
トーマス・ウェラー

それは私だけですか、それともXcoder氏が1人の担当者を持っていると言うのですか?
スタンストラム



7

PowerShell45 42バイト

65..$args[0]|%{" "*$i+++"$([char]$_) "*$i}

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

入力をリテラル文字として受け取り、そのポイントまで大文字をループアップし、各反復が適切な数のスペースを追加してからchar \ spaceハイブリッドを追加します。

TessellatingHecklerのおかげで3バイト節約されました。


@TessellatingHeckler確かに。私はそれを"$args"そんなにゴルフしてきましたが、ここではうまくいかないでしょう、私はその[0]方法を忘れました。ハハ。
AdmBorkBork

5

JavaScript(ES6)、85バイト

入力と出力の両方で小文字で動作します。各行に先行スペースと後続スペースを出力します。

f=(c,k=10,C=k.toString(36),r=s=>`${s} `.repeat(k-9))=>r``+r(C)+(C==c?'':`
`+f(c,k+1))

デモ


`${s} `(s+"")1バイト節約のために置き換えることができます
ルーク

@Lukeこのスペースが必要です。で置き換えることができますが(s+" ")、それは同じくらい長いです。
アーナルド

5

APL(Dyalog)、26バイト

スカラー文字のプロンプト。行のリストを印刷します。

(∊⍴∘'',' ',¨⍨⊢⍴⊃∘⎕A)¨⍳⎕A⍳⎕

オンラインでお試しください!(ASCIIアートバージョンが1バイト追加されています)

 入力を促す

⎕A⍳ 見つけɩ NDEXでA lphabet

 まずその多くɩの ntegers

( 次の暗黙関数をそれぞれに適用します。

⊃∘⎕AA lphabet  から引数の文字を選択します

⊢⍴ 引数の長さに周期的に変形します

' ',¨⍨ それぞれにスペースを追加します

⍴∘'', 引数の長さの文字列を追加します(スペースが埋め込まれます)

ϵ nlist(平坦化)


ASCIIアートバージョンは、左端にあります。文字列のリストを文字の表に混ぜます。


4

Perl 5、31バイト

30バイトコードの+ 1 -l

print$"x$-,"$_ "x++$-for A..<>

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


フラグのsay代わりに以下を使用して、これを減らすことができます-lオンラインで試してみてください!
Xcali

@Xcali私は-E/ -M5.01で破れています、私はsay過去にかなり使用しました、そしておそらく制限されたソースのチャレンジまたは同様のもののsay代替であるという事実をおそらく乱用するでしょうが、print-3のために、私は続けます現状のまま。公正な議論については、このメタ投稿を参照してください。しかし、入力に感謝します!
ドムヘイスティングス

3

Dyalog APL、38バイト

{↑{(y/' '),(2×y←⎕A⍳⍵)⍴⍵,' '}¨⎕A↑⍨⎕A⍳⍵}

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

どうやって?

⎕A↑⍨ -までアルファベットを取る

⎕A⍳⍵ -入力文字

¨ -各文字

    ⍵,' ' -文字とスペースを取ります

    (...)⍴ -に形を変える

    2×y←⎕A⍳⍵ -アルファベットのcharのインデックスの2倍

    (y/' ') -およびchar-of-charスペースの先頭に追加

-その後、平らにします


3

APL(Dyalog Classic)、26バイト

{↑{(≠\⍵<⍳3×⍵)\⍵⊃⎕A}¨⍳⎕A⍳⍵}

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

説明

                      ⍳⎕A⍳⍵  generate indexes up to position of right arg 
{                          on each index apply function
   (≠\⍵<⍳3×⍵)                generate boolean mask for expansion (each line has a length 3 times its index ⍵, starting with  blanks and then alternating letter blank)
             \⍵⊃⎕A          expand character in position 
                             mix result into text matrix

良さ... 4 APL-erが同じ問題を同時に解決します!:) codegolf {}では、outerを削除し、に置き換え、それが関数ではなく「完全なプログラム」であると主張できると思います。それがあなたのソリューションを(これまでのところ)最高のものにします。
ngn

良い兆候である必要があります:)提案をありがとう。私はそれを見たことがありますが、どこに線を引くべきかわかりませんでした。カーリーを取り除いて混ぜると3バイト節約できると思います。
ギル

3

V28、26、25、23バイト(競合

¬A[/a
lDÓ./& ò
ò-Ûä$Û>

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

長い間特定の機能を追加することを計画してきましたが、この課題が最終的にそれを行うように私を確信させたことに注意してください。

出力には、各行に1つの先行スペースと1つの後続の改行が含まれます。

Hexdump:

00000000: ac41 5b2f 1261 0a6c 44d3 2e2f 2620 f20a  .A[/.a.lD../& ..
00000010: f22d dbe4 24db 3e                        .-..$.>

説明:

¬A[         " Insert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ['
   /        " Search for...
    <C-r>a  "   The input
l           " Move one character to the right
 D          " And delete every character after the cursor
  Ó         " Search for...
   .        "   Any character
    /       " And replace it with...
     & ò    "   That character followed by a space and a newline
ò           " Recursively...
 -          "   Move to the beginning of the next line up
  Ûä$       "   Make *line number* copies of the current line
     Û>     "   And indent this line by *line number* spaces

1
これは競合しています。タイトルのコメントを削除できます。

私のような新しいメタを知らなかった人にとっては便利です
コナーオブライエン

3

05AB1E、10バイト

A¹¡н«ðâƶāú

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

-2 Adnanに感謝します。

»別の行に印刷するように追加します。


<1つの一貫した先行スペースで問題ないので、省略できます。
エミグナ

@Emignaありがとう!
エリックアウトゴルファー

A¹¡н«ðâƶāú10バイトで動作するはずです
アドナン

@Adnan ¹¡それはうまくいかないと思う...ああ、だからそこにあるの«だ。:p
エリックアウトゴルファー

3

R、94 88バイト

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

function(x,l=LETTERS)for(i in 1:match(x,l))cat(rep(' ',i-1),rep(paste(l[i],' '),i),'\n')}

ゴルフをしていない:

f=function(x,l=letters){
  for(i in 1:which(l==x)){
    A=paste(l[i],' ')
    cat(rep(' ',i-1),rep(A,i),'\n')
  }
}

88バイト:匿名関数を返すことは問題ありませんf。1行なので、中括弧を取り除くことができ、バイトmatchwhich保存する代わりに使用するとバイトが保存されます。
ジュゼッペ


stdinから入力を受け取る68バイト
ジュゼッペ

3

Haskell、52 44バイト

f k=[[" ",s:" "]>>=(['A'..s]>>)|s<-['A'..k]]

行のリストを返します。

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

f k=                  -- main function is f, input parameter k
  [   |s<-['A'..k]]   -- for each s from ['A'..k]
     >>=              -- map (and collect the results in a single string) the function: 
         (['A'..s]>>) --  replace each element in ['A'..s] with
    [  ,  ]           --  over the list, containing
     " "              --   a single space to get the indent
        s:" "         --   s followed by space to get the letter sequence

編集:@jferard:3バイトを保存しました。ありがとう!


49バイト:f k=[tail$[" ",s:" "]>>=(['A'..s]>>)|s<-['A'..k]]
-jferard

@jferard:どうもありがとう。課題を読み直しtail$ます。行ごとに先頭にスペースを入れることができることに気付きました。
-nimi

2

JavaScript(ES8)、92バイト

c=>(g=n=>n>9?[...g(n-1),`${n.toString(36)} `.repeat(n-=9).padStart(n*3)]:[])(parseInt(c,36))

小文字を使用します。行には、先頭と末尾に1つのスペースがあります。行の配列を返します。

テストスニペット

let f=

c=>(g=n=>n>9?[...g(n-1),`${n.toString(36)} `.repeat(n-=9).padStart(n*3)]:[])(parseInt(c,36))

;O.innerText=f("k").join`\n`
<pre id=O></pre>


2

、13バイト

z+ḣ∞øzRNC1…'A

コマンドライン引数として単一引用符で囲まれた文字を受け取り、結果をSTDOUTに出力します。 オンラインでお試しください!

説明

Huskが文字列のリストのリストを印刷する方法を利用しています。内側のリストをスペースで、外側のリストを改行で結合します。

z+ḣ∞øzRNC1…'A  Implicit input, say 'C'
          …'A  Range from A: "ABC"
        C1     Cut into strings of length 1: ["A","B","C"]
     z N       Zip with positive integers
      R        using repetition: x = [["A"],["B","B"],["C","C","C"]]
   ∞ø          The empty string repeated infinitely: ["","","",...
  ḣ            Prefixes: [[],[""],["",""],["","",""],...
z+             Zip with x using concatenation: [["A"],["","B","B"],["","","C","C","C"]]
               Implicitly join each inner list with spaces, join the resulting strings with newlines and print.

2

05AB1E15 14 13バイト

Adnanのおかげで1バイト節約

A¹¡н«ƶ€S»¶¡āú»

オンラインでお試しください! またはアスキーアート版

説明

A                # push lowercase alphabet
 ¹¡              # split at input
   н             # get the first part
    «            # append the input
     ƶ           # repeat each a number of times corresponding to its 1-based index
      €S         # split each to a list of chars
        »        # join on spaces and newlines
         ¶¡      # split on newlines
           āú    # prepend spaces to each corresponding to its 1-based index
             »   # join on newlines


@EriktheOutgolfer:似たようなことをしましたが、持ち上げる前にスペースを追加して、結合の必要性をなくすという非常に良いアイデアがあなたのアイデアを短くしました。先行/末尾のスペースもリストとしての出力も大丈夫だとは読んでいなかったので、実装する前に課題全体を読むように教えて
いただけれ

tl; dr:ベクトル化:p
エリックアウトゴルファー

A¹¡н«代わりに動作するADIk>£はずです
アドナン

@アドナン:ありがとう!私は持ってA¹¡нいた«が、最後の手紙を受け取ることを考慮しなかったので、それは十分ではなかった:P
エミグナ


2

QBasic、79 74 72バイト

バイトを節約してくれたTaylor Scottに感謝(2回!)

FOR i=1TO ASC(INPUT$(1))-64
?TAB(i)
FOR j=1TO i
?CHR$(64+i)" ";
NEXT j,i

大文字を使用します。入力はキーを押すことで行われ、画面にはエコーされません。

説明

アルファベットの制限文字の位置までループi1ます(1から始まります)。それぞれについてi、; iを使用して画面の列に移動しますTAB。次に、アルファベットのth文字に続けてスペースiを印刷しiます。


結局のところ、あなたが使用できるINPUT$(1)変数の直接の代替としてコマンドをz$-2デルタのバイト
テイラー・スコット

@TaylorScott良いアイデア、ありがとう!
DLosc

2

ジャプト -R24 23 17 15バイト

配列を出力します。先頭の改行と各行の先頭と末尾のスペースが含まれます。

IòUc ÏçSiXd¹iYç

試して

  • Oliverの助けを借りて1バイトを保存し、初期配列を生成するより良い方法を指摘してくれた彼にさらに6 バイト感謝します。

1

、18バイト

F⁺⌕αθ¹«P×⁺§αι ⁺ι¹↘

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


いや、05AB1Eが炭を打つことはできません...:P
完全に人間


悲しいことに任意の先頭の空白は許可されていません。さもないE…·?θ⁺× κ⪫× κιと、14バイトでジョブを実行します。
ニール

@Neil 1つの先頭の空白が許可されます?が、どのようにそこに入れられたのかわかりません。A代わりに私は思うはずです。ああ、ちょっと待って。
エリックアウトゴルファー



1

JavaScript、102 94バイト

Neilのおかげで2バイト節約

f=
a=>[...Array(parseInt(a,36)-9)].map((a,b)=>''.padEnd(b).padEnd(b*3+1,(b+10).toString(36)+' '))

console.log(f('k').join`\n`)


1

網膜、51バイト

^.
$&$&
}T`L`_L`^.
.
$.`$* $&$.`$* ¶
+`(\w) \B
$&$1

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

^.
$&$&

(最初の)文字を複製します。

}T`L`_L`^.

アルファベット順に1回転するか、重複している場合は削除しAます。複製するまで複製と回転を続けAます。複製が完了すると、削除によって複製が取り消され、ループが完了します。

.
$.`$* $&$.`$* ¶

各文字を、両側に埋め込まれた文字の行に置き換えます。

+`(\w) \B
$&$1

既存の文字の右側にあるパディングスペースのすべてのペアの間に重複した文字を挿入します。



1

、15バイト

F…·AS«P⪫E…@ιι ↘

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

 …·AS           Inclusive character range from A to the input
F    «          Loop over each character
         …@ι    Exclusive range from @ to the current character
        E   ι   Replace each element with the current character
       ⪫        Join with spaces
      P         Print without moving the cursor.
              ↘ Move the cursor down and right.

追加のパディングが有効な場合、これは14バイトで機能します。

E…·?θ⁺× κ⪫× κι

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


1

Mathematica、70バイト

(T=Table)[""<>{" "~T~i,T[Alphabet[][[i]]<>" ",i]},{i,LetterNumber@#}]&

小文字

リストを出力します

修正については@ngenisisに感謝

バージョンの場所Column@先頭に


1

Excel VBA、72バイト

セルから入力を受け取りA1、VBEイミディエイトウィンドウに出力する匿名VBEイミディエイトウィンドウ関数

For i=1To Asc([A1])-64:[B1]=i:?Space(i-1)[REPT(CHAR(B1+64)&" ",B1)]:Next

1

Pyth、17バイト

.e+*kd*+bdhk<GhxG

ここで試してみてください(プリティプリント版)。


これはどのように作動しますか?

  • hxG -小文字のアルファベットで入力のインデックスを取得します。

  • <G -アルファベットからの入力後のすべての文字をトリミングします。

  • .e-列挙マップ。インデックスがk、文字がのトリムアルファベット上にマップしますb

  • *kd- kスペースを追加します。

  • +bd- b+スペース(現在の文字+スペース)。

  • *...hk-繰り返しk+1ます。

  • +(...)(...) -連結します。


1
One of my favorite things about Pyth is writing an answer and finding that someone wrote the same answer, character for character. It hits that Python "there is a best answer" spot perfectly!
Dave

@pizzakingme Yeah, I wonder if I can do better
Mr. Xcoder

the space addition feels wrong, I think better is possible
Dave

@pizzakingme I could get .e+*kdjd*bhk<GhxG as 17 bytes as well
Mr. Xcoder

16 bytes: .e+*kd*+bdhkhcGQ
Dave

1

C++ (gcc), 164 bytes

#include<iostream>
#define f for(int i=0;i<o-'`';i++)
using namespace std;int main(){char c;cin>>c;for(char o='a';o<=c;o++){f cout<<' ';f cout<<o<<' ';cout<<'\n';}}

My first attempt after a long time lurking!

Ungolfed code below:

#include <iostream>

using namespace std;
#define f for (auto i = 0; i < output - '`'; i++)

int main()
{
  char input;

  cin >> input;

  for (char output = 'a'; output <= input; output++)
  {
    f cout << ' ';

    f cout << output << ' ';

    cout << endl;
  }
}

Try it online!


I know there has to be a bunch of golfing things to do, but so far, that's the smallest I've gotten.
Drise
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.