Angka-angka apa ini?

22

Ketika saya sedang menulis angka, saya perhatikan setelah beberapa saat bahwa keyboard saya Shiftmenekan dan memblokir dan semua yang saya tulis adalah $%&-seperti karakter. Dan lebih buruk lagi, saya telah beralih antara tata letak keyboard bahasa Inggris dan Spanyol jadi saya tidak tahu mana yang saya gunakan untuk setiap nomor.

Tantangan

Diberikan string yang berisi karakter simbol, coba tebak nomor yang saya tulis. Keyboard saya menghasilkan karakter berikut untuk angka ketika Shiftditekan:

1234567890
----------
!"·$%&/()=  Spanish layout
!@#$%^&*()  English layout
  • Input akan berupa string non-null, non-kosong yang terdiri dari simbol di atas.
  • Output akan menjadi satu nomor jika tata letak keyboard dapat disimpulkan dari string (yaitu jika string berisi @tata letak bahasa Inggris digunakan, dan jika string berisi "tata letak Spanyol digunakan) atau jika nomor tersebut sama untuk kedua tata letak (yaitu input !$yang diterjemahkan sebagai 14untuk kedua tata letak); jika tidak, output akan menjadi dua angka yang mungkin untuk kedua tata letak jika tidak dapat disimpulkan dan angka yang dihasilkan berbeda.
  • String input akan selalu ditulis dalam tata letak tunggal. Jadi Anda tidak perlu berharap "@sebagai input.

Contohnya

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

Ini adalah , jadi semoga kode terpendek untuk setiap bahasa menang!

Charlie
sumber
Sial, itu ·menantang ...
Erik the Outgolfer
2
@EriktheOutgolfer sebenarnya ·tidak berguna untuk bahasa Spanyol, ini hanya digunakan dalam bahasa Catalan.
Charlie
Apakah output seperti {(8, 9, 6, 1), (9, 0, 7, 1)}(untuk test case ke-4) dapat diterima?
Lynn
@ Lynn ya, benar.
Charlie
Saat mengeluarkan 2 angka, apakah urutannya penting?
Shaggy

Jawaban:

6

Jelly , 32 31 byte

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

Cobalah online!

  • -1 byte, terima kasih kepada 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.
dylnan
sumber
1
31 byte .
Erik the Outgolfer
4

Python 3 , 76 byte

lambda s:{(*map(k.find,s),)for k in['=!"·$%&/()',')!@#$%^&*(']if{*s}<={*k}}

Cobalah online!

Lynn
sumber
4

Perl 6 , 62 byte

{set grep {!/\D/},TR'=!"·$%&/()'0..9',TR')!@\x23$%^&*('0..9'}

Cobalah online!

Mengembalikan Set. (Bisa dibuat dua atau tiga byte lebih pendek jika tidak ada bug dalam penanganan # dalam daftar pencarian oleh Rakudo.)

nwellnhof
sumber
3

Java (JDK) , 173 byte

Golf

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;}

Cobalah online!


Tidak disatukan

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
}


Array Pencarian Hashing Sihir

Setelah beberapa bereksperimen dengan nilai-nilai saya menyadari bahwa masing-masing nilai ASCII dari karakter !"·$%&/()=@#^*modulo 16 mengembalikan angka unik. The 'sihir hashing lookup array yang' menyimpan nomor English terkait dengan masing-masing karakter pada indeks unik, dan masing-masing dari nomor Spanyol di indeks ini diimbangi oleh 16, membuat mengambil jumlah yang diperlukan dari array sepele untuk setiap bahasa. Hash disimpan untuk nilai-nilai yang tidak valid untuk kedua bahasa.

Luke Stevens
sumber
Saya tidak mengira Anda bisa menggunakan toCharArray () dan nilai int untuk membuatnya lebih pendek? (Hanya sebuah ide, saya belum mencobanya.)
Quintec
@ Quintec Saya mencobanya, tetapi byte tambahan dari toCharArray()dan menghitung eksponen untuk diterapkan pada nilai int membuatnya jauh lebih lama daripada kedua .contains()pernyataan tersebut.
Luke Stevens
s.equals(e)|s.contains("#")bisa s.matches(e+"|.*#.*").
Kevin Cruijssen
3

Japt, 38 byte

Output array string dengan tata letak Spanyol terlebih dahulu.

"=!\"·$%&/())!@#$%^&*("òA £ËXbD
kø'- â

Cobalah

Shaggy
sumber
2

Jelly , 38 byte

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

Cobalah online!

Erik the Outgolfer
sumber
Bagus! Hanya satu pertanyaan, saya telah mencoba kode Anda dengan ()atau (())sebagai input, tetapi kode Anda tidak menghasilkan apa-apa. Saya kira itu batasan dengan apa yang diterima Jelly sebagai masukan?
Charlie
1
@Charlie Cobalah '()'dan '(())'masing - masing. Ya, jika Anda tidak mengutip argumen, itu hanya dimasukkan sebagai string jika tidak dapat evaldinotasikan ke nilai Python 3.
Erik the Outgolfer
2

