Bozuk Telefon Numaraları


19

Nasıl sesli mesaj alıyorsunuz ve kişinin bağlantısı harika değildi ve onları nasıl arayacağınızı anlamaya çalışıyorsunuz, ancak bunun "5" veya "8" olup olmadığından emin değilsiniz. dedim?

İşte bu meydan okuma.

İyi haber, arayan kişinin numaralarını iki kez okuması, ancak her iki yerde de bozuk olması.

Programınız aşağıdaki gibi girdi almalıdır:

5551231234 / 5551231234

İlk on hane sesli mesajda ilk kez telefon numarası söylendiğinde ve ikinci küme ikinci kez söylenir. Sadece ... daha çok benzeyecek:

555?ABC1_36? / 55?522_1?234
  • Bir rakam ve ardından soru işareti, bu rakam için en iyi tahminin bu olduğu anlamına gelir (örn. "5?", "Muhtemelen 5, tekrarla karşılaştır" anlamına gelir).
  • Alt çizgi bilinen bir eksik basamağı gösterir, statik tarafından hiç deşifre edilemeyecek kadar bulanık bir şey.
  • Harfler sadece şudur: harfler. Onlara ilgili basamakları gibi davranın
    • ABC -> 2, DEF -> 3, GHI -> 4, JKL -> 5, MNO -> 6, PQRS -> 7, TÜV -> 8, WXYZ -> 9
    • Tüm örnek girişler büyük harf kullanır (ToUpper () çağrısını güvenle çıkarabilirsiniz)
    • Diliniz küçük harflerle daha iyi çalışıyorsa, giriş için küçük harfleri özgürce kullanabilir ve ToLower () çağrısını atlayabilirsiniz. Sadece cevabınıza dikkat edin.

Ayrıca, aşağıdaki karar çağrılarını kabul edebilirsiniz:

5? / _     -> 5  //5 is the best guess we have, use it
5? / 5?    -> 5  //uncertain, but matching
5? / 4?    -> ?  //conflict
 5 / 4     -> ?  //conflict
5? / 4     -> 4  //solid information overrides possible value
 5 / 4?    -> 5  //solid information overrides possible value
 _ / _     -> ?  //no information available

Ayrıca, tüm girişlerin soru işaretleri dahil değil, on haneli telefon numaraları içerdiğini varsayabilirsiniz. On basamak olmayan girişler (örn. 1234567 / 1234567) Çözülemez (falsey çıkışı) olarak değerlendirilebilir veya bir hata verebilir.

Giriş

0-9A-Z _?/Yukarıda açıklandığı gibi bir karakter satırı .

Çıktı

Geçerli bir on basamaklı telefon numarasına ayrıştırılabilirse, telefon numarasını girin. Aksi takdirde bir tür hata göstergesi (örn. -1, yanlış veya boş bir çizgi) çıktılayın.

Her zamanki gibi en kısa galibiyet.

Örnek girişler:

1234567890 / 1234567890
1234567890? / 1234567890
123456789_ / 1234567890
1234567890? / 123456789_
1234567890 / 1234567890?
1234567890 / 123456789_
123456789_ / 1234567890?
1234567890? / 1234567890?
1234567890? / 1234567891?
123456789_ / 123456789_
555CALLUS1 / 5552255871
404_12?6039 / 4041?1560_9
_GETREVENGE / 16?36?_2838_
1?691460_50 / 16_14609?50
61?08977211 / 612?897725?1
40?0INSTA__ / 8?00_NSTI?LL
3985_534?10 / 39?8?5053_10
7__7294?737 / 7797299?_37
28?897_384?1 / _8?89763861
271168090_ / 27116800?09
6802?148343 / 67?01148343
94_11628?2?6? / 9491162_47?
17?4285_689 / 1__26?52689
6_311?95_38 / 6731194?7?38
380?7DRAGON / 3807378?5?66
4?647_93236 / 5646?6?9__36
365?268898_ / 366267?7?984
GRATEDBATE / IRATEDBATE
5307_079?93 / ____8_____
535_3_0255 / 52?5_3_024?5
55_____088 / 54?2397207?7?
6_48398_95 / _946?398?6_5?
_0_312_3_1 / 81?53123?1?71
____1_____ / 64?255?508?61
8427820607 / 6?424?8?__6?07
50_3707__6 / 52?8375?74?56
615___8255 / 62?526?983?2?1?
__652618__ / 8365261__0
149___933_ / 1_9677?92?31
___7?281562 / 3438?28154?2
5?7?7?___8?3?7?4 / 57_855837_
605_272481 / 605427__81
86?569__731 / 88560?0?7721
1__91654?15 / 17?9?9165715
800NWABODE / 80069ABI?DE
8___9017_0 / 8_2494?12?9_
_024?5?91?470 / 304?17908?7_
42510704_2 / 4_51070492
9338737_89 / 93_873PLUS
327762_401 / 327_MASH01
33093_2058 / 3309_12058
4061_33578 / 40619_3578
559_383197 / 559938_197
94_9746084 / 9459746_84
1_37655238 / 163POLKA_T
_672FRIZZY / 767237499_
8_76318872 / TIP63188_2
51_8404321 / 5178404_21
358_030314 / 358603_314
2597_85802 / 25979_5802
77141_1408 / 7714_91408
330858_457 / 330_586457
4686079_39 / 46_6079239
86457508_6 / 8_45750826
523226626_ / _23BANNANA
_ISSY_ISSY / 44__9548?79?
6?00B_YJILT / 800289KILL?
2?52803___0 / 1526?0390?61?
FI?ND___T?HE / EAS?T?EREGGS?
0_231?95_38 / 0723194?7?38
0?647_39236 / 0646?6?3__36
025?267798_ / 06?6265?9?984
0061_33578 / _0619_3578

