พิมพ์ข้อความที่มองไม่เห็นจริง


15

ความท้าทายก่อนหน้าของฉันพิมพ์ข้อความที่มองไม่เห็นค่อนข้างเป็นที่นิยมน่าจะเป็นเพราะมันเป็นเรื่องเล็กน้อย

อย่างไรก็ตามผู้สังเกตการณ์คนอื่น ๆ ของคุณอาจสังเกตเห็นว่าคุณไม่ได้พิมพ์ข้อความที่มองไม่เห็นเพราะคุณไม่สามารถอ่านสิ่งที่ป้อนให้เฉพาะผลลัพธ์

ดังนั้นฉันจึงคิดว่าเกี่ยวกับความท้าทายข้อความที่มองไม่เห็นจริง

รับสตริงที่ประกอบด้วยอักขระ ASCII ที่พิมพ์ได้เท่านั้น ( 0x20-0x7E) แปลงอักขระแต่ละตัวเป็นอักขระ Unicode ที่แตกต่างกัน (ในการเข้ารหัส UTF-8) ที่ไม่ใช่หนึ่งใน 95 อักขระ ASCII ที่พิมพ์ได้ (อักขระ UTF-8 ใด ๆ ที่อยู่นอก0x20-0x7Eช่วง)

อินพุต

สตริงของอักขระ ASCII ที่พิมพ์ได้ไม่ว่าจะเป็นสตริงหรืออาร์เรย์ / รายการอักขระ

เอาท์พุต

สตริงอินพุตที่มีอักขระแต่ละตัวถูกแทนที่ด้วยอักขระที่ไม่สามารถพิมพ์ได้ที่แตกต่างกัน อักขระที่กำหนดแต่ละตัวต้องมีอักขระที่ไม่สามารถพิมพ์ได้ที่สอดคล้องกันซึ่งไม่ได้ใช้แทนอักขระอื่นใด

หากคุณไม่สามารถพิมพ์อักขระที่ไม่สามารถพิมพ์ได้คุณสามารถส่งออกค่าอักขระแทน

ตัวอย่างเช่นถ้ารหัสของคุณแทนที่ตัวพิมพ์เล็กทั้งหมดa'S กับ0x01คุณไม่สามารถใช้0x01ทดแทนสำหรับตัวละครอื่น ๆ

รหัสของคุณจะต้องกำหนดไว้ล่วงหน้า ซึ่งหมายความว่าถ้าให้สตริงHelloตัวพิมพ์เล็กทั้งหมดlจะถูกแทนที่ด้วย0x03รหัสของคุณจะต้องแทนที่ด้วยตัวพิมพ์เล็กทั้งหมดlด้วย0x03สตริงอื่น ๆ

Testcases

มันค่อนข้างยากที่จะเขียน testcase สำหรับความท้าทายนี้ดังนั้นฉันจะแสดงผลลัพธ์เป็นรายการของ hexcodes

input     -> output
"Hello"   -> [0x01, 0x02, 0x03, 0x03, 0x04]
"Hi!"     -> [0x01, 0x05, 0x06]
""        -> []
"   H   " -> [0x07, 0x07, 0x07, 0x01, 0x07, 0x07, 0x07]
"yo! "    -> [0x08, 0x04, 0x06, 0x07]

ลีดเดอร์บอร์ด

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา


9
ไม่มีสิ่งเช่นตัวอักษร UTF-8: UTF-8 เป็นอนุกรมของ Unicode ไม่ใช่ชุดอักขระ และถ้า "ไม่สามารถพิมพ์" ทำให้ความรู้สึกในบริบท Unicode ก็แน่นอนมากแคบกว่า "แต่ 95 หลายร้อยหลายพัน codepoints จัดสรร"
ปีเตอร์เทย์เลอร์

11
@PeterTaylor เนื่องจากเรากำลังพูดถึง hexcodes อักขระที่นี่ฉันคิดว่ามันชัดเจนว่าเมื่อฉันพูดถึงอักขระ UTF-8 ฉันหมายถึงอักขระ Unicode ในการเข้ารหัส UTF-8 ASCII ยังเป็นมาตรฐานการเข้ารหัสไม่ใช่ชุดอักขระ แต่ผู้ใช้ไม่มีปัญหากับคำว่า "อักขระ ASCII" อย่างไรก็ตามฉันจะแก้ไขข้อความเพื่อชี้แจง
Skidsdev

