Karakterleri azar azar sayın!


19

Basit bölüm: Yalnızca yazdırılabilir ASCII karakterlerini (boşluk - tilde) içeren bir giriş dizesi verildiğinde, her karakterin oluşum sayısını sayın ve sonucu uygun bir formatta döndürün. Bir dize için sonuç a%hda7agibi bir şey olmalıdır: a:3, %:1, h:1, 7:1, d:1. Sıralama gerekli değildir, sınırlayıcılar ve formatlar isteğe bağlıdır, ancak hangi sayının hangi karaktere karşılık geldiğini kolayca anlamak gerekir. Giriş dizesinde olmayan karakterleri dahil etmeyeceksiniz ( a:3, b:0, c:0, d:1, ...TAMAM değil).

Gerçek zorluk:

Kodunuzdaki her karakteri 8 bitlik bir ikilik sayıya (veya UTF-16 veya benzeri kullanıyorsanız 16 bit) dönüştürün ve konumundan başlayan her karakteri numaralandırın 0.

Her karakter için ( ilisteleyicisi olan), i%7-bit 1 olmalıdır olacak 1. Bitler sağdan numaralandırılmıştır. Diğer tüm bitler ne istersen olabilir.

Örnek olarak aşağıdaki kodu kullanalım:

[f]-xif)#f

Bunu ikili dosyaya çevirerek aşağıdaki diziyi elde ederiz. Temsil eden ilk sayı ( [bir sahip 1bir sorun yok böylece, 0'th konumunda. Temsilen ikinci sayı ( fbir sahiptir 1böylece bir ok çok olduğunu, 1'st konumunda. Böyle devam edin ve göreceksiniz Yukarıdaki kod geçerli.

C 76543210 Bit numarası
- -------- ----------
[0101101 1   0 - Tamam
f 011001 1 0 1 - Tamam
] 01011 1 01 2 - Tamam
- 0010 1 101 3 - Orta
x 011 1 1000 4 - Tamam
i 01 1 01001 5 - Tamam
f 0 1 100110 6 - Tamam
) 0010100 1   0 - Tamam
# 001000 1 1 1 - Tamam
f 01100 1 10 2 - Tamam

Kodu şu şekilde değiştirirsek: ]f[-xif)#fdizinin şu başlangıcını alırız:

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

Görüldüğü gibi, üçüncü karakter [bir yok 12 pozisyonunda (sıfır endeksli) içinde ve bu kod nedenle geçerli değil.

Test senaryoları:

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

Herhangi bir makul çıktı biçimi tamam (sizin için en uygun olanı). Örneğin: :7, !:1, ":2, #:3, &:1, /:1, T:1, a:2 ...veya [ ,7][!,1][",2][#,3][&,1].... Çıktı herhangi bir standart şekilde (fonksiyondan dönüş, STDOUT'a basılmış vb.)

1i modül 7.


Bu , bu yüzden bayt içindeki en kısa kod ref kazanacaktır .


6
Biraz yardım etmek için, bu n%7noktada kullanmanıza izin verilen karakterler > pastie.org/pastes/10985263/text
TidB

@TidB web sitesi çevrimdışı mı ??
Çubuk

1
@ Çubuk Evet, pastie'nin bazı sorunları var gibi görünüyor. Bunun yerine pastebin'i deneyin
TidB

1
Unutmayın ki yeni satır 00001010. Çok faydalı olabilir! :)
Stewie Griffin

1
Bazı fazla yardımcı olmak için, burada UTF-8 kodlama için kullanabileceğiniz bir doğrulama komut dosyası. Sadece girişi örnek gibi bir dizgide kapsülleyin.
AdmBorkBork

Yanıtlar:


6

Pyke, 1 6 bayt

1cn;1c

Burada deneyin!

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

Bu kodun yarısı sadece operasyon yok ...

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

@EriktheOutgolfer geçerli bir noktaya sahip. Bu aslında Pyke normal bir dize sürece bu giriş biçiminin geçerli olduğunu sanmıyorum. O zamandan beri MATLAB / Octave'da geçerli bir giriş dizesi olurdu 'abc'==['a','b','c'], bu yüzden Pyke'de de olabilir ...?
Stewie Griffin

