Bunlar kaç numara?


22

Rakamlar yazarken bir süre sonra klavyemin Shifttuşa basılmış ve bloke edildiğini ve yazdığım tek şeyin $%&karakterleri olduğunu fark ettim . Ve daha da kötüsü, İngilizce ve İspanyolca klavye düzenleri arasında geçiş yapıyordum, bu yüzden her bir numara için hangisini kullandığımı bilmiyorum.

Meydan okuma

Sembol karakterleri içeren bir dize verildiğinde, hangi sayıyı yazdığımı tahmin etmeye çalışın. Klavyem Shift, basıldığında sayılar için aşağıdaki karakterleri üretir :

1234567890
----------
!"·$%&/()=  Spanish layout
!@#$%^&*()  English layout
  • Giriş, yukarıdaki simgelerden oluşan boş olmayan, boş olmayan bir dize olacaktır.
  • Klavye düzeni dizeden çıkarılabilirse (örneğin dize @bir İngilizce düzen içeriyorsa ve dize "bir İspanyolca düzen içeriyorsa ) ya da sayı aynı ise çıktı her iki düzende (yani giriş, her iki düzende !$olduğu gibi çevrilir 14); Aksi halde, sonuç çıkarılamıyorsa ve sonuçtaki sayılar farklıysa, her iki düzen için de iki olası sayı olacaktır.
  • Giriş dizesi her zaman tek bir düzende yazılacaktır. Yani "@girdi olarak beklemenize gerek yok .

Örnekler

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

Bu , yani her dilin kazanması için en kısa kod olabilir!


·
Tehlike

2
@EriktheOutgolfer aslında ·İspanyolca için işe yaramaz, sadece Katalanca dilinde kullanılıyor.
Charlie

Çıktı gibi {(8, 9, 6, 1), (9, 0, 7, 1)}(4. test durumu için) kabul edilebilir mi?
Lynn,

@ Lynn, öyle.
Charlie,

2 sayı çıkarırken, sipariş önemli mi?
Shaggy

Yanıtlar:


6

Jöle , 32 31 bayt

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

Çevrimiçi deneyin!

  • Outgolfer Erik sayesinde -1 bayt

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.




3

Java (JDK) , 173 bayt

golfed

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

Çevrimiçi deneyin!


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
}


Sihirli Hashing Arama Dizisi

Değerlerle ilgili bazı deneylerden sonra, !"·$%&/()=@#^*modulo 16 karakterlerinin ASCII değerlerinin her birinin benzersiz bir sayı döndürdüğünü fark ettim . 'Sihirli karma Arama dizisi' bu dizinde saklar İngilizce bu eşsiz endeksine her karakter ile ilişkili sayılar ve İspanyolca sayı her her dil için önemsiz diziden gerekli sayıda getirilirken yaparak 16 ile ofset. Her iki dil için geçersiz olan değerler için bir karma değeri saklanır.


Bunu kısaltmak için toCharArray () ve int değerlerini kullanabileceğinizi sanmıyorum? (Sadece bir fikir, henüz denemedim.)
Quintec

@ Quintec Denedim, ancak toCharArray()int değerine uygulanacak üsten gelen ekstra baytları hesaplamak her iki .contains()ifadeden de daha uzun sürdü .
Luke Stevens

s.equals(e)|s.contains("#")olabilir s.matches(e+"|.*#.*").
Kevin Cruijssen

3

Japt, 38 bayt

Önce İspanyol mizanpajına sahip bir dizi dizge çıktılar.

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

Dene


2

Jöle , 38 bayt

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

Çevrimiçi deneyin!


Güzel! Tek bir soru, kodunuzu girişle ()veya (())giriş olarak denedim , ancak kodunuz hiçbir şey döndürmedi. Sanırım bu Jelly’in girdi olarak aldığı şeyle sınırlı mı?
Charlie,

1
@Charlie Sırasıyla '()'ve ile deneyin '(())'. Evet, argümanı alıntılamazsanız, yalnızca evalbir Python 3 değerine uygulanamıyorsa, bir dize olarak girilir.
Outgolfer Erik

2

