ตัวเลขเหล่านี้คืออะไร?


22

ในขณะที่ฉันกำลังเขียนตัวเลขฉันสังเกตเห็นหลังจากที่ในขณะที่แป้นพิมพ์ของฉันมีShiftคีย์กดและบล็อกและทั้งหมดที่ฉันเขียนเป็น$%&อักขระเหมือน และยิ่งแย่ไปกว่านั้นฉันได้ทำการสลับระหว่างรูปแบบแป้นพิมพ์ภาษาอังกฤษและสเปนดังนั้นฉันจึงไม่ทราบว่าฉันใช้รูปแบบใดในแต่ละหมายเลข

ท้าทาย

ระบุสตริงที่มีอักขระสัญลักษณ์พยายามเดาหมายเลขที่ฉันเขียน แป้นพิมพ์ของฉันผลิตอักขระต่อไปนี้สำหรับตัวเลขเมื่อShiftกด:

1234567890
----------
!"·$%&/()=  Spanish layout
!@#$%^&*()  English layout
  • อินพุตจะเป็นสตริงที่ไม่เป็น null และไม่ว่างซึ่งประกอบด้วยสัญลักษณ์ด้านบน
  • ผลลัพธ์จะเป็นตัวเลขเดี่ยวหากรูปแบบแป้นพิมพ์สามารถอนุมานได้จากสตริง (เช่นถ้าสตริงมี@รูปแบบภาษาอังกฤษถูกนำมาใช้และหากสตริงมี"รูปแบบภาษาสเปนถูกนำมาใช้) หรือถ้าตัวเลขนั้นเหมือนกันสำหรับ เลย์เอาต์ทั้งสอง (เช่นอินพุท!$ซึ่งแปลว่า14ทั้งสองเลย์เอาต์); มิฉะนั้นเอาต์พุตจะเป็นตัวเลขสองตัวเลขที่เป็นไปได้สำหรับทั้งสองเลย์เอาต์หากไม่สามารถอนุมานได้และตัวเลขที่ได้จะแตกต่างกัน
  • สตริงอินพุตจะถูกเขียนในเลย์เอาต์เดียวเสมอ ดังนั้นคุณไม่จำเป็นต้องคาดหวังว่าจะ"@เป็นอินพุต

ตัวอย่าง

Input  -->  Output
------------------
/()         789        (Spanish layout detected by the use of /)
$%&         456,457    (Layout cannot be inferred)
!@#         123        (English layout detected by the use of @ and #)
()&!        8961,9071  (Layout cannot be inferred)
((·))       88399      (Spanish layout detected by the use of ·)
!$          14         (Layout cannot be inferred but the result is the same for both)
!!$$%%      114455     (Layout cannot be inferred but the result is the same for both)
==$"        0042/42    (Spanish layout, if a number starts with 0 you can choose to
                       omit them in the result or not)

Single character translations:
------------------------------
!   1    
"   2
·   3
$   4
%   5
&   6,7
/   7
(   8,9
)   9,0
=   0
@   2
#   3
^   6
*   8

นี่คือดังนั้นอาจเป็นรหัสที่สั้นที่สุดสำหรับแต่ละภาษาที่ชนะ!


นั่นมัน·เป็นเรื่องที่ท้าทาย ...
Erik the Outgolfer

2
@EriktheOutgolfer อันที่จริงแล้ว·มันไร้ประโยชน์สำหรับภาษาสเปนมันถูกใช้ในภาษาคาตาลันเท่านั้น
Charlie

ผลลัพธ์เช่น{(8, 9, 6, 1), (9, 0, 7, 1)}(สำหรับกรณีทดสอบครั้งที่ 4) ยอมรับได้หรือไม่
Lynn

@ ลินน์ใช่มันเป็น
Charlie

เมื่อส่งออก 2 หมายเลขลำดับนั้นสำคัญหรือไม่
Shaggy

คำตอบ:


6

เจลลี่ , 32วันที่ 31 ไบต์

