ฐาน 97 ทั้งหมดของคุณเป็นของเรา


18

ภาษาการเขียนโปรแกรมหลายภาษาเขียนขึ้นโดยใช้ ASCII, แท็บและการขึ้นบรรทัดใหม่ อักขระ 97 ตัวเหล่านี้จะถูกเก็บไว้ในไบต์ 8 บิต (ซึ่งจริง ๆ แล้วสามารถเก็บอักขระที่แตกต่างกัน 256 ตัว!) ซึ่งไม่มีประสิทธิภาพอย่างยิ่งยวด - โดยเฉพาะอย่างยิ่งในการเล่นโค๊ดกอล์ฟ ในการท้าทายนี้คุณจะสามารถลดคะแนนของคุณโดยใช้การแปลงฐาน

ท้าทาย

โปรแกรมของคุณ / ฟังก์ชั่นใช้เวลาสตริงหรือตัวอักษรอาร์เรย์เป็น input ซึ่งมันก็ตีความเป็นฐาน-97จำนวน จากนั้นจะแปลงเป็นตัวเลข ฐาน 256และนับจำนวนสัญลักษณ์ (เช่นไบต์) ที่จำเป็นสำหรับแสดงหมายเลขนี้ จำนวนนี้จะเป็นค่าผลลัพธ์ / ผลตอบแทนของโปรแกรม / ฟังก์ชั่นของคุณ

ตัวอย่างง่ายๆโดยใช้ base-2 และ base-10 (ไบนารีและทศนิยม): หากอินพุตคือ10110เอาต์พุตจะเป็น 2 ตั้งแต่ 10110 2 = 22 10 (ตัวเลขสองหลักที่จำเป็นในการแทนเอาต์พุต) ในทำนองเดียวกัน 1101 2กลายเป็น 13 10ให้ผลลัพธ์เป็น 2 เช่นกันและ 110 2กลายเป็น 6 10ดังนั้นผลลัพธ์จะเป็น 1

สตริงอินพุตสามารถมีอักขระ ASCII ที่พิมพ์ได้ทั้งหมด 95 ตัวรวมถึงบรรทัดใหม่\nและแท็บตัวอักษร\tซึ่งสร้างตัวอักษรแหล่งที่มา ของสัญลักษณ์ 97 สำหรับการแปลงฐานของคุณ ตัวอักษรที่แน่นอนจะเป็น(แทน\tและ\nด้วยแท็บตัวอักษรที่เกิดขึ้นจริงและขึ้นบรรทัดใหม่ให้สังเกตช่องว่างตัวอักษรตามบรรทัดใหม่) :

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

โปรดทราบว่าคำสั่งของตัวอักษรนี้เป็นสิ่งสำคัญ: ยกตัวอย่างเช่นฐาน-97 \tสอดคล้องกับทศนิยม0และสอดคล้องกับทศนิยม!3

ตัวอย่างทดสอบบางส่วน: (คุณไม่จำเป็นต้องจัดการกับสตริงว่าง)

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)

เกณฑ์การให้คะแนน

  1. หากรายการของคุณใช้เฉพาะ ASCII ที่พิมพ์ได้บรรทัดใหม่และ / หรือแท็บ: คะแนนของโปรแกรมของคุณจะเป็นผลลัพธ์ของโปรแกรมของคุณเมื่อได้รับซอร์สโค้ดของตัวเองเป็นอินพุต

  2. ถ้ารายการของคุณใช้ตัวอักษรใด ๆ ที่ไม่ ASCII พิมพ์ขึ้นบรรทัดใหม่หรือแท็บ: คะแนนของโปรแกรมของคุณเป็นเพียงจำนวนไบต์เหมือนในรหัสกอล์ฟ


3
หากคุณมีข้อเสนอแนะชื่อเรื่องที่ดีกว่าmeme ที่ล้าสมัยนี้โปรดโพสต์ในความคิดเห็น!
Sanchises

คุณรู้หรือไม่ว่าความท้าทายนี้สามารถเอาชนะได้ด้วยคำตอบ lenguage ซึ่งประกอบด้วยแท็บเท่านั้น
pppery

@ppperry พูดตามตรงฉันมีความอดทนน้อยมากสำหรับคำตอบดังกล่าว ใช่ฉันตระหนักถึงสิ่งนี้ แต่จนกว่าจะมีใครสามารถจัดเก็บโปรแกรมไว้ในระบบของพวกเขาได้จริงจะไม่ได้รับการอัปโหลดของฉัน
Sanchises

คำตอบ:


7

Python 2คะแนน73 72 71

แก้ไข: -1 ต้องขอบคุณ@Jonathan Allan

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

ลองออนไลน์!


หนึ่งเดียว/ควรจะโอเคฉันคิดว่า
Jonathan Allan

or 1อาจถูกแทนที่ด้วย|1ในกรณีนี้
Jonathan Allan

1
@JanathanAllan ที่ให้ผลลัพธ์ที่แตกต่าง (ผิด)
Sanchises