@StewieGriffin Pyke normalde dizeleri bu şekilde işlemez. Bu doğru değilse, giriş biçimini değiştirmeyi görebilirim, ancak bir karakter listesi kabul edilen varsayılanlar listesinin altında olsa da, bunun altında hile olarak sayılabilir
Blue

5
1 baytlık bir yerleşik ile meydan okuduğunuz için özür dilerim Gerçekten üzgün olduğunu düşünmüyorum ve meydan okuma bu kırılmış değil :-)
Luis Mendo

2
Bu bir karakter listesi değil; dizelerin bir listesi. Karakter listeleri + 17 / -0 iken , dize listeleri + 2 / -2'dir , bu nedenle varsayılan olarak kabul edilemez. @StewieGriffin geçerli olup olmadığına karar vermelidir.
Dennis

1
@StewieGriffin daha iyi?
Mavi

6

Pyth, 12 8 7 bayt

@Loovjo sayesinde -1 bayt

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

ikili gösterim

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

Burada deneyin


Güzel! :) 13için çıktı 111garip görünüyor, ama yanlış anlaşılamaz ( 131 kez kullanılan herhangi bir tek karakter olamaz ), bu yüzden bu tamamen geçerli!
Stewie Griffin

4

Befunge-93, 150 bayt

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

Çevrimiçi deneyin!

Bunu mümkün olduğunca golf oynadığım düzenli bir Befunge programı olarak yazmaya başladım. Daha sonra programdaki çeşitli karakterlerin sadece izin verilen konumlarda göründüğünden emin olmak için dolgu ekledim. Bu dolgu, Befunge-93'te desteklenmeyen komutların yok sayıldığı gerçeğine dayanıyordu, bu yüzden bitleri gerekli konumlarla hizalanmış (kullanılma sırası) olan kullanılmayan karakterlerin bir sırasına ihtiyacım vardı ={}{}{}.

Karmaşık bit, doğru bir şekilde hizalamak için gereken çizgiler arasındaki çeşitli dalların (örneğin, vbir satırdaki <okun altındaki okla hizalanması gerektiği) idi. Bu, köprü komutunun ( #) bitişik dallanma okundan ayrılamamasıyla daha da karmaşıktı . Başlangıçta dolguyu programlı olarak oluşturmayı denedim, ama sonunda çoğunlukla manuel bir süreçti.

Programın büyüklüğü nedeniyle tam karakter analizini listelemeyeceğim, ancak bu başlangıçtan ve sondan bir örnek:

= 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

Satır sonları yeni satır karakteri olarak kabul edilir, bu nedenle 1 veya 3 konumunda olur.


3

MATL , 17 bayt

u"G91x@=zD91x@uRD

Yeni satırla ayrılmış sayımı ve ardından karşılık gelen karakteri görüntüler. Büyük zorluğudur @olan 0b01000000; Umarım onsuz yapmanın bir yolunu bulabilirim.

Çevrimiçi deneyin!

Açıklama:

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 bayt (şüpheli çıktı)

Yığında sadece iki satır vektör bırakılmasına izin verilirse ( bu Meta yazısına göre işlev benzeri davranış ),

u"G91x@=zv]v!Gu

Ancak burada, çıktı düzgün bir şekilde sıralanmamıştır.


Yığın programın sonunda örtülü olarak yazdırılır ve çıktı biçimi meydan okumaya göre esnektir, bu nedenle ikinci yaklaşımla ilgili herhangi bir sorun görmüyorum
Luis Mendo

@LuisMendo Emin değilim. 90 farklı giriş karakteriniz varsa, hangi tuşun hangi karaktere ait olduğunu söylemek zor olacaktır, bu yüzden Sanchises'e hayır demem gerektiğini düşünüyorum. - Stewie Griffin 2 saat önce (sayımları bireysel olarak önerilen melezine cevap verdi D'd, Guprogram sonunda) ve 15 bayt sürümü yeterince farklı ise emin değilim.
Sanchises

