Tüm 97 üssün bize ait


18

Birçok programlama dili yalnızca yazdırılabilir ASCII, sekmeler ve yeni satırlar kullanılarak yazılır. Bu 97 karakter daha sonra 8 bit baytta saklanır (bunlar aslında 256 farklı karakteri tutabilir!), Özellikle de her baytın önemli olduğu kod golfünde! Bu meydan okumada, taban dönüşümünü kullanarak puanınızı azaltabileceksiniz.

Meydan okuma

Programınız / işleviniz, bir dize veya karakter dizisini girdi olarak alır ve bunu temel bir 97 sayısı olarak yorumlar. Daha sonra bunu bir taban 256 numarasına dönüştürür ve bu sayıyı temsil etmek için gerekli sembollerin sayısını (yani bayt) sayar. Bu sayı, programınızın / fonksiyonunuzun çıkış / dönüş değeri olacaktır.

Base-2 ve base-10 (ikili ve ondalık) kullanan basit bir örnek: giriş ise 10110, 10110 2 = 22 10 (çıkışı temsil etmek için iki basamak gerekir) olduğundan çıkış 2 olur. Benzer şekilde, 1101, 2 13 olur 10 da 2 olan bir çıkış verir ve 110 2 6 olur 10 böylece daha sonra çıkış 1 olacaktır.

Giriş dizesi, yazdırılabilir 95 ASCII karakterin yanı sıra , temel dönüşümünüz için 97 sembolün kaynak alfabesini oluşturan yeni satır \nve değişmez sekmeyi içerebilir . Tam alfabe Bu şekilde olacaktır (ikame ve gerçek değişmez sekmesi ve yeni satır ile, not yeni satır aşağıdaki hazır alan) :\t\t\n

\t\n !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Bu alfabenin sırasının önemli olduğuna dikkat edin: örneğin, taban-97 \tondalık sayıya 0ve !ondalık sayıya karşılık gelir 3.

Bazı test senaryoları: (boş bir dize kullanmanıza gerek yoktur)

Input                             Output
'example@domain.com'                  15
'All your base are belong to us!'     26
'       abcd'                          9
'~      abcd'                         10
'ABCDEFGHIJK'                          9
'zyxwvutsrpq'                         10
'{".~"}.~'                             7
'\t\t\t\t\t\t\t\t'                     1 (with \t a literal tab; the result is 0, which can be represented with 1 byte)
'!\t\t\t\t\t\t\t\t'                    7 (with \t a literal tab)

puanlama

  1. Girişinizde yalnızca yazdırılabilir ASCII, yeni satır ve / veya sekme kullanılıyorsa: Girdi olarak kendi kaynak kodu verildiğinde programınızın puanı programınızın çıktısı olacaktır.

  2. Girişinizde yazdırılamayan ASCII, yeni satır veya sekme olmayan karakterler kullanılıyorsa: Programınızın puanı, golfü gibi bayt sayısıdır .


3
Bu eski meme daha iyi bir başlık öneriniz varsa , yorumlarda göndermek için çekinmeyin!
Ağustos'ta Sanchises

Bu zorluğun sadece sekmelerden oluşan bir dil cevabı ile kazanılabileceğini fark ettiniz mi?
pppery

@ppperry Dürüst olmak gerekirse, bu tür cevaplar için çok az sabrım var. Evet, bunu fark ettim, ama birisi programı gerçekten sistemlerinde saklayana kadar, benim oyumu almayacak.
Ağustos'ta Sanchises

Yanıtlar:


7

Python 2 , puan 73 72 71

Edit: -1 @Jonathan Allan sayesinde

def f(l,z=0):
	for i in map(ord,l):z+=i-[30,9][i<32];z*=97
	print(len(bin(z))-2)/8or 1

Çevrimiçi deneyin!


/bence sadece biri iyi olmalı
Jonathan Allan

or 1|1bu örnekle değiştirilebilir .
Jonathan Allan

1
@JonathanAllan Farklı (yanlış) sonuçlar verir.
Ağustos'ta Sanchises