Sadece mümkün olan her son durumun (ilk 11 giriş) ele alındığından emin oldum, ancak bunun dışında oldukça rastgele.

Güncelleme

En alttaki dört giriş, baştaki sıfırlarla (Jonathan Allan'ın önerisiyle) eklendi.

Örnek girişler için doğru çıkış:

https://pastebin.com/gbCnRdLV

Jonathan Allan'ın girişinden elde edilen çıktıya dayanarak (biçimlendirilmiş çıktı idealdir).


Girdileri " / "birbirinden ayırarak tek bir dize olarak almalı mıyız yoksa bunları iki standart girdi olarak alabilir miyiz?
L3viathan

@ L3viathan Başlangıçta bu fikri tek bir ip almak zorunda kaldım.
Draco18s

7
@ Draco18s tek dize zorluğa hiçbir şey getirmiyor
fəˈnɛtɪk

1
@ fəˈnɛtɪk Hiç kimse sanal alanda bir şey söylemedi, ancak girdi çiftlerini kullanmaya karşı hiçbir şeyim yok . Ben ilk başta onu tasarladım.
Draco18s

1
Kim telefon numarası için harfleri kullanarak sesli mesaj bırakır ?!
Jonathan Allan

Yanıtlar:


3

Jöle , 84 bayt

+4 bayt - Her durumda muhtemelen aynı şekilde davranması gerektiğini düşünüyorum, bu yüzden tuş takımı arama tamsayılarını kullanarak tekrar sayısal karakterlere dönüştürdüm +49Ọ.

”?e‘ḣ@µ”_eḤ‘ẋ@
;Ṃµ68DṬ+3RØAṁẇ@€FT+49Ọȯµ€Fṡ2i”?Ḃ$ÐḟÇ€
ḟ⁶ṣ”/Ç€ZLÐṂ€Q€LỊ$ÐfF€Ḣ€ḟ”_µL⁼⁵ȧ

Dizeyi belirtilen biçimde alan ve telefon numarasını bir karakter listesi veya geçersizse sıfır olarak döndüren bir işlev. Bir program olarak, bu bir dize gibi yazdırılır.

Çalışma şekli, sayıyı daha fazla tekrarlayabilir
(örneğin "123456789_ / 123456789_ / 1234567890")
... hatta sadece bir kez söyleyebilir ve tanımlanan mantık geçerli olacaktır.

Çevrimiçi deneyin! veya tüm örnek girişlere bakın .

Nasıl?

”?e‘ḣ@µ”_eḤ‘ẋ@ - Link 1, helper to vary the length of a 2-slice: list s
”?             - literal '?'
  e            - exists in s                   (1 or 0)
   ‘           - increment                     (2 or 1)
    ḣ@         - head with reversed @rguments  (s or s[:1] - removes 2nd value if not '?')
      µ        - monadic chain separation, call that t
       ”_      - literal '_'
         e     - exists in t                   (1 or 0)
          Ḥ    - double                        (2 or 0)
           ‘   - increment                     (3 or 1)
            ẋ@ - repeat t that many times      (t*3 or t - [`_`]->['_','_','_'])

;Ṃµ68DṬ+3RØAṁẇ@€FT+49Ọȯµ€Fṡ2i”?Ḃ$ÐḟÇ€ - Link 2, reformat a phone number: char list of [0-9][A-Z], p
;                                     - concatenate p with
 Ṃ                                    - minimum of p - (?<_<0<1<...<9<A<...<Z - never "?" however, since it only follows a digit.)
                                      -   - this is simply to make a 2-slice with the last character on the left, as used at the very end of this link.
  µ                                   - monadic chain separation call that q
                       µ€             - monadic chain separation, for €ach v in q do:
   68                                 -   literal 68
     D                                -   cast to a decimal list -  [6,8]
      Ṭ                               -   untruth                -  [0,0,0,0,0,1,0,1]
       +3                             -   add 3                  -  [3,3,3,3,3,4,3,4]
         R                            -   range                  -  [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3,4],[1,2,3],[1,2,34]]
          ØA                          -   uppercase alphabet     -  ABCDEFGHIJKLMNOPQRSTUVWXYZ
            ṁ                         -   mould like the range ^ -  [ABC,DEF,GHI,JKL,MNO,PQRS,TUV,WXYZ]
             ẇ@€                      -   sublist v exists in that? for €ach, with reversed @rguments
                F                     -   flatten        (e.g. 'E' -> [0,1,0,0,0,0,0,0]; '4' -> [0,0,0,0,0,0,0,0]
                 T                    -   truthy indexes (e.g. 'E' -> [2]; '4' -> [])
                  +49                 - add 49
                     Ọ                - cast to character
                      ȯ               -   or             (e.g. 'E' -> [3]; '4' -> '4')
                         F           - flatten
                          ṡ2          - all slices of length 2
                                 Ðḟ   - filter discard if:
                                $     -   last two links as a monad:
                            i         -     first index of
                             ”?       -     literal '?'   (first index returns 0 if none exists)
                               Ḃ      -   mod 2 (so this filter discards pairs starting with '?')
                                   Ç€ - call the last link (1) as a monad for €ach slice

ḟ⁶ṣ”/Ç€ZLÐṂ€Q€LỊ$ÐfF€Ḣ€ḟ”_µL⁼⁵ȧ - Main link: string (or char list) s
ḟ                               - filter discard any:
 ⁶                              - literal ' '
  ṣ                             - split on:
   ”/                           - literal '/'
     Ç€                         - call the last link (2) as a monad for €ach
       Z                        - transpose
         ÐṂ€                    - filter, for €ach, keep items with minimal:
        L                       -   length
            Q€                  - de-duplicate €ach
                 Ðf             - filter keep items with:
                $               - last two links as a monad:
              L                 -   length
               Ị                -   insignificant? (=1 effectively here)
                   F€           - flatten €ach
                     Ḣ€         - head €ach
                       ḟ        - filter discard any of:
                        ”_      -   literal '_'
                          µ     - monadic chain separation, call that r
                           L    - length(r)
                             ⁵  - literal 10
                            ⁼   - equal?
                              ȧ - and r (0 if r did not result in a 10-digit list, else r)

Bir hata olabileceği anlaşılıyor, şu şekilde 55_____088 / 54?2397207?7?çözülmeli 5523972088: tüm eksik rakamlar var ve sağdaki belirsiz rakamlar solda mevcut. Tüm basit vakalar yine de çalışır.
Draco18s

Ah, gereksiz bir filtre olduğunu düşündüğüm şeyi kaldırdım, değildi. Sabitleme ...
Jonathan Allan

Daha önce orada - ve golf değildi! ;)
Draco18s