O“=!"Ṣ$%&/()“)!@#$%^&*(‘iⱮ€PƇ’Q

ลองออนไลน์!

  • -1 ไบต์ขอบคุณ Erik the Outgolfer

O“!"Ṣ$%&/()=“!@#$%^&*()‘iⱮ€PƇ%⁵Q
O                                  ord of each character in the input
 “!"Ṣ$%&/()=“!@#$%^&*()‘           Constant that yields the list:
                                      [[33, 34, 183, 36, 37, 38, 47, 40, 41, 61],
                                       [33, 64, 35, 36, 37, 94, 38, 42, 40, 41]
                          €        For each list of numbers:
                         Ɱ           For each ord of the characters in the input:
                        i              Find the index of the ord of the character
                                       in the list of numbers.
                                       If the number is not found, `i` returns zero
                                       which means it's a character from only one
                                       keyboard.
                                   There are now two lists of numbers 1-10.
                            Ƈ      Keep the list(s) that: 
                           P         have nonzero product.
                             %⁵    Modulo 10. This maps 10->0.
                               Q   Unique elements. This removes duplicates if the two numbers are the same.

1
31 ไบต์
Erik the Outgolfer



3

Java (JDK) , 173 ไบต์

แข็งแรงเล่นกอล์ฟ

c->{String s="",e=s;var m="21#3457#908###6##12#456389###0#7".split("");for(int l:c){e+=m[l=l%16];s+=m[l+16];}return s.equals(e)|s.contains("#")?e:e.contains("#")?s:s+","+e;}

ลองออนไลน์!


Ungolfed

c->{                                                      // Lamdba taking char array as input
    String s="",e=s;                                      // Initialise Spanish and English strings
    var m="21#3457#908###6##12#456389###0#7".split("");   // Create magic hashing lookup array (see below)
    for(int l:c){                                         // Loops through all chars in input
        e+=m[l=l%16];                                     // Get english number from array and append
        s+=m[l+16];                                       // Get Spanish number from array and append
    }
    return s.equals(e)|s.contains("#")?e:                 // If equal or Spanish is invalid return english
        e.contains("#")?s:                                // If English is invalid return Spanish
        s+","+e;                                          // If both are valid but not equal, return both
}


อาร์เรย์การค้นหา Magic Hashing

หลังจากการทดลองด้วยค่าฉันรู้ว่าแต่ละค่า ASCII ของตัวละคร!"·$%&/()=@#^*modulo 16 ส่งกลับจำนวนที่ไม่ซ้ำกัน 'คร่ำเครียดมายากลค้นหาอาร์เรย์'ร้านค้าหมายเลขภาษาอังกฤษที่เกี่ยวข้องกับตัวละครแต่ละตัวที่ดัชนีที่ไม่ซ้ำกันและแต่ละหมายเลขสเปนดัชนีนี้ชดเชยด้วย 16 ทำให้การเรียกจำนวนที่ต้องการจากแถวจิ๊บจ๊อยสำหรับแต่ละภาษา แฮชถูกเก็บไว้สำหรับค่าที่ไม่ถูกต้องสำหรับภาษาใดภาษาหนึ่ง


ฉันไม่คิดว่าคุณสามารถใช้ toCharArray () และค่า int เพื่อทำให้สั้นลงได้ไหม (แค่ความคิดฉันยังไม่ได้ลองเลย)
Quintec

@Quintec ฉันลองใช้ แต่ไบต์พิเศษจากtoCharArray()และการคำนวณเลขชี้กำลังที่จะใช้กับค่า int ทำให้มันยาวกว่าทั้งสอง.contains()ข้อความ
ลุคสตีเวนส์

s.equals(e)|s.contains("#")s.matches(e+"|.*#.*")สามารถ
Kevin Cruijssen


2

เยลลี่ , 38 ไบต์

183Ọ“=!"“$%&/()”j,“)!@#$%^&*(”iⱮ€⁸ẠƇ’Q

ลองออนไลน์!


ดี! แค่คำถามเดียวฉันได้ลองใช้รหัสของคุณด้วย()หรือ(())เป็นข้อมูลป้อนเข้า แต่รหัสของคุณกลับไม่มีอะไร ฉันคิดว่านั่นเป็นข้อ จำกัด ของ Jelly ที่ได้รับจากการป้อนข้อมูล?
Charlie

1
@ Charlie ลองกับ'()'และ'(())'ตามลำดับ ใช่ถ้าคุณไม่ได้อ้างอาร์กิวเมนต์มันจะถูกป้อนเป็นสตริงเท่านั้นหากไม่สามารถนำevalไปเป็นค่า Python 3 ได้
Erik the Outgolfer

2

เรติน่า 0.8.2 , 60 ไบต์

.+
$&¶$&
T`=!"·$%&/()`d`^.+
T`)!@#$%^&*(`d`.+$
D`
Gm`^\d+$

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

