文字を数える-少しずつ!


19

単純な部分:印刷可能なASCII文字(スペース-チルダ)のみを含む入力文字列が与えられた場合、各文字の出現回数をカウントし、便利な形式で結果を返します。文字列の結果はa%hda7a次のようになりますa:3, %:1, h:1, 7:1, d:1。並べ替えは不要で、区切り文字と形式はオプションですが、どの数字がどの文字に対応するかを簡単に理解する必要があります。入力文字列にa:3, b:0, c:0, d:1, ...ない文字は使用しないでください(OKではありません)。

本当の課題:

コード内のすべての文字を8ビットの2進数(UTF-16などを使用している場合は16ビット)に変換し、で始まるすべての文字を列挙し0ます。

すべての文字(i列挙子)に対して、i%7-bit 1 はでなければなりませ1。ビットは右から番号が付けられています。他のすべてのビットは、何でも構いません。

次のコードを例として使用してみましょう。

[f]-xif)#f

これをバイナリに変換すると、以下の配列が得られます。表す最初の番号は([持っている11がOKであるように、0番目の位置に。表す第2の数は(f持っている1ので、1がOKがあまりにもあることを、第1 'の位置に。このように続けて、あなたが表示されます上記のコードが有効であること。

C 76543210ビット番号
--------- ----------
[0101101 1   0-OK
f 011001 1 0 1-OK
] 01011 1 01 2-OK
-0010 1 101 3-OK
x 011 1 1000 4-OK
i 01 1 01001 5-OK
f 0 1 100110 6-OK
)0010100 1   0-OK
#001000 1 1 1-OK
f 01100 1 10 2-OK

コードを]f[-xif)#f次のように変更すると、シーケンスの次の開始が取得されます。

C  76543210  Bit number
-  --------  ----------
]  01011101  0   <- OK
f  01100110  1   <- OK
[  01011011  2   <- Not OK
-  00101101  3   <- OK

ご覧のとおり、3番目の文字[12番目の位置(ゼロインデックス)にないため、このコードは無効です。

テストケース:

Input:
This is a string containing some symbols: ".#!".#&/#

Output:
   !  "  #  &  /  :  T  a  b  c  e  g  h  i  l  m  n  o  r  s  t  y  .
7  1  2  3  1  1  1  1  2  1  1  1  2  1  5  1  2  4  3  1  6  2  1  2

妥当な出力形式であれば問題ありません(最も便利なものは何でも)。あなたは、インスタンスのために持っている可能性があり::7, !:1, ":2, #:3, &:1, /:1, T:1, a:2 ...[ ,7][!,1][",2][#,3][&,1]...。出力は標準的な方法で行われます(関数からの戻り、STDOUTへの出力など)

1iモジュラス7


これはであるため、バイト単位の最短コードがrefに勝ちます。


6
少し助力するために、ここであなたがn%7その場で使用することを許可されているキャラクターがあります> pastie.org/pastes/10985263/text
TidB

@TidBウェブサイトはオフラインですか??
ロッド

1
@Rodええ、pastieにはいくつかの問題があるようです。代わりに
pastebinを

1
改行は00001010です。これも便利です!:)
Stewie Griffin

1
さらにいくつかの助けになるために、ここにいますが、UTF-8エンコーディングに使用できる検証スクリプト。例のように入力を文字列にカプセル化するだけです。
AdmBorkBork 16

回答:


6

パイク、1 6バイト

1cn;1c

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

1c     - chunk(size=1, input)
  n;1  - noop. 
     c - count(^)

このコードの半分は何もしません...

00110001 - 1
01100011 - c
01101110 - n
00111011 - ;
00110001 - 1
01100011 - c

@EriktheOutgolferには有効なポイントがあります。これが実際にPykeの通常の文字列でない限り、この入力形式は有効ではないと思います。以来'abc'==['a','b','c']、MATLAB / Octaveの有効な入力文字列になるため、Pykeにもあるかもしれません...?
スチューウィー・グリフィン

@StewieGriffinこれは、Pykeが通常文字列を処理する方法ではありません。それがうまくいかない場合、入力形式の切り替えについて見ることができますが、文字リストはデフォルトの受け入れられたリストの下にありますが、これはその下で不正行為としてカウントされる可能性があります
ブルー

5
1バイトのビルトインであなたのチャレンジを壊してすみません、実際にあなたを申し訳なく思っているとは思いません。そして、これによってチャレンジは壊されません:-)
ルイスメンドー