Biraz zaman aldı Ooof (ben test ederken farklı bir hata buldum), bunu düzeltirken sadece filtre ekleyerek aynı bayt sayısına geri döndüm (vay canına).
Jonathan Allan

@ Draco18s - her şey sana iyi geliyor mu? Sorudaki test senaryoları için beklenen çıktıyı vermek ya da geçersiz olanları ayırmak iyi olabilir.
Jonathan Allan

7

Piton 2 , 314 307 274 bayt

lambda s:g(*''.join(q<n<"["and`(int(n,36)-4-(n>"R")-(n>"Y"))//3`or n for n in s).split(" / "))
def g(a,b,s=str.startswith):
 if b:c,d,e,f=a[0],a[1:],b[0],b[1:];b=(c==e and[c,q][c=="_"]or"_"in c+e and min(c,e)or[q,c,e][s(f,q)-s(d,q)])+g(d[s(d,q):],f[s(f,q):])
 return b
q="?"

Çevrimiçi deneyin!


5

Python 3, 549 530 509 453 449 410 406 394 393 391 bayt

Eminim bu geliştirilebilir, ama bu bir başlangıç:

def f(e,z,q="?",u=str.isnumeric):
 if e+z in(e,z):return""
 o,O,t,T,*x=e[0],e[1:2],z[0],z[1:2],e[1:],z[1:]
 if"?"in o+t:return f([e,x[0]][o==q],z)
 if u(o):
  if u(t):return t+f(*x)if O==q!=T else o+f(*x)if o==t or T==q!=O else 1
  return o+f(*x)
 if u(t):return t+f(*x)