.+
$&¶$&

ทำสำเนาอินพุต

T`=!"·$%&/()`d`^.+
T`)!@#$%^&*(`d`.+$

ลองแปลแต่ละบรรทัดตามเค้าโครงแป้นพิมพ์ที่แตกต่างกัน

D`

คัดลอกผลลัพธ์ซ้ำ

Gm`^\d+$

เก็บเฉพาะบรรทัดที่มีตัวเลขเท่านั้น


คุณต้องการmในช่วงสุดท้ายของคุณหรือไม่?
ovs

@ovs ใช่การแข่งขันวิ่งก่อนจากนั้นเส้นจะถูกแยกออกและเส้นที่มีการแข่งขันจะถูกเก็บไว้
Neil


1

05AB1E , 42 41 ไบต์

•Hhç₁d©u÷^Σ(“ðΣèõĆ
-•184в2äεIÇk}ʒ®å_}>T%Ù

ท่าเรือ@dylnan 'คำตอบวุ้น

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Hhç₁d©u÷^Σ(“ðΣèõĆ
-•184в           # Compressed list [33,34,183,36,37,38,47,40,41,61,33,64,35,36,37,94,38,42,40,41]
      2ä         # Split into two parts: [[33,34,183,36,37,38,47,40,41,61],[33,64,35,36,37,94,38,42,40,41]]
ε   }            # Map each inner list to:
 IÇ              #  Get the input, and convert each character to its unicode value
   k             #  Then get the index of each unicode value in the current map-list
                 #  (this results in -1 if the item doesn't exist)
     ʒ   }       # Filter the resulting list of indices by:
      ®å_        #  If the inner list does not contain any -1
          >      # Increase each index by 1 to make it from 0-indexed to 1-indexed
           T%    # Take modulo-10 to convert 10 to 0
             Ù   # Uniquify the result-lists (and output implicitly)

ดู 05AB1E เคล็ดลับของฉัน (ส่วนวิธีการบีบอัดรายการจำนวนเต็ม? )เพื่อทำความเข้าใจว่าทำไมจึง•Hhç₁d©u÷^Σ(“ðΣèõĆ\n-•184вเป็น[33,34,183,36,37,38,47,40,41,61,33,64,35,36,37,94,38,42,40,41]) นี้ (ร่วมกับ) เป็น 1 ไบต์สั้นกว่าการค่า Unicode '""!ÿ·$%&/()=""!@#$%^&*()"‚Çของสตริง:


!$และ!!$$%%กรณีควรส่งออกเพียงจำนวนหนึ่งเป็นผลที่ได้จะเหมือนกันสำหรับรูปแบบทั้งในและไม่มีความคลุมเครือ
ชาร์ลี

@ ชาร์ลีโอ๊ะโอแก้ไขแล้ว
Kevin Cruijssen


1

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

import StdEnv,Text
$s=removeDup[foldl(<+)""d\\r<-["=!\"·$%&/()",")!@#$%^&*("],d<-[[indexOf{c}r\\c<-s]]|all((<) -1)d]

ลองออนไลน์!