Retina 0.8.2 , 60 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

.+
$&¶$&

Girişi çoğaltın.

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

Her satırı farklı bir klavye düzenine göre çevirmeyi deneyin.

D`

Sonucu tekilleştirmek.

Gm`^\d+$

Sadece rakam içeren satırları saklayın.


mSon aşamada ihtiyacın var mı?
ovs

@ovs Evet, önce eşleşmeler çalışır, sonra çizgiler bölünür ve eşleşmeler içeren çizgiler tutulur.
Neil

1

JavaScript (ES6), 99 bayt

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

Çevrimiçi deneyin!

Nasıl?

g

1x >= 0


1

05AB1E , 42 41 bayt

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

Port @dylnan 'ın Jelly cevap .

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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)

Bu 05AB1E madenin ucu bakın (bölüm kompres tamsayı listelerine nasıl? ) Anlamak için •Hhç₁d©u÷^Σ(“ðΣèõĆ\n-•184вise [33,34,183,36,37,38,47,40,41,61,33,64,35,36,37,94,38,42,40,41]). Bu (birlikte ) dize unicode değerlerini alarak 1'den bayt kısadır: '""!ÿ·$%&/()=""!@#$%^&*()"‚Ç.


Her iki mizanpaj için sonuç aynı olduğundan ve belirsizlik olmadığından !$ve !!$$%%vakaları yalnızca bir sayı vermelidir.
Charlie

@Charlie Oops, sabit
Kevin Cruijssen


1

Temiz , 116 bayt

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

Çevrimiçi deneyin!

Girdiyi alır ve CP437'de kodlanır. TIO sadece UTF-8'i desteklemektedir, bu nedenle, merkez noktaya karşılık gelen tek bir bayt değerini 250 almak için demo kodunda bir kaçış kullanılır (bir bayt olarak sayılır).


Her !$%iki düzen için de sonuç aynı olduğundan, giriş iki değil yalnızca bir sayı vermelidir.
Charlie

@ Charlie düzeltildi.
Octurous

1

APL (Dyalog) , 40 bayt

Anonim zımni önek işlevi. Kullanılmadığı halde · , Dyalog single byte karakter kümesindedir . ⎕IO←0Birçok sistemde varsayılan olan 0 tabanlı indexing ( ) işlevini varsayar .

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

Çevrimiçi deneyin!

 tüm argüman

'=!"·$%&/()' ')!@#$%^&*('⍳¨ bu dizelerin her birindeki karakterlerin indeksleri

{∪⍵/⍨~10∊¨⍵} Aşağıdaki lambda uygulayın ( argüman) uygulayın:

10∊¨⍵ her basamak listesi için, 10'un ("bulunamadığını" gösteren) bir üyesi olup olmadığı

~ Yerel olumsuzlama (yani yalnızca tüm basamakların bulunduğu yerler)

⍵/⍨ argümanı buna göre filtrele

 Bunun benzersiz unsurlarını bulmak


0

Dart , 125 bayt

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();
}
  • Belirtilen iki anahtar değerine sahip, 0 ile 9 arasında bir dizi oluşturur
  • Her biri için, karakter dizini kullanarak giriş dizesini karşılık gelen sayıya dönüştürün.
  • Bir sayı oluşturmak için elde edilen diziye katılın
  • '-' olan herhangi bir sayıyı kaldırın (indexOf bir karakter bulamadığında dart -1 döndürür)
  • Kopyaları kaldırmak için bir Ayar olarak geri dön

Dartpad'de dene!


0

T-SQL, 143 bayt

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

Girdi önceden var olan tablo aracılığıyla alınır i varchar alan ile v , bizim IO standartlarına göre .

Giriş tablosuna iki farklı karakter dizgisi ile birleştirilir, sonra yeni SQL 2017 işleviniTRANSLATE kullanarak karakterleri tek tek değiştirir ve TRY_CASTbir sayı ile bitip bitmediğimizi görmek için kullanır . Değilse TRY_CASTgeri döner NULL.

Son dış SELECT DISTINCTaynı sonuçları birleştirir ve filtreler NULLS.

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.