Retina 0.8.2 , 60 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

.+
$&¶$&

Gandakan input.

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

Cobalah untuk menerjemahkan setiap baris sesuai dengan tata letak keyboard yang berbeda.

D`

Gandakan hasilnya.

Gm`^\d+$

Hanya pertahankan garis yang hanya mengandung digit.

Neil
sumber
Apakah Anda membutuhkan mdi tahap terakhir Anda?
Ovs
@ovs Ya, pertandingan berjalan pertama, dan kemudian garis-garis terpecah dan garis-garis yang mengandung pertandingan disimpan.
Neil
1

JavaScript (ES6), 99 byte

s=>(g=l=>a=s.replace(/./g,c=>l.indexOf(c)))('=!"·$%&/()',b=g(')!@#$%^&*('))>=0?a-b&&b>=0?[a,b]:a:b

Cobalah online!

Bagaimana?

g

1x >= 0

Arnauld
sumber
1

05AB1E , 42 41 byte

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

Port jawaban Jelly @dylnan .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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)

Lihat ini 05AB1E ujung tambang (bagian Cara daftar bilangan bulat kompres? ) Untuk memahami mengapa •Hhç₁d©u÷^Σ(“ðΣèõĆ\n-•184вadalah [33,34,183,36,37,38,47,40,41,61,33,64,35,36,37,94,38,42,40,41]). Ini (bersama-sama dengan ) adalah 1 byte lebih pendek daripada mengambil nilai-nilai unicode string: '""!ÿ·$%&/()=""!@#$%^&*()"‚Ç.

Kevin Cruijssen
sumber
Kasing !$dan !!$$%%kasing harus menghasilkan hanya satu nomor karena hasilnya sama untuk kedua tata letak dan tidak ada ambiguitas.
Charlie
@Charlie Ups, diperbaiki
Kevin Cruijssen
1

Ruby , 68 byte

->s{%w[=!"·$%&/() )!@#$%^&*(].map{|a|s.tr a,'0-9'}.grep_v(/\D/)|[]}

Cobalah online!

GB
sumber
1

Bersih , 116 byte

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

Cobalah online!

Mengambil input dan dikodekan dalam CP437. TIO hanya mendukung UTF-8, jadi escape digunakan dalam kode demo untuk mendapatkan nilai byte literal 250 yang sesuai dengan titik tengah (dihitung sebagai satu byte).

Suram
sumber
The !$%masukan harus output hanya satu nomor, bukan dua, karena hasilnya adalah sama untuk kedua layout.
Charlie
@ Chrislie Memperbaikinya.
Surous
1

APL (Dyalog) , 40 byte

Fungsi awalan diam-diam anonim. Meskipun tidak digunakan, · ada dalam set karakter byte tunggal Dyalog . Diasumsikan pengindeksan berbasis 0 ( ⎕IO←0) yang default pada banyak sistem.

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

Cobalah online!

 seluruh argumen

'=!"·$%&/()' ')!@#$%^&*('⍳¨ indeks karakter di masing-masing string ini

{∪⍵/⍨~10∊¨⍵} terapkan lambda berikut ( adalah argumen):

10∊¨⍵ untuk setiap daftar digit, apakah 10 (menunjukkan "tidak ditemukan") adalah anggota daripadanya

~ negasi lokal (yaitu hanya yang memiliki semua digit ditemukan)

⍵/⍨ saring argumen dengan itu

 temukan elemen uniknya

Adm
sumber
0

Dart , 125 byte

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

Tidak Terkumpul:

f(s){
  ['=!"·\$%&/()',')!@#\$%^&*(']
    .map(
      (b)=>s.split('').map((e)=>b.indexOf(e))
      .join()
    ).where(
      (e)=>!e.contains('-')
    ).toSet();
}
  • Membuat array dengan dua nilai kunci yang ditentukan, dari 0 hingga 9
  • Untuk masing-masing dari mereka, konversi string input ke nomor yang sesuai dengan menggunakan indeks karakter
  • Bergabunglah dengan array yang dihasilkan untuk membuat angka
  • Hapus nomor yang memiliki '-' (Dart mengembalikan -1 ketika indexOf tidak dapat menemukan char)
  • Kembali sebagai Set untuk menghapus duplikat

Cobalah di Dartpad!

Elcan
sumber
0

T-SQL, 143 byte

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

Input diambil melalui tabel i yang sudah ada sebelumnya dengan bidang varchar v , sesuai standar IO kami .

Bergabung dengan tabel input dengan dua string karakter yang berbeda, kemudian gunakan fungsi SQL 2017 baruTRANSLATE untuk menukar karakter individu, dan TRY_CASTuntuk melihat apakah kita berakhir dengan angka. Jika tidak, TRY_CASTkembali NULL.

Bagian luar akhir SELECT DISTINCTmenggabungkan hasil yang identik dan menyaring NULLS.

BradC
sumber