3
ต้องการเหตุผลใดเป็นพิเศษ UTF-8?
CalculatorFeline

อินพุตว่างเปล่าได้ไหม
Dennis

1
+1 สำหรับ "หากคุณไม่สามารถพิมพ์ตัวอักษรที่พิมพ์ไม่ได้"
Robert Fraser

คำตอบ:


13

เยลลี่ 3 ไบต์

O²Ọ

ลองออนไลน์!

กำลังสอง codepoint แต่ละ


คล้ายกับโซลูชัน Japtive ที่ฉันคิดขึ้นมาฉันคาดหวังว่าฉันจะบีบโคเดอีพอยน์แทนการยกกำลังสอง - คุณโอเคกับฉันที่โพสต์หรือไม่
Shaggy

2
@Shaggy Japt ≠ Jelly เพื่อให้คุณสามารถโพสต์ได้
Erik the Outgolfer

วิธีแก้ปัญหาที่ฉลาดไม่ได้นึกถึงกำลังสอง
Skidsdev

1
แกรนด์แค่อยากจะให้แน่ใจว่าเกรงว่าคุณคิดว่าฉันเป็นเพียงแค่ฉีกวิธีการแก้ปัญหาของคุณ :)
ปุย

4
@Shaggy ไม่มีแนวทางในการแก้ปัญหาการย้ายไปยังภาษาอื่น ถ้ามันจะแย่มากเพราะโดยปกติจะมีอัลกอริธึมที่เหมาะสมที่สุดซึ่งให้การปรับใช้ที่เหมาะสมที่สุดในภาษาส่วนใหญ่และไม่มีใคร แต่โปสเตอร์แรกจะไม่สามารถพิสูจน์ได้ว่าพวกเขามาพร้อมกับอัลกอริทึมด้วยตนเอง แน่นอนว่าถ้าคุณพูดถึงวิธีการแก้ปัญหาของคนอื่นมันเป็นเพียงการแสดงธรรมที่จะพูดถึงคำตอบของพวกเขา
แอรอน

13

ช่องว่าง , 39 36 ไบต์


  
   	  
 
  
 	
	 				  
	
  
 


ลองออนไลน์!

คำอธิบาย

nssn  ; label 'loop'
ssstssn ; push 4 to use as a multiplication operand
sns   ; dup 4 to use as a heap address
sns   ; dup 4 to use as a heap address
tnts  ; getchar and store at address 4
ttt   ; retrieve the value at address 4
tssn  ; multiply the character value by 4
tnss  ; putchar output the new character
nsnn  ; jmp 'loop'

เดิมทีฉันต้องการคูณด้วย -0 หรือ -1 เพราะพวกมันจะเป็นตัวเลขที่สั้นที่สุดที่เป็นไปได้ที่จะประกาศใน Whitespace TIO ไม่ได้แยกความแตกต่างระหว่าง -0 และ +0 เพื่อให้ออก น่าเสียดายที่การกวดวิชา / ข้อมูลจำเพาะมีความคลุมเครือเกี่ยวกับวิธีการตีความค่าลบในขณะที่ char TIO (ถูกต้อง) โยนข้อผิดพลาดเกี่ยวกับอาร์กิวเมนต์ที่ไม่ถูกต้องเพื่อที่จะไม่ได้เป็นตัวเลือก

ค่าคงที่การทำงานที่สั้นที่สุดถัดไปคือ 4 ดังนั้นเราจึงลงเอยด้วยวิธีการพื้นฐานเช่นเดียวกับโซลูชั่น Powershell / Pyth


ช่องว่าง , 56 53 ไบต์ - แผนที่กับตัวละครแท็ก


  
   			                 
 
  
 	
	 				   	
  
 


ลองออนไลน์!

คำอธิบาย