def g(s):
 for a,b in zip(map(chr,range(65,91)),"2223334445556667777888999"):s=s.replace(a,b)
 return f(*s.split(" / "))

Ben kullanıyorum str.translatemektupları ve sarıcı işlevi gOnları istediğiniz formatta girişler yapmak üzere. Gerçek işlev fözyinelemelidir ve belirsiz girişler için başarısız olur. Yine de orada çok sayıda repititions var, bu yüzden iyileştirme için çok yer olduğundan eminim.

İyileştirmeler:

  • koşulları birleştirerek 19 bayt tasarrufu
  • üçlü ile 21 bayt kurtardı
  • @TuukkaX sayesinde manuel sözlük yerine sözlük anlama kullanarak 56 bayt tasarruf etti
  • @ TuskaX'ın geliştirmesiyle @ovs tarafından önerilen yönteme geçerek 4 bayt tasarruf etti
  • @ovs'dan iyileştirmelerle 38 bayt kaydedildi (ve son çıkarılabilir boşluk kaldırıldı)
  • str.isnumericbir anahtar kelime bağımsız değişkenine tanım koyarak 4 bayt kaydetti
  • kombine karşılaştırma operatörleriyle 12 bayt kaydedildi (örn. T==q!=O)
  • not(e or z)dönüştürerek 1 bayt tasarruf etti e+z in(e,z).
  • sık kullanılan kaydederek 2 bayt kaydedildi (E,Z)

Bu, üst satırdaki varsayılanları içermeyen bir sözlük anlama içerir. 3'ün dizilerinden nefret ediyorum, ama bunların yerine matematik de geçebilir.
Yytsi


@ovs Güzel. Alfabe map(chr,range(65,91))olsa değiştirilebilir .
Yytsi

2
RE: Bunu itibarından feragat etmek için bir topluluk wiki yapmak , fikir birliği hayır olurdu , sadece nazik yardımı kabul edin ve sahip olduğunuz gibi kredi verin.
Jonathan Allan

1
Buraya her geldiğimde yemin ederim, bu cevap kısalıyor: D
Draco18s

3

JavaScript (ES6), 180 190 188 bayt

Düzenleme: Falsy çıkış kuralına uymak için +10 +9 bayt


Kıvrımlı sözdiziminde iki girdi dizesini alır (a)(b). falseTahmin edilen telefon numarasını temsil eden bir dize veya dize döndürür .

a=>b=>!(s=(F=a=>a.match(/(.\??)|_/g).map(([x,y])=>(x<=9?++x:parseInt(x,36)*.32-(x>'Y'))|(x!='_'&!y)*16))(a).map((x,i)=>(x=(d=x^(y=F(b)[i]),x>y)?x:y)&&(d&16|!(d%x))?--x&15:a).join``)[10]&&s

Nasıl çalışır

Adım # 1 - Giriş dizelerini ayrıştırma

Önce F(), aşağıdaki kuralları uygulayarak bir dizeyi tamsayı dizisine çeviren işlevi tanımlarız :

  • alt çizgi 0'a dönüştürülür
  • bir rakam N veya eşdeğer bir harf (N + 1) OR 16'ya dönüştürülür (örneğin "2" → 19, "R" → 24)
  • bir rakam N veya eşdeğer bir harf ve ardından bir sorgulama işareti N + 1'e dönüştürülür (örneğin "2?" → 3, "R?" → 8)

Hangi başka bir şekilde şöyle yorumlanabilir:

  • 0 bilinmiyor
  • [ 1 .. 10 ]güvenilir değil
  • [ 17 .. 26 ]güvenilir