โอ้ใช่แล้วมันจะ>. <- คิดว่าจะได้เลขศูนย์เท่านั้น
Jonathan Allan

@JanathanAllan อย่างแน่นอน มันจะใช้งานได้กับผลลัพธ์ที่แปลก แต่จะเพิ่มหนึ่งผลลัพธ์เป็นคู่
Sanchises

5

Japtéคะแนน 19 (23 ไบต์)

nHo127 uA9 md)sG l /2 c

ทดสอบออนไลน์!

โดยบังเอิญฉันไม่คิดว่าสิ่งนี้สามารถเล่นกอล์ฟได้มากแม้จะมีตัวอักษรที่ไม่ใช่ ASCII ...

คำอธิบาย

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

เยลลี่ ,  18  17 ไบต์ - คะแนน 18  17

-1 ไบต์ด้วย Erik the Outgolfer (ไม่จำเป็นต้องมีรายการของการแปล)

O“µœ½þ‘y_30ḅ97b⁹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

- สิ่งที่ดีที่สุดที่ฉันได้รับจาก ASCII เพียงคะแนน29 :

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

- มันไม่มีประสิทธิภาพอย่างยิ่งเช่นกัน มันแปลว่าเลขชี้กำลังดังกล่าวข้างต้น แต่การแปลงจากฐาน 97 ทำได้โดยการทำซ้ำค่าและการสรุปมากกว่าการใช้การคูณโดยตรง - นั่นคือการแปลง{".~"}.~ให้ได้ดัชนีที่ปรับ[93,4,16,96,4,95,16,96]แล้วกลับรายการ ( U) แล้วทำซ้ำเพื่อสร้าง[[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]]ผลรวม แปลงเป็นฐาน 256 และรับความยาว (หากหน่วยความจำไม่เพียงพอ: p)


3

J , 36 ไบต์, คะแนน = 30

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

ลองออนไลน์!

J ใช้เฉพาะอักขระ ASCII 7 บิตสำหรับการตรวจสอบเบื้องต้น

คำอธิบาย

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 ไบต์, คะแนน 14

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

ลองออนไลน์!

คำอธิบาย

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.

ASCII เท่านั้น

นี่คือสิ่งที่ดีที่สุดที่ฉันจะได้รับจากการใช้เพียง ASCII ซึ่งให้คะแนน 19:

9c10c8373c'R+e]$;B256Bl

ความยากลำบากอยู่ในการแปลงอินพุต วิธีเดียวที่เหมาะสมที่จะแปลงจากระบบฐาน-97 คือการใช้งานตั้งแต่การทำแผนที่ต้องไม่ใช่B ASCII ¦นอกจากนี้ในขณะนี้ยังไม่มีวิธีในการสร้างช่วงอักขระโดยไม่ต้องจับคู่cกับช่วงตัวเลขซึ่งทำให้เกิดปัญหาเดียวกัน ทางออกที่ดีที่สุดที่ฉันเห็นคือการสร้างสตริง₵Rและการวิวัฒนาการ


คุณลองและสร้าง ASCII เวอร์ชั่นนี้เท่านั้นหรือไม่? มันอาจไม่ปรับปรุงคะแนนของคุณ (ฉันคิดว่า₵Rและ₵rไม่ใช่เรื่องง่ายที่จะเปลี่ยนแม้ว่าจะชัดเจน) แต่ก็น่าสนใจที่จะดูว่ามันเปรียบเทียบอย่างไร
Sanchises

@Sanchises ที่ฉันทำ แต่ที่สั้นที่สุดที่ฉันพบคือ 19 เพราะcode point 8373 และฉันไม่สามารถทำตัวละครใน ASCII ได้เช่นกันซึ่งค่อนข้างน่าผิดหวังเพราะโปรแกรมนี้ส่วนใหญ่เป็น ASCII
Business Cat

ใช่มันใกล้เคียงกับการเป็น ASCII เท่านั้น คำถามด่วน: ฉันไม่รู้ Gaia แต่ได้ลองเล่นกับมันมาบ้างแล้วตอนนี้ แต่มีวิธีแปลงรายการตัวเลขหรือไม่? (เหมือนcแต่นำไปใช้กับตัวละครแต่ละตัว$เพียงแค่แสดงตัวเลขทั้งหมด)
Sanchises

@Sanchises คุณจะต้องทำแผนที่cเหนือรายการซึ่งจะเป็น
Business Cat

จริงๆแล้ว₵rมันง่ายที่จะเปลี่ยนเนื่องจากฉันสามารถใช้256แทนได้ฉันใช้มันเพราะมันสั้นกว่า 1 ไบต์และโปรแกรมไม่ได้เป็น ASCII เท่านั้น
Business Cat

3

Python 2คะแนน 60

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

ลองออนไลน์!

การแม็พกับฐาน -97