วิธีการเดียวกันกับรุ่นก่อนหน้าอย่างมีประสิทธิภาพยกเว้นการใช้ 0xE0000 เป็นค่าคงที่และเพิ่มแทนการคูณ นี่แมปอักขระ ASCII ที่มองเห็นได้กับอักขระแท็ก Unicode ที่เกี่ยวข้อง (ช่วง U + E0000-U + E007F) การใช้งานที่ต้องการสำหรับช่วงนี้คือการระบุภาษาของข้อความในไฟล์ข้อความธรรมดาอย่างไรก็ตามการใช้งานนั้นไม่ได้รับการสนับสนุน รหัสนี้จะส่งออกฉลากที่ถูกต้องถ้าคุณนำหน้าสตริงที่มีอักขระ 0x01

มาตรฐาน Unicodeบอกว่าตัวละครในช่วงนี้ไม่มีการแสดงผลที่มองเห็นดังนั้นฉันรู้สึกนี้เป็นไปตามจิตวิญญาณของความท้าทายที่ดีกว่าวิธีการที่ก่อนหน้านี้


5
การใช้โปรแกรมล่องหนเพื่อพิมพ์ข้อความที่มองไม่เห็น ฉันชอบ.
ทำเครื่องหมาย

7

Japt , 5 2 ไบต์

cp

ลองออนไลน์


คำอธิบาย

     :Implicit input of string U
c    :Map over the character codes of the string.
p    :Square them.
     :Implicit output of result.

อืมหลังจากตรวจสอบอย่างใกล้ชิดดูเหมือนว่า126 ** 3 == 2000376ซึ่งไม่อยู่ในช่วง [0..1114111] คุณยังสามารถยกกำลังสองได้ :) นั่นเป็นเพราะ UTF-8 สิ้นสุดที่นั่นในขณะที่ UTF-16 ยังคงดำเนินต่อไป
Erik the Outgolfer

1
@EriktheOutgolfer Ehm UTF-8 มีช่วงเดียวกันกับ UTF-16 อย่างแน่นอน (ตามทฤษฎีแล้ว UTF-8 สามารถเก็บ codepoints ที่สูงกว่าโดยใช้ 5 หรือ 6 bytes ต่อ codepoint แต่มันผิดกฎหมาย)
Mr Lister


4

Braingolf v0.6, 17 ไบต์

VRl1-M[R.*>v]R&@

ยกกำลังสองแต่ละค่า char แล้วพิมพ์

-1 ไบต์ขอบคุณ Erik the วิธีแก้ปัญหากำลังสองของ Outgolfer

Braingolf v0.7, 6 ไบต์ [ไม่แข่งขัน]

{.*}&@

ยกกำลังสองให้แต่ละค่าแล้วพิมพ์ แต่ v0.7 จะมี{}ลูป"foreach"


4

Mathematica, 48 ไบต์