2
これは文字リストではありません。文字列のリストです。文字リストは+ 17 / -0にありますが、文字列リストは+ 2 / -2にあるため、デフォルトとして受け入れられることはほとんどありません。@StewieGriffinは、それが有効かどうかを判断する必要があります。
デニス

1
@StewieGriffinより良い?
ブルー

6

Pyth、12 8 7バイト

@Loovjoのおかげで-1バイト

m+d/Qd{
      { # remove all duplicated elements from the (implicit) input
m       # map each element (d) of the parameter (the set from previous operation)
   /Qd  # count the occurrences of d in Q
 +d     # concatenate with d

バイナリ表現

0110110 1 m
001010 1 1 +
01100 1 00 d
0010 1 111 /
010 1 0001 Q
01 1 00100 d
0 1 111011 {

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


いいね!:)出力13のための111奇妙なルックスが、それは誤解することはできません(任意の一文字があることはできません13、これは完全に有効ですので、のは、1時間を使用したことを)!
スチューイーグリフィン

4

Befunge-93、150バイト

={<{p+}3/}*77\%*7{7:\+{}{1g}+3/*77\%*7{7:}=:_{}{}={}{}{v#{}{}`x1:~
}-}=*}{2*}97}:<$}={$_v#}!:-*84g+3/*77\%*7{7:}=:}:}+}1{}<_{@#
}{}{}={}{}{}={^.},\={<

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

私はこれを通常のBefungeプログラムとして書くことから始めました。可能な限りゴルフをしました。次に、パディングを追加して、プログラム内のさまざまな文字が許可された位置にのみ表示されるようにしました。このパディングは、サポートされていないコマンドがBefunge-93で無視されるという事実に依存していたため、必要な位置にビットが揃えられた未使用文字のシーケンスが必要でした(使用したシーケンスは={}{}{})。

複雑な点は、行間のさまざまな分岐が正しく整列vする必要があることです(たとえば、1行の矢印は、その<下の矢印と整列する必要があります)。これは、ブリッジコマンド(#)が隣接する分岐矢印から分離できないという事実によってさらに複雑になりました。最初はプログラムでパディングを生成しようとしましたが、最終的にはほとんど手動プロセスでした。

プログラムのサイズのために、完全な文字分析をリストするつもりはありませんが、これは最初と最後からのサンプルです:

= 00111101 0
{ 01111011 1
< 00111100 2
{ 01111011 3
p 01110000 4
+ 00101011 5
} 01111101 6
3 00110011 0
/ 00101111 1
...
{ 01111011 1
^ 01011110 2
. 00101110 3
} 01111101 4
, 00101100 5
\ 01011100 6
= 00111101 0
{ 01111011 1
< 00111100 2

改行は改行文字として扱われるため、位置1または3のいずれかになります。


3

MATL、17バイト

u"G91x@=zD91x@uRD

カウントを表示し、対応する文字をすべて改行区切りで表示します。最大の難易度は次のとおり@です0b01000000。私はそれなしでやる方法を見つけることができると思います。

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

説明:

u"  % Implicit input. Take (u)nique characters and loop (") over them.
G   % Take the input a(G)ain
91x % Filler: push 91, delete immediately.
@   % Push current character of loop
=   % Check for equality with earlier G
z   % Count number of equal characters
D   % Display
91x % More filler!
@   % Get loop character again
uR  % Filler: two NOPs for the single-character @
D   % Display. Implicitly end loop.

MATL、15バイト(疑わしい出力)

スタックに2つの行ベクトルだけを残すことが許可されている場合(この Meta投稿による関数のような動作)、次のようになります。

u"G91x@=zv]v!Gu

しかし、ここでは、出力はそれほどきちんと順序付けられていません。


スタックは、暗黙的にプログラムの最後に印刷されたと私は第二のアプローチに問題が表示されないように、出力形式は、課題ごとのように柔軟性のあるさ
ルイスMendo

@LuisMendoよく分かりません。90の異なる入力文字がある場合、どのキーがどの文字に属しているかを判断するのは難しいので、その1つのSanchisesにはノーと言わなければならないと思います。- Stewieグリフィンは2時間前に提案したハイブリッド(個別にカウントに対する返信だったDD」、Guプログラムの終了時に)、および15バイトのバージョンが十分に異なっている場合、私はわかりません。
Sanchises

@StewieGriffin 15バイトバージョン(オンラインで試してみてください!)で問題ないかどうかを確認できますか?
Sanchises

必ずそれStewieは、この記事でpingを取得する、より良いチャレンジポストを使用しない
ルイスMendo

あなたのことは知らないが、ここでは簡単に理解できるとは思わない:) 17バイトの解決策を好むが、答えに15バイトの解決策も自由に入れておく!ちなみにいい答え:)
Stewie Griffin

1

CJam、14バイト

q__|_ @sfe=]zp

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

前にスペース@sスペースが何もしない、と:それの後には、ASCIIコードが必要なパターンに合うようにするために挿入されたフィラー文字ですs単なる文字列に文字列を変換します。それ以外は、これはチャレンジタスクの非常にシンプルで簡単な実装です。

q_「入力を読み取り、そのコピーを作成する」。
  _ | 「コピーで繰り返される文字を折りたたむ」。
    _「折りたたみ文字列のコピーを保存」;
      @「元の入力文字列をスタックの先頭にプル」;
       s "(ここでは何もしません)";
        fe = "折りたたまれた文字列の各文字について、...を数えます";
                 "...元の文字列で発生する回数";
           ] z "カウントを折りたたみ文字列の保存されたコピーとペアにします";
             p "結果の文字列表現を印刷する";

入力のfoobar123場合、このコードは出力します[['f 1] ['o 2] ['b 1] ['a 1] ['r 1] ['1 2] ['2 2] ['3 1]]。次のように、ある行にカウントを、別の行に対応する文字を単に印刷する場合:

[1 2 1 1 1 2 2 1]
fobar123

は許容可能な出力形式と見なされ、]z2バイトを節約するために省略できます(合計12バイト)。はい、短縮コードはビットパターン要件を満たします。

追伸 また、この課題のために簡単なソースコードチェッカーを作成しました。入力としてコード行を指定すると、最初にその行をエコーし​​、次に各文字をその(n%7)番目のASCIIビットに置き換えて同じ行を印刷します。2行目がすべて1の場合、入力は有効です。


1

Jelly、Jellyのコードページの6バイト

ṢZṢṀŒr

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

これは、(文字、カウント)ペアのリストを返す関数です。彼らはあなたが機能ではなく、完全なプログラムとしてこれを処理するために持っている理由である、要素を連結して、標準出力に送られている場合(ゼリーは例えば、テキスト、などのリストを表している。(ここだに追加いくつかのコードと同じプログラムが関数を呼び出し、内部構造を標準出力に出力し、出力が明確な形式であることを証明します。

バイナリ表現と説明:

  76543210 

Ṣ1011011 1    入力の文字を並べ替える
Z 010110 1 0リストを転置します(1Dなので、リストに効果的にラップします)
Ṣ10110 1 11リストを並べ替えます(要素が1つしかないため、何もしません)
Ṁ1100 1 000最大(つまり唯一の)要素を取得
Œ000 1 0011 2バイトコマンドの最初のバイト
r 01 1 10010ランレングスエンコード

2番目、3番目、および4番目の文字は互いに打ち消し合っており、必要なビットパターンを維持するためだけに存在していることがわかります。Œrしかし、あまりにも便利であり、使用できるようにプログラムをパディングすると、おそらく組み込み機能なしで問題を解決しようとするよりも短いプログラムになります。

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