รับอินพุตและเข้ารหัสใน CP437 TIO รองรับเฉพาะ UTF-8 ดังนั้นการหลบหลีกจึงใช้ในรหัสตัวอย่างเพื่อรับค่าตัวอักษร 250 ที่สอดคล้องกับจุดศูนย์กลาง (นับเป็นหนึ่งไบต์)


!$%การป้อนข้อมูลควรส่งออกเพียงจำนวนหนึ่งไม่ใช่สองเป็นผลจะเหมือนกันสำหรับรูปแบบทั้ง
Charlie

@ Charlie แก้ไขมัน
Οurous

1

APL (Dyalog) 40 ไบต์

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ แม้ว่าจะไม่ได้ใช้· อยู่ใน Dyalog ไบต์เดี่ยวชุดอักขระ ถือว่าการทำดัชนีแบบ 0 ( ⎕IO←0) ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ

{∪⍵/⍨~10∊¨⍵}'=!"·$%&/()' ')!@#$%^&*('⍳¨⊂

ลองออนไลน์!

 อาร์กิวเมนต์ทั้งหมด

'=!"·$%&/()' ')!@#$%^&*('⍳¨ ดัชนีของอักขระในแต่ละสตริงเหล่านี้

{∪⍵/⍨~10∊¨⍵} ใช้แลมบ์ดาต่อไปนี้ ( เป็นอาร์กิวเมนต์):

10∊¨⍵ สำหรับแต่ละรายการของตัวเลขไม่ว่าจะเป็น 10 (ระบุว่า "ไม่พบ") ​​เป็นสมาชิกของมัน

~ การปฏิเสธในท้องถิ่น (เช่นเฉพาะที่พบตัวเลขทั้งหมด)

⍵/⍨ กรองอาร์กิวเมนต์โดยที่

 ค้นหาองค์ประกอบที่เป็นเอกลักษณ์ของสิ่งนั้น


0

โผ 125 ไบต์

f(s)=>['=!"·\$%&/()',')!@#\$%^&*('].map((b)=>s.split('').map((e)=>b.indexOf(e)).join()).where((e)=>!e.contains('-')).toSet();

Ungolfed:

f(s){
  ['=!"·\$%&/()',')!@#\$%^&*(']
    .map(
      (b)=>s.split('').map((e)=>b.indexOf(e))
      .join()
    ).where(
      (e)=>!e.contains('-')
    ).toSet();
}
  • สร้างอาร์เรย์ด้วยค่าคีย์ที่ระบุสองค่าจาก 0 ถึง 9
  • สำหรับแต่ละสตริงให้แปลงสตริงอินพุตให้เป็นตัวเลขที่สอดคล้องกันโดยใช้ดัชนีของตัวละคร
  • เข้าร่วมอาร์เรย์ผลลัพธ์เพื่อสร้างตัวเลข
  • ลบหมายเลขใด ๆ ที่มี '-' (Dart จะคืนค่า -1 เมื่อ indexOf หาถ่านไม่ได้)
  • กลับเป็นชุดเพื่อลบรายการซ้ำ

ลองใช้กับ Dartpad!


0

T-SQL, 143 ไบต์

SELECT DISTINCT*FROM(SELECT TRY_CAST(TRANSLATE(v,m,'1234567890')as INT)a
FROM i,(VALUES('!"·$%&/()='),('!@#$%^&*()'))t(m))b
WHERE a IS NOT NULL

การป้อนข้อมูลจะได้รับการผ่านทางที่มีอยู่ก่อนตารางฉันกับฟิลด์ varchar วี , ตามมาตรฐาน IO ของเรา

รวมตารางอินพุตกับสตริงอักขระสองตัวที่แตกต่างกันจากนั้นใช้ฟังก์ชัน SQL 2017 ใหม่TRANSLATEเพื่อสลับอักขระแต่ละตัวและTRY_CASTดูว่าเราลงท้ายด้วยตัวเลขหรือไม่ ถ้าไม่,TRY_CASTกลับNULLมา

สุดท้ายด้านนอกรวมผลเหมือนกันและฟิลเตอร์ออกSELECT DISTINCTNULLS

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