FromCharacterCode[4Mod[Hash/@Characters@#,978]]&

คำอธิบาย:

                             Characters@#      & - Convert string to array of characters
                       Hash/@                    - Hash them all using default hash
                   Mod[                  ,978]   - apply a modulus which uniquely transforms each potential character's hash into a number
                  4                              - times by 4 to move values out of 0x20-0x7E.
FromCharacterCode[                            ]  - Convert array of numbers back to string

ที่น่าสนใจของตัวเลือกโมดูลัสสองตัวที่น้อยกว่า 1,000 ซึ่งเปลี่ยน 96 ตัวอักษรเป็น 96 ค่าที่ไม่ซ้ำกับโมดูลัส 978 ค่าสองต่ำสุดคือ 7 จากนั้น 33 โชคดีที่ค่า 4 เปลี่ยนเป็น 28 และ 132 ซึ่งทั้งคู่อยู่นอกช่วงที่มองเห็น ถ้าฉันใช้โมดูลัสอื่น ๆ ของ 784 ฉันต้องคูณด้วย 18 เพื่อเลื่อนตัวเลขที่อยู่นอกช่วง

กรณีทดสอบ

หมายเหตุ: เครื่องหมายพิเศษในการมีตัวละครหนีและ" \ตัวอักษร 0x7E ก็ดูเหมือนจะไม่ต้องการวางอย่างถูกต้อง

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

เอาท์พุท: ป้อนคำอธิบายรูปภาพที่นี่

การใช้งานHashมาเกี่ยวกับตามที่ToCharacterCodeเป็นจริงยาว อย่างไรก็ตามการขัดจังหวะมันเกือบจะแพง วิธีทางคณิตศาสตร์อย่างง่ายในการทำเช่นนี้คือ 49 ไบต์:

FromCharacterCode[4ToCharacterCode@Characters@#]&

2

CJam , 8 5 ไบต์

l95f+

ลองออนไลน์!

เพิ่ม 95 ให้กับ codepoint แต่ละตัว


ไม่มีวิธีในการคูณหรือสี่เหลี่ยมแทนใช่ไหม
NieDzejkob

@NieDzejkob ไม่นี่ขึ้นอยู่กับความจริงที่ว่าอักขระ + Long = chr (ปกติ (อักขระ) + ยาว) ตัวอักษร * ยาว = [ตัวละคร] * ยาว ตัวละคร # ยาว = ข้อผิดพลาด (# คือการยกกำลังใน CJam)
Erik the Outgolfer


2

PowerShell, 32 31 ไบต์

-1 ขอบคุณที่นีล99+ไป4*

[char[]]"$args"|%{[char](4*$_)}

คูณ 9 ด้วยรหัสอักขระแต่ละตัวแล้วพิมพ์กลับ


จากความสนใจจะคูณด้วยจำนวนน้อย (4-9) ไหม
Neil

ต่ำสุดที่สามารถพิมพ์ได้ 4 ครั้งมากกว่าการพิมพ์ที่ใหญ่ที่สุดนั่นคือ -1 - ขอบคุณ!
colsw



1

ทศนิยม , 37 ไบต์

91D31030030012255D412D590D543D301291D

คำอธิบาย:

91D             ; declare jump 1
    310         ; push user input to stack
    300         ; duplicate
    300         ; duplicate
    12255D      ; push EOF to stack
    412D        ; compare top two values, pop, push result
    5 90D 5     ; if result == true, quit
    43D         ; multiply top two values, pop, push result
    301         ; print
    2           ; pop
91D             ; goto jump 1

ลองออนไลน์!


ดังนั้นการกระโดดไปที่ศูนย์ ( 90D) สิ้นสุดลง?
Skidsdev

@Mayube อย่างแน่นอน
MD XF

1

Google ชีตขนาด 68 ไบต์

=ArrayFormula(Join("",IfError(Char(Code(Mid(A1,Row(A:A),1))^2),"")))

ฉันต้องการโพสต์สิ่งนี้เพื่อแสดงว่ามันน่าอึดอัดใจในการทำฟังก์ชั่นพื้นฐานบางอย่างในชีต คุณต้องการที่จะดำเนินการกับตัวละครทุกตัวในเซลล์และออกผลการตัดแบ่ง? คุณอยู่ที่ 42 ไบต์ก่อนที่คุณจะแสดงบทบาทเหล่านั้น

=ArrayFormula(Join("",Mid(A1,Row(A:A),1)))

มิเช่นนั้นจะเหมือนกับโซลูชันอื่น ๆ : กำหนดจุดรหัสของอักขระแต่ละตัว




0

ทำความสะอาด , 25 ไบต์

import StdEnv

map((+)'~')

ฟังก์ชั่นบางส่วนตามตัวอักษร

ลองออนไลน์!

แนบเนียน:

f s = {# c+'~' \\ c <-: s}

ความเข้าใจของอาเรย์ที่ไม่มีกล่องเหนืออาเรย์ที่ไม่มีกล่องในประเภทเดียวกัน ( {#Char} -> {#Char}) ทำความสะอาดจะสามารถระบุได้ว่าเอกลักษณ์นั้นสามารถถ่ายโอนได้ ( !u:{#Char} -> u:{#Char}) และขนาดนั้นเท่ากับขนาดอินพุต ซึ่งหมายความว่าหากคุณผ่าน*Stringตัวละครทุกตัวจะได้รับการอัปเดตแบบทำลายล้างด้วยตัวอักษรที่เกี่ยวข้องในเอาต์พุตหมายความว่าจะไม่มีการจัดสรรหน่วยความจำหรือการเคลื่อนไหวใด ๆ และโหนดกราฟจะถูกนำมาใช้ใหม่ทั้งหมด

ลองออนไลน์!

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