Biz uygulamak F()hem ave b. Bu bize telefon numarasındaki her bir rakam için iki olası yoruma karşılık gelen bir çift tam sayı (x, y) verir.

Adım # 2 - Rakamları tahmin etme

Her bir çift (x, y) için şunu hesaplıyoruz:

  • d = x XOR y
  • x = MAX (x, y) güvenilir değerler her zaman güvenilir olmayanlara tercih edilir

Eğer x == 0 , her iki girişler çizgi karakterler olduğu anlamına gelir. Yani, rakam bu durumda bilinmiyor.

Eğer x! = 0 , aşağıdaki koşullardan biri doğruysa, biz güvenle rakamı çıkarabiliriz:

condition       | interpretation
----------------+------------------------------------------------------
(d AND 16) != 0 | one input is unreliable and the other one is reliable
d == 0          | both inputs are identical
d == x          | one input is an underscore

Son iki koşul birleştirilebilir !(d % x). Dolayısıyla son formül:

x && (d & 16 || !(d % x))

Doğruysa, x'i (x - 1) VE 15'i hesaplayarak x'i tahmin edilen basamağa dönüştürürüz .

Test senaryoları

(Konsol snippet'i daha fazla çıktı geçmişini destekleyemediği için yalnızca ilk 50 tanesi.)


1234567890? / 1234567890?çözümlenmelidir 1234567890. Şu anda kodunuz 123456789?girişten daha az bilgilendirici. Assume: 5? / 5? -> 5 //uncertain, but matching
Draco18s

@ Draco18s Belirttiğimin aksine, 51 test vakası ekledim . Böylece birincisi düştü ve her şey bir sıra değişti. (Şimdi düzeltildi. Üzgünüm.)
Arnauld

Aaah. Yine de, bu test senaryoları için bir tür falsey veya hata değeri vermelidir. Ama aksi halde iyi görünüyor.
Draco18s

2

Perl 5 , 211 bayt

... girinti olmadan ve \ n satırsonu olmadan

@i=map{y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/22233344455566677778889999/;$_}split' / ',shift;
print map{
  $_=join'',map{s,(\d\??|_),,;$1}@i;
  /((\d)\??\2\??|(\d)\??_|_(\d)\??|(\d)\d\?|\d\?(\d))$/;$2//$3//$4//$5//$6//'?'
}1..10

Çevrimiçi deneyin!


Görünüşe 83652618?0göre bir tür falsey veya hata değeri yerine "yapabileceği en iyi" ( ) döndürüyor .
Draco18s

Yanılmıyorsam bulmacanın istediği buydu. "Aşağıdaki karar çağrılarını ek olarak üstlenebilirsiniz" başlığı altındaki durumlara bakın. Ya da değil?
Kjetil S.25

Üzgünüz, cevabınız hakkında hiçbir bildirim almadım (söz konusu değil). Karar çağrıları için yaptığım bölüm ?, eksik bilgileri çözmenin bir yolu olmadığını belirtmek için a kullanır , bu da daha sonra Çıktı bölümüne ...Otherwise output some form of error indication (e.g. -1, false, or an empty line).
düşmelidir

2

Retina, 150 140 136 bayt

Kritixi Lithos sayesinde birkaç bayt tasarruf etti

T`?L`#22233344455566677778889
./.

(?<=(\d)(\w#?){9}).#|.#(?=(\w#?){9}(\d)(?!#))
$1$4
#

_(?=.{9}(.))|(?<=(.).{9})_
$1$2
^(\d*)\1$|.*
$1

Çevrimiçi deneyin!

Açıklama:

İlk satır ?, girişteki tüm satırları# tüm harfleri ve tüm harfleri sayısal eşdeğerlerine dönüştürür. Daha sonra boşlukları ve /girişten kaldırıyoruz . Sonraki iki satır, "tahmin ve kesinlik" vakalarıyla ilgilenir (örn. 5? \ 4İle değiştirilir 4 \ 4). Tüm #s kaldırıldıktan sonra , 8 ve 9 numaralı satırlar "sayıya karşı _" durumlarıyla ilgilenir ( _ \ 3olur 3 \ 3). Ardından, dizenin her iki yarısı da eşleşirse, ilk 10 basamağı tutarız. Aksi takdirde, telefon numarası geçersiz olduğundan her şeyi kaldırıyoruz.

İsteğe bağlı uzunluk (ve eşit boyut) telefon numaraları için çalışan 160 baytlık alternatif çözüm: TIO


Değişebilirsin (/|_)için [/_]1 bayt kaydedin. Ayrıca Kullanabileceğin düşünüyorum ;yerine xböylece [^x]haline gelebilir\w
Kritixi Lithos

1

PHP, 251 236 bayt

for(;a&$c=preg_replace(["#[^_?](?!\?)#","#_#"],["$0k","?<"],join("-",$argv))[++$i];)${$k+="-"==$c}.=$c<_&$c>=A?0|(ord($c)-($c>W)-($c>P)-59)/3:$c;for(;$c=${1}[$k+1];)echo($n=${1}[$k])==($m=${2}[$k++])|($b=${2}[$k++])!=$c?$c>$b?$n:$m:"?";

komut satırından girdi alır; ile çalıştırın -nrveya çevrimiçi deneyin .

Yıkmak

# A: transform input
                                    # 2. replace single chars with two-character chunk and make sortable:
                                    #   replace "_" with "?<", append "k" to everything else not followed by "?"
for(;a&$c=preg_replace(["#[^_?](?!\?)#","#_#"],["$0k","?<"],join("-",$argv))[++$i];)    # (unknown "<" < unsure "?" < certain "k")
${$k+="-"==$c}.=                # if "-", next argument
        $c<_&$c>=A              # if letter
            ?0|(ord($c)-($c>W)-($c>P)-59)/3 # then translate to digit
            :$c                             # else don´t
    ;
# B: evaluate
for(;$c=${1}[$k+1];)            # loop through arguments: $c=command 2
    echo
        ($n=${1}[$k])                   # $n=digit 2
        ==                          # if digits are equal
        ($m=${2}[$k++])                 # $m=digit 3
        |
        ($b=${2}[$k++])             # $b=command 3
        !=$c                        # or "commands" are not
            ?$c>$b?$n:$m            # then get the one with the more definitive "command"
            :"?"                    # else conflict/unknown
    ;

golfings

  • preg_replace ilk: -8 bayt
  • join: -2
  • $$kyerine $t[$k]: -5

1

PHP, 200 + 8 bayt

Arnaulds çözümünden ilham aldı .

for($s=join($argv);$c=ord($s[$i++]);$i+=$x)$t[]=$c>90?63:15&($c<65?$c:($c-($c>80)-($c>87)-59)/3)|16*$x="?"==$s[$i];for(;$p++<10;)echo chr(($e=$t[$p]^$d=$t[$p+10])&48|!(15&$e)?min($t[$p],$d)&15|48:63);

komut satırı bağımsız değişkenlerinden girdi alır; ile çalıştırın -nrveya çevrimiçi deneyin .

hata çıkış kısıtlamasına uyacak değişiklikler: ( Xeksik numara için yazdır ):

  • kaldır |48(-3 bayt)
  • (+11 bayt) echo chr(...);ile değiştir$r.=...;echo$r>1e10?X:$r;

Yıkmak

for($s=join($argv);$c=ord($s[$i++]);    # loop through characters of arguments
    $i+=$x)                             # skip "?"
$t[]=
    $c>90                               # if "_"
        ?63                             # then 32+16+15
        :                               # else
            15&(                            # lower 4 bits of
            $c<65                               # if digit
            ?$c                                 # then digit
            :($c-($c>80)-($c>87)-59)/3          # else letter mapped to digit
        )
        |16*$x="?"==$s[$i]                  # if next char is "?", add 16
;
for(;$p++<10;)echo chr( # loop through translated arguments
    (
        $e=$t[$p]^      # 2. $e=difference
        $d=$t[$p+10]    # 1. $d=char from 2nd argument
    )&48                # if certainties differ
    |!(15&$e)           #    or digits do not
    ?min($t[$p],$d)&15|48   # then pick the more definite digit (15|48 -> "?")
    :63             # else "?"
);

golfings

  • geçici çözüm preg_replace_callback(-10 bayt)
  • 10 haneli girişe güvenin (-9)
  • ve ek golf (-8)
  • kaldırılmış joinayırıcı (-7)
  • $xödevi sonuna taşıdı (-2)

1

Perl 5 -pl , 173 bayt

sub t{$_=pop;y/A-Z/22233344455566677778889999/;/_|\d\??/g}@e=m|\S+|g;@a=t$e[0];$_=join"",map{$_.=shift@a;s/^(.+)\1$/$1/||s/_//||s/..../_/||s/.\?//;$_}t$e[2];s/\?//;$_ x=!/_/

Çevrimiçi deneyin!

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.