@StewieGriffin 15 baytlık sürümün ( çevrimiçi deneyin! ) Uygun olup olmadığını görebilir misiniz?
Sanchises

Stewie'nin bu yazıdaki ping'i alacağından emin değil, meydan okuma postasını daha iyi kullan
Luis Mendo

Seni bilmiyorum, ama burada kolayca anlaşıldığını sanmıyorum :) 17 baytlık çözümü tercih ederim, ama cevapta 15 baytlık bir tutmak için çekinmeyin! Bu arada güzel cevap :)
Stewie Griffin

1

CJam, 14 bayt

q__|_ @sfe=]zp

Burada deneyin.

ASCII kodlarını gereken kalıba uydurmak için eklenen @ve ssonraki boşluk karakterleri doldurulur: boşluk hiçbir şey yapmaz ve ssadece bir dizeyi bir dizeye dönüştürür. Bunun dışında, bu meydan okuma görevinin oldukça basit ve basit bir uygulamasıdır:

q_ "girişi oku ve bir kopyasını oluştur";
  _ | msgstr "kopyada tekrarlanan karakterleri daralt";
    _ "daraltılmış dizenin bir kopyasını kaydet";
      @ "orijinal giriş dizesini yığının en üstüne çekin";
       s "(burada hiçbir şey yapmaz)";
        fe = "daraltılmış dizedeki her karakter için ... değerini say";
                 "... orijinal dizede gerçekleşme sayısı";
           ] z "sayıları daraltılmış dizenin kaydedilmiş kopyasıyla eşleştir";
             p "sonucun dize olarak temsilini yazdır";

Girdi için foobar123bu kod çıkar [['f 1] ['o 2] ['b 1] ['a 1] ['r 1] ['1 2] ['2 2] ['3 1]]. Sayımları bir satırda ve karşılık gelen karakterleri başka bir satırda yazdırıyorsanız, aşağıdaki gibi:

[1 2 1 1 1 2 2 1]
fobar123

kabul edilebilir bir çıktı biçimi olarak kabul edilirse, ]ztoplam 12 bayt için iki bayt kaydedilmeyebilir . Evet, kısaltılmış kod yine de bit örüntüsü gereksinimini geçecektir.

Ps. Ben de bu meydan okuma için basit bir kaynak kodu denetleyicisi yazdı . Girdi olarak bir kod satırı verildiğinde, önce bu satırı tekrarlar ve ardından her satırı kendi ( n % 7) -inci ASCII bitiyle değiştirir . İkinci satır hepsi ise, giriş geçerlidir.


1

Jelly , Jelly'in kod sayfasında 6 bayt

ṢZṢṀŒr

Çevrimiçi deneyin!

Bu, (karakter, sayım) çiftlerinin listesini döndüren bir işlevdir. Onlar unsurları birleştirerek, standart çıkışa gönderilir eğer (Jelly Bunun yerine tam bir program daha bir fonksiyonu olarak bu tedavi etmek neden olan örneğin metin, gibi listeleri temsil eder. ( İşte eklenen bazı kod ile aynı program İşlevi çağırın ve daha sonra iç yapıyı standart çıktıya yazdırın, çıktının açık bir biçimde olduğunu kanıtlayın.)

İkili gösterim ve açıklama:

  76543210 

Ṣ 1011011 1 Girişin    karakterlerini sıralayın
Z 010110 1 0 Listeyi aktarın (1D, bu da onu etkili bir şekilde bir listeye sarar)
Ṣ 10110 1 11 Listeyi sıralayın (tek bir öğeye sahip olduğu için işlem yok)
M 1100 1 000 büyük (yani sadece) elemanı alın
Œ 000 1 0011 İki baytlık komutun ilk baytı
r 01 1 10010 Çalışma uzunluğu kodlaması

İkinci, üçüncü ve dördüncü karakterlerin birbirlerini iptal ettikleri ve sadece ihtiyacımız olan bit desenini korumak için orada oldukları görülebilir. Œrolsa da, çok kullanışlı ve programı kullanabilmemiz için muhtemelen yerleşik olmayan bir sorunu çözmeye çalışmaktan daha kısa bir program veriyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.