Oh, evet bu olacak.
Jonathan Allan

@JonathanAllan Kesinlikle. Garip sonuçlar için çalışır, ancak çift sonuçlara bir tane ekler.
Ağustos'ta Sanchises

5

Japt , skor 19 (23 bayt)

nHo127 uA9 md)sG l /2 c

Çevrimiçi test edin!

Tesadüf olarak, bunun ASCII olmayan karakterlerle bile golf oynayabileceğini sanmıyorum ...

açıklama

UnHo127 uA9 md)sG l /2 c   Implicit: U = input string, A = 10, G = 16, H = 32
  Ho127                    Create the range [32, 33, ..., 126].
        uA9                Insert 9 and 10 at the beginning of this range.
            md             Map each to a character, yielding ["\t", "\n", " ", "!", ... "~"].
Un            )            Convert U to a number via this alphabet ("\t" -> 0, "~" -> 96, etc.)
               sG          Convert this number to a base-16 (hexadecimal) string.
                  l        Take the length of this string.
                    /2 c   Divide by two and round up to get the length in base-256.
                           Implicit: output result of last expression

5

Jelly ,  18  17 bayt - puan  18  17

Outgolfer Erik sayesinde -1 bayt (çeviri için bir liste listesine gerek yok)

O“µœ½þ‘y_30ḅ97b⁹L

Çevrimiçi deneyin!

Nasıl?

O“µœ½þ‘y_30ḅ97b⁹L - Link: list of characters
O                 - convert from characters to ordinals
 “µœ½þ‘           - code-page indices = [9,30,10,31]
       y          - translate (9->30 and 10->31)
        _30       - subtract 30
           ḅ97    - convert from base 97
               ⁹  - literal 256
              b   - convert to base
                L - length of the result

- Sadece ASCII ile elde ettiğim en iyi puan 29'dur :

O10,31,9,30y_30Ux"J_1 97*$$$SSb256L

- bu da son derece verimsiz. Yukarıdaki gibi sıraları çevirir, ancak taban 97'den dönüşüm, doğrudan çarpma kullanmak yerine değerleri tekrarlayarak ve toplayarak elde edilir - yani dönüştürmek {".~"}.~için ayarlanmış indeksleri alır, [93,4,16,96,4,95,16,96]sonra tersine çevirir ( U) ve bunları yapmak [[96,96,..., 97⁷ times ...,96],[16,16,... 97⁶ times ...16],[95,95,... 97⁵ times ...95],[4,4,... 97⁴ times ...4],[96,96,... 97³ times ...96],,[16,16,... 97² times ...,16],[4,4,... 97 times ...4],[93]]ve sonra toplamak için tekrarlar , taban 256'ya dönüştürür ve uzunluğu alır (bellekte yer kalmamışsa: p).


3

J , 36 bayt, puan = 30

256#@(#.inv)97x#.(u:9,10,32+i.95)&i.

Çevrimiçi deneyin!

J, temel öğeleri için yalnızca 7 bit ASCII karakterlerini kullanır.

açıklama

256#@(#.inv)97x#.(u:9,10,32+i.95)&i.  Input: string S
                 (              )     Form 7-bit ASCII alphabet
                            i.95        Range [0, 95)
                         32+            Add 32
                    9,10,               Prepend 9 and 10
                  u:                    Convert to characters
                                 &i.  Index of each char in S in that alphabet
            97x#.                     Convert from base 97 to decimal
256   #.inv                           Convert to base 256
   #@                                 Length

3

Gaia , 14 bayt, puan 14

9c₸c₵R]$;B₵rBl

Çevrimiçi deneyin!

açıklama

9c              Push a tab character. (done like this since tab isn't in the codepage)
  ₸c            Push a linefeed character.
    ₵R          Push all printable ASCII characters.
      ]$        Concatenate everything together.
        ;       Copy second-from-top, implicitly push input. Stack is now [ASCII input ASCII]
         B      Convert input from the base where the ASCII string is the digits.
          ₵rB   Convert that to the base where the code page is the digits (base 256).
             l  Get the length of the result.
                Implicitly output top of stack.

Yalnızca ASCII

Bu sadece ASCII kullanarak elde edebileceğim en iyi şey, 19 puan verdim:

9c10c8373c'R+e]$;B256Bl

Zorluk girdinin dönüştürülmesidir. Base-97 sisteminden dönüştürmenin tek makul yolu kullanmaktır B, çünkü eşleme ASCII dışı gerektirir ¦. Ayrıca, şu anda cbir sayı aralığı üzerinde eşleme olmadan bir karakter aralığı yapmanın bir yolu yoktur ve bu da aynı soruna sahiptir. ₵RGörebildiğim en iyi çözüm ipi oluşturmak ve değerlendirmektir.


Bunun sadece bir ASCII versiyonunu yapmaya çalıştınız mı? Puanınızı geliştirmeyebilir (herhalde ₵Rve açıkçası ₵rolmasına rağmen değiştirilmesi kolay değildir ), ancak nasıl karşılaştırıldığını görmek ilginç olabilir.
Ağustos'ta Sanchises

@Sanchises yaptım, ama en kısa ben 19 ile sonuçlandı, çünkü kod noktası 8373 ve ben sadece ASCII karakter aralıkları yapamam, bu programın çoğu ASCII olduğu için biraz sinir bozucu.
Business Cat

Evet, sadece ASCII olmaya çok yakın. Kısa soru: Gaia'yı bilmiyorum ama şimdi onunla biraz oynadım, ancak sayı listesini dönüştürmenin bir yolu var mı? ( cher karaktere uygulanır ancak uygulanır, $sadece tüm sayıları gösterir)
Ağustos'ta Sanchises

Sen haritaya olurdu @Sanchises colacağını listesi üzerinde
İş Kedi

Aslında ₵ryerine koymak kolaydır çünkü sadece kullanabiliyordum 256, sadece 1 bayt daha kısa olduğu ve programın ASCII olmadığı için kullandım.
Business Cat

3

Python 2 , puan 60

lambda s:len(bin(reduce(lambda a,c:a*97+ord(c)-[30,9][c<' '],s,0)))+5>>3

Çevrimiçi deneyin!

Base-97 ile eşleme

Bir karakterin değeri şu şekilde elde edilir ord(c)-[30,9][c<' ']: ASCII kodu, sekmeler ve yeni satırlar için eksi 9 ( ' 'sözlükbilimsel olarak önce gelir ) veya diğer her şey için eksi 30.

Bir sayıya dönüştürme

reduceDizeyi bir sayıya dönüştürmek için kullanırız . Bu, bilgi işlem ile eşdeğerdir

a = 0
for c in s: a = a*97+ord(c)-[30,9][c<' ']
return a

Hesaplama tabanı-256 uzunluk

Dönüş değeri bin, bir şekilde şöyle görünen bir dizedir:

"0b10101100111100001101"

Uzunluğunu arayın L. n-Bit ikili gösterimine sahip bir değerin ceil(n/8)-bit temel-256 gösterimi vardır. Biz hesaplayabilir nolarak L-2; Ayrıca, = ceil(n/8)olarak da yazılabilir , bu yüzden cevabımız = .floor((n+7)/8)n+7>>3L-2+7>>3L+5>>3

Girdi dizesinin 0 değerine sahip olduğu durumda, bindöndürdüğü gibi doğru işlenir "0b0", bu nedenle 3+5>>3= 1 döndürürüz .



@HalvardHummel oldukça emin olmalıdır c>=' 'illâ 23 yerine sıradan kod Golfte 2'ye alanı map c>'\x1f'(ham bayt) bana yardımcı olurdu, ama o ... yazdırılabilir ASCII değil
Lynn

Haklısın, benim hatam
Halvard Hummel

2

APL, skor 24 (bayt *)

⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞

Varsayılanı varsayar ⎕IO←1, aksi takdirde sadece ¯31'i ¯30 olarak değiştirin.

Açıklama:

                   ⎕AV⍳⍞  Read a string and convert it to ASCII codepoints + 1
               ¯31+       Subtract 31, so that space = 2, bang = 3, etc.
           118|           Modulo 118, so that tab = 97, newline = 98
        97|               Modulo 97, so that tab = 0, newline = 1
     97⊥                  Decode number from base 97
⌈256⍟                     Ceiling of log base 256, to count number of digits

Örnekler:

      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
example@domain.com
15
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
All your base are belong to us!
26
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
       abcd
9
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
~      abcd
10

________________
*: APL ⎕AV, Unicode yerine kendi eski karakter kümesinde (ile tanımlanır ) yazılabilir ; bu nedenle yalnızca ASCII karakterleri ve APL sembolleri kullanan bir APL programı 1 karakter = 1 bayt olarak puanlanabilir.


Değil tüm APL sembolleri olan ⎕AVgibi (en azından Dyalog için) . Bununla birlikte, tüm sembolleriniz her biri bir bayt olarak sayılır. Yani her APL sembolü = sizin gibi 1 bayt dipnotta belirtilmez. (Sadece bunu sana bildireceğimi düşündüm.) Ayrıca, hangi APL lehçesini kullanıyorsun?
Zacharý

2

Perl 5,76 + 1 (-F) = 77 bayt

}{$d+=97**(@F+--$i)*((ord)-(/	|
/?9:30))for@F;say!$d||1+int((log$d)/log 256)

Çevrimiçi deneyin!

Nasıl?

Örtük olarak, girişin ( -F) karakterlerini ayırın ve bunların tümünü @F içine kaydedin. Örtülü whiledöngüyü kapatın ve yeni bir blok başlatın ( }{) ( Teşekkürler, @Dom Hastings! ). Her karakter için değerini uygun güçle 97 ile çarpın. Logaritma kullanarak taban 256'daki toplamın boyutunu bularak karakter sayısını hesaplayın.




1

MATL (19 bayt), puan 16

9=?1}G9tQ6Y2hh8WZan

Giriş dizesindeki yazdırılamayan karakterler (sekme, yeni satır) ASCII kodlarını ( 9, 10) dizenin geri kalanıyla kapatarak girilir .

İlk bölüm 9=?1}Gyalnızca Za(temel dönüşüm) işlevindeki bir hata nedeniyle gereklidir , bu da girdi yalnızca "sıfırlar" dan oluştuğunda başarısız olmasına neden olur (buradaki sekmeler). Dilin bir sonraki sürümünde düzeltilecektir.

açıklama

9=      % Implicitly input a string. Compare each entry with 9 (tab)
?       % If all entries were 9
  1     %   Push 1. this will be the ouput
}       % Else
  G     %   Push input string again
  9     %   Push 9 (tab)
  tQ    %   Duplicate, add 1: pushes 10 (newline)
  6Y2   %   Push string of all printable ASCII chars
  hh    %   Concatenate twice. This gives the input alphabet of 97 chars
  8W    %   Push 2 raised to 8, that is, 256. This represents the output
        %   alphabet, interpreted as a range, for base conversion
  Za    %   Base conversion. Gives a vector of byte numbers
  n     %   Length of that vector
        % End (implicit). Display (implicit)

1

Befunge-93, 83 79 bayt, puan 74 65

<v_v#-*52:_v#-9:_v#`0:~
 5v$
^6>>1>\"a"* +
 >*- ^   0$<
0_v#:/*4*88\+1\ $<
.@>$

Burada deneyin!

Program ilk olarak girişi bir baz-97 numarasına dönüştürür ve daha sonra bir baz-256 numarası için kaç basamak gerektiğini sayar. Bu nedenle, taban-97 sayısı çok büyük, o kadar büyük ki TIO büyük değerler için maksimum 8 değeri verecek; ancak, JS yorumlayıcısı umursamaz ve doğru değeri verir.

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.