ได้รับค่าของตัวละครโดย ord(c)-[30,9][c<' '] : รหัส ASCII ของมัน, ลบ 9 สำหรับแท็บและบรรทัดใหม่ (ซึ่งนำหน้าด้วย' 'พจนานุกรม) หรือลบ 30 สำหรับทุกอย่างอื่น

แปลงเป็นตัวเลข

เราใช้reduceในการแปลงสตริงเป็นตัวเลข สิ่งนี้เทียบเท่ากับการคำนวณ

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

คำนวณความยาวฐาน 256

ค่าส่งคืนของbinคือสตริงซึ่งมีลักษณะดังนี้:

"0b10101100111100001101"

Lสอบถามความยาวของมัน ค่าที่มีการnแทนค่าไบนารี -bit มีการแทนceil(n/8)-bit base-256 เราสามารถคำนวณnเป็นL-2; ยังceil(n/8)สามารถเขียนเป็นfloor((n+7)/8)= n+7>>3ดังนั้นคำตอบของเราคือL-2+7>>3=L+5>>3 =

กรณีที่สตริงอินพุตมีค่า 0 ถูกจัดการอย่างถูกต้องเนื่องจากbinส่งคืน"0b0"ดังนั้นเราจึงส่งกลับ3+5>>3= 1



@ HalvardHummel ค่อนข้างแน่ใจว่าควรจะเป็นc>=' 'อย่างอื่นหรือคุณแผนที่พื้นที่ถึง 23 แทน 2 ในรหัสกอล์ฟธรรมดาc>'\x1f'(ไบต์ดิบ) จะช่วยฉัน แต่นั่นไม่ใช่ ASCII ที่พิมพ์ได้ ...
Lynn

คุณพูดถูกฉันไม่ดี
Halvard Hummel

2

APL, คะแนน 24 (ไบต์ *)

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

ถือว่าค่าเริ่มต้น⎕IO←1มิฉะนั้นเพียงเปลี่ยน¯31เป็น¯30

คำอธิบาย:

                   ⎕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

ตัวอย่าง:

      ⌈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; ดังนั้นโปรแกรม APL ที่ใช้เฉพาะอักขระ ASCII และสัญลักษณ์ APL เท่านั้นที่สามารถทำคะแนนเป็น 1 อักขระถ่าน = 1 ไบต์


ไม่ได้ทั้งหมดสัญลักษณ์ APL อยู่ใน⎕AV(อย่างน้อยสำหรับ Dyalog) เช่น แม้ว่าสัญลักษณ์ทั้งหมดของคุณจะนับเป็นหนึ่งไบต์ในแต่ละครั้ง ดังนั้นไม่ใช่ทุก ๆ สัญลักษณ์ APL = 1 ไบต์เหมือนที่คุณระบุไว้ในเชิงอรรถ (แค่คิดว่าฉันจะแจ้งให้คุณทราบ) นอกจากนี้คุณใช้ภาษา APL ภาษาใด
Zacharý

2

Perl 5 , 76 + 1 (-F) = 77 ไบต์

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

ลองออนไลน์!

อย่างไร?

โดยปริยายแยกอักขระของอินพุต ( -F) โดยเก็บข้อมูลทั้งหมดใน @F ปิดการwhileวนซ้ำโดยนัยและเริ่มบล็อกใหม่ ( }{) ( ขอบคุณ @Dom Hastings! ) สำหรับอักขระแต่ละตัวให้คูณค่าของมันด้วย 97 กับกำลังไฟที่เหมาะสม คำนวณจำนวนอักขระโดยค้นหาขนาดของผลรวมในฐาน 256 โดยใช้ลอการิทึม




1

MATL (19 ไบต์) คะแนน 16

9=?1}G9tQ6Y2hh8WZan

อักขระที่ไม่สามารถพิมพ์ได้ (แท็บบรรทัดใหม่) ในสตริงป้อนข้อมูลจะถูกป้อนโดยการเชื่อมโยงรหัส ASCII ( 9, 10) กับส่วนที่เหลือของสตริง

ส่วนเริ่มต้น9=?1}Gจำเป็นเฉพาะเนื่องจากข้อผิดพลาดในZaฟังก์ชั่น (การแปลงฐาน) ซึ่งทำให้มันล้มเหลวเมื่ออินพุตประกอบด้วย "ศูนย์" (แท็บที่นี่) เท่านั้น มันจะได้รับการแก้ไขในรุ่นถัดไปของภาษา

คำอธิบาย

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 ไบต์คะแนน74 65

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

ลองที่นี่!

โปรแกรมจะแปลงอินพุตเป็นตัวเลขฐาน -97 ก่อนจากนั้นนับจำนวนที่ต้องการสำหรับตัวเลขฐาน 256 ดังนั้นหมายเลขฐาน 97 มีขนาดใหญ่มากดังนั้น TIO จะส่งออกค่าสูงสุด 8 สำหรับค่าขนาดใหญ่ อย่างไรก็ตามล่าม JS ไม่สนใจและจะส่งออกค่าที่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.