Bak anne! Kendi 10 numara sistemini kendim yaptım! [kapalı]


21

Hepimiz yaptık, iyi, belki de değil, ama kendi yabancı dilinizi ve numaralandırma sisteminizi oluşturmak özellikle fantezi yazıların temelini oluşturur, ancak çoğunlukla sadece eğlenceli bir etkinliktir.

Görev basit, iki giriş yapın:

  1. 10 [on] benzersiz “sayı” nın sıralı bir liste girişi (herhangi bir yazdırılabilir ASCII karakteri) ve bunları 0, 1, 2, 3, ..., 9 değerleri olarak yorumlayın

    + Burada rakamın ne olabileceği konusunda istisnalar var. Aritmetik operatörler (+, -, *, /), Parantezler ve boşluklar rakamlardan biri olarak kullanılamaz.

  2. Sadece bu rakamları kullanan aritmetik problem

Ve verilen formda eşdeğer tamsayı sonucunu verir.

İşte bir örnek:

INPUT

abcdefghij

bcd + efg + hij
OUTPUT

bdgi

Örnekte, 'abcdefghij' öğesinin giriş listesi (listenin hangi formda geleceğini seçebilirsiniz) aynı şekilde '0123456789' değerine karşılık gelir; 'hjkloiwdfp' de '0123456789' ile 1 ile 1’e karşılık gelir; sıfır, 'h' yapar. 'Aritmetik', 1368'e eşit olan 123 + 456 + 789'a çevrilir. Bu daha sonra verdiğimiz biçimde çıkarılmalıdır, bu nedenle b (1'i temsil eder) d (2 için) g (6 için) ve i (için 8).

Test vakaları

abcdefghij
abc + def - ghij

-gedc
qwertyuiop
qwerty / uiop

e
%y83l;[=9|
(83l * 9) + 8%

y9|8

DAHA FAZLA KURAL

  • Standart Loopholes yasaktır!
  • Bu kod golf, bayt cinsinden en kısa cevaplar kazanıyor.
  • Giriş ve çıkışları sizin için en uygun formatta alacak şekilde tam bir program veya işlev olmalıdır. (Girdilere ek bilgi ekleyemezsiniz, sadece 'rakamlar' ve ifade.
  • İstediğiniz dili kullanın (diğer kurallara uyduğu sürece)

9
2. test durumu, nihai çıktının yuvarlandığını, aksi takdirde sonuç olacağını ortaya koymaktadır q.ioiopewioyetqorw.... Eğer öyleyse, ne tür bir yuvarlama uygulanmalıdır?
Arnauld,

2
@ SriotchilismO'Zaic'in amacına katkıda bulunmak için, sizin yararınıza ve bizim için de bir kum havuzumuz var ; amaç, topluluğun yayınlanmadan önce zorlukları hassaslaştırmasına yardımcı olmaktır. Yine de bir meydan okuma için iyi bir fikir!
Giuseppe

3
Farklı diller aynı denklemi farklı şekilde değerlendirebilir, bunun bir yolu olmadığından emin değilim. Örneğin, T-SQL döner 1için 5/3değil, 2bağlı tamsayı bölüme (yuvarlama) içerir. Bu zorluğu geçersiz kılmaz, ancak aynı test durumu için farklı kabul edilebilir cevaplara izin vermeniz gerekebilir (aşağıdaki T-SQL cevabına bakınız).
BradC

2
@Giuseppe Wow, uzun süredir bu yığını taradım ve bunu hiç bilmiyordum! Özellikle, olduğum ilk poster (uzun süre dinleyici) olarak kesinlikle yardımcı olurdu. Bir dahaki sefere not tutacak! Yorumunuz ve cevabınız için teşekkürler.
Bill W

2
Bu konuda ilginç bir varyasyon ... girişte birinci dize uzunluğuna bağlı olarak, herhangi bir sayıda tabanını destekleyen bir etki olabilir
Darrel Hoffman

Yanıtlar:


11

05AB1E , 10 9 bayt

žh‡.Eò¹Åв

(Şimdi) bir karakter listesi olarak çıktı verir.

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

Açıklama:

          # Transliterate the second (implicit) input, replacing every character of 
           # the first (implicit) input with:
žh         # The builtin "0123456789"
   .E      # Then evaluate it as Elixir code
     ò     # Round it to the nearest integer
      ¹Åв  # And change it back by using a custom base-conversion with the first input as
           # base (which results in a character list)
           # (after which that result is output implicitly)

05AB1E yeni sürümü inşa halinde inşa olmasıdır Elixir'in . .EFonksiyon arayacak call_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a), neredeCode.eval_string Elixir yerleşiğidir .

05AB1E'nin eski sürümünün bunun için çalışmayacağını unutmayın, çünkü Python'da yerleşiktir. Önde gelen 0'lı sayılar değerlendirilmez:
Eski sürümdeki tüm test durumlarına bakın ( Åвyerleşik yeni olduğu için 10 bayt sürümü kullanır ).


8

R , 58 bayt

function(d,s,`[`=chartr)'0-9'[d,eval(parse(t=d['0-9',s]))]

Çevrimiçi deneyin!

chartrRakamları, parses ve evals ifadelerini değiştirmek için karakter çevirisini kullanır ve sonrachartr tekrar orijinal rakamlara geri döndürür.

En yakın tam sayıya yuvarlama gerekirse, bu

R , 65 bayt

function(d,s,`[`=chartr)'0-9'[d,round(eval(parse(t=d['0-9',s])))]

Çevrimiçi deneyin!


[3 parametreli bir fonksiyon için daha kısa bir isim kullanmak çok akıllıca. Aferin.
Robin Ryder,

6

T-SQL, 117 bayt

DECLARE @ CHAR(99)
SELECT @='SELECT TRANSLATE('+TRANSLATE(e,c,'0123456789')+',''0123456789'','''+c+''')'FROM t
EXEC(@)

Satır sonları yalnızca okunabilirlik içindir.

Giriş, IO kurallarımıza göre c (karakter) ve e (denklem) metin sütunlarına sahip önceden varolan bir tablodan t geçer. .

TRANSLATEKarakterler arasında geçiş yapmak ve yalnızca denklemi içeren bir dize oluşturmak, ancak orijinal karakterlere geri çevrilecek kodu kullanmak için SQL 2017 işlevini kullanır :

SELECT TRANSLATE(123 + 456 + 789,'0123456789','abcdefghij') 

Bu dize daha sonra kullanılarak değerlendirilir EXEC() .

Bazı karakterler olabilir (tek bir alıntı gibi 'Bu kodu kırabilecek ) olabilir; Tüm olası ASCII karakterlerini test etmedim.

Zorluğa göre, ifademi verilen şekilde, dilimin bu operatörleri nasıl yorumladığına bağlı olarak değerlendiriyorum. Gibi, ikinci test durumu 1 (we tamsayı bölünmesi nedeniyle ) ve 2 ( ) .


4

Perl 6 , 38 bayt

{*.trans($_=>^10).EVAL.trans(^10=>$_)}

Çevrimiçi deneyin!

Yuvarlamanın nasıl çalışması gerektiğinden emin değilim. O sonunda yuvarlar o zaman ben ekleyebilir .roundiçin 6 bayt . Eğer davranış/ farklı olması gerekiyorsa daha uzun olabilir. Köri gibi giriş alır f(arithmetic)(numerals)(arithmetic).

Açıklama:

{                                    }  # Anonymous codeblock
 *                                      # Returning a whatever lambda
  .trans($_=>^10)       # That translates the numerals to digits
                 .EVAL  # Evaluates the result as code
                      .trans(^10=>$_)   # And translates it back again

3

Stax , 74 66 65 bayt

┼ö8Q#xóπcM~oÖ÷╦├mî☼yº─▐4ç≥e╘o▄ê‼ø_k╜ø8%N╫ ╗e<.╗P[─╛èA±!xêj«w╠°{B♪

Koş ve hata ayıkla

Stax, burada gerçek anlamda bir "eval" talimatı bulunmadığı için başarılı değil. Belgelerde "eval" olarak adlandırılan bir taneye sahip, ancak tam ifadeler üzerinde değil, yalnızca gerçek değerler üzerinde çalışıyor.


Bu, operatörün hassasiyetine uymayabilir. Gerçi gerekli olup olmadığından emin değil misiniz? staxlang.xyz/…
dana

@dana: Güzel nokta. Bunu düşünmedim. Bir düzeltmenin bazı baytlara mal olması muhtemeldir, bu yüzden bu davranışı değiştirmeye çalışmadan önce biraz açıklama beklerim.
özyinelemeli

3

Bash, 97 bayt

IFS=''
read S
read O
A=`echo "$O"|tr "$S" 0-9`
printf %0.f `bc<<<"(${A[@]##0})+0.5"`|tr 0-9 "$S"

Turdan ziyade kesebilirsek daha az olabilir. Ayrıca Bash, 0 ile başlayan sayıları sekizlik olarak yorumlar;


Golf için "bc" ve "tr" gibi yardımcı programları kullanma konusundaki fikir birliği nedir?
Ağustos’ta

1
Uzman değilim, ancak bu tür cevapların genellikle "bash + coreutils" gibi bir şey olarak gönderildiğini düşünüyorum
Giuseppe

@Giuseppe tr, coreutils'in bir parçasıdır, ancak bcdeğildir. Bununla birlikte, bcçok yaygın bir araçtır. Bu cevaptaki diğer her komut bash.
rexkogitans

-7 bayt @ CM'nin cevabından çalındı ​​ve '0123456789' değerini '0-9'
seviyesine düşürdü

T'yi tanımlamak artık avantajlı değildir: $Tsadece bir bayt daha kısadır 0-9, sadece iki kez kullanırsınız ve tanımlamak için 8 bayt harcarsınız.
Ağustos’ta

2

Fasulye , 94 90 bayt

HexDump

00000000: 53d0 80d6 d800 d3d0 80a0 1f20 8047 53a0  SÐ.ÖØ.ÓÐ. . .GS 
00000010: 1753 d080 d3d0 80a0 5e20 800a a181 8100  .SÐ.ÓÐ. ^ ..¡...
00000020: 40a0 5f52 cac3 4da0 6580 53d0 80a0 5d20  @ _RÊÃM e.SÐ. ] 
00000030: 8089 205f a065 205f 2080 0aa1 8181 0123  .. _ e _ ..¡...#
00000040: 0058 0020 800a a181 8102 40a0 6550 84a0  .X. ..¡...@ eP. 
00000050: 5d20 652e dce2 b02b dc64                 ] e.Üâ°+Üd

JavaScript

`${Math.round(
  eval(
    b.replace(
      /./g,
      c => ~(i = a.indexOf(c)) ? i : c
    ).replace(
      /\b0+/g,
      ''
    )
  )
)}`.replace(
  /\d/g,
  i => a[i]
)

açıklama

Bu program dolaylı olarak girdilerin birinci ve ikinci satırlarını değişkenlere ave bsırasıyla değişkenlere atar .

Her karakter chattında bilgili indeksi ile değiştiriliri hattı üzerinde bulunan karakterina veya kendisi ile değiştirilir.

Daha sonra 0, sonuçta elde edilen dizgeden bir ya da daha fazla s gelen bir diziyi siler . Bu, ile eval()başlayan herhangi bir basamak sırasını değerlendirmekten kaçınmaktır .0 sekizli bir değişmez olarak .

Sonrasında eval()ve Math.round()sonuç bir dizgeye geri zorlanır ve her bir rakam karakteri i, adizindeki satırdan karşılık gelen karakter ile değiştirilir i.

Test Kılıfları

gösteri

abcdefghij
abcd + efg + hij

bdgi

gösteri

abcdefghij
abc + def - ghij

-gedc

gösteri

qwertyuiop
qwerty / uiop

e

gösteri

%y83l;[=9|
(83l * 9) + 8%

y9|8

2

Perl 5 -p , 63 bayt

$p=<>;eval"y/$p/0-9/";s/\b0+\B//g;$_=int.5+eval;eval"y/0-9/$p/"

Çevrimiçi deneyin!

İfadenin ilk satırdaki satırına, ikinci satırdaki çeviri listesine geçer.


1

Perl 5 , 130 bayt

sub f{eval sprintf"'%.0f'=~y/%s/%s/r",eval(eval(sprintf"\$_[1]=~y/%s/%s/r",@r=map"\Q$_",$_[0],'0123456789')=~s,\b0,,gr),reverse@r}

Çevrimiçi deneyin!

Belki bu çifte değerlendirme bir şekilde dönüştürülebilir s/.../.../geer.


1

Kömür , 14 bayt

⍘UV⭆η⎇№θι⌕θιιθ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Not: İfade, Python 3 semantiğine göre değerlendirilir, bu nedenle örneğin sıfır olmayan numaralarda baştaki sıfırlar geçersizdir. Açıklama:

   ⭆η           Map over expression's characters and join
        ι       Current character
      №θ        Count matches in first input
     ⎇          If non-zero
         ⌕θι    Replace with position in first input
            ι   Otherwise keep character unchanged
 UV             Evaluate as Python 3
⍘            θ  Convert to base using first input as digits

Maalesef liderler 0test senaryolarında bulunan Python'da çalışmıyor.
Jonathan Allan,

0

Python 3 , 137 bayt

Regex olmayan bir yaklaşım , karakterleri kullanmak str.translateve str.maketransdeğiştirmek için kullanılır . Baştaki sıfırları düzeltirken birçok karakter kaybettim ...

lambda s,t,d='0123456789',e=str.translate,m=str.maketrans:e(str(round(eval(' '.join(c.lstrip('0')for c in e(t,m(s,d)).split())))),m(d,s))

Çevrimiçi deneyin!


0

Python 3 , 167 bayt

import re
a=[*enumerate(input())]
e=input()
for i,c in a:e=re.sub(c,str(i),e)
e=str(round(eval(re.sub(r'\b0+(?!\b)','',e))))
for i,c in a:e=re.sub(str(i),c,e)
print(e)

Çevrimiçi deneyin!

İyileştirme için oda ...


Son test davasında hala başarısız oluyor: tio.run/…
ruohola

0

Wolfram Dili (Mathematica) , 121 bayt

İki argümanla saf bir fonksiyon tanımlarım. Bazı işlevler tekrarlandığından, birkaç karakter kaydetmek için bunları bir değişkende saklarım. Bu kod basitçe bazı string değişimlerini yapar ve ardından ToExpressionifadeyi Wolfram çekirdeği ile değerlendirmek için kullanılır.

(r=Thread[StringPartition[#,1]->(t=ToString)/@Range[0,9]];u[(u=StringReplace)[#2,r]//ToExpression//Round//t,Reverse/@r])&

Çevrimiçi deneyin!


0

Lua , 162 151 150 bayt

  • -11 byte kullanma fikrim sayesinde load yerine kullanımfunction(...) end
  • Newline atlayarak -1 bayt
l,p=...print(((math.ceil(load('return '..p:gsub('.',load'n=l:find(...,1,1)return n and n-1'))()-0.5)..''):gsub('%d',load'c=...+1 return l:sub(c,c)')))

Çevrimiçi deneyin!

Dünyadaki en kısa şey değil (Lua, özellikle büyük anahtar kelimelerle sizi oldukça zorlu hissetmeye zorlar), ancak yaratması oldukça eğlenceliydi. Tam program argümanlar ve baskı sonucu olarak girdi.

açıklama

Giriş

l,p=...

Değişkenlere değişkenlerden değerler atayın. Sözlüğümüz lve anlatım p.

Aşağıdaki ifadeyi anlamak oldukça zor çünkü garip bir uygulama sırası var, bu yüzden adım adım anlatacağım:

Normal sayılara dönüştürme

p:gsub('.',
load'n=l:find(...,1,1)return n and n-1')

İfade dizgisinde değiştirme yapın: her bir sembolü alın ve işlevine loadgeçirin ( burada normal bildirimden kısa olduğu kanıtlandı).

İşlev, geçirilen sembol kullanımı için dikt dizgisindeki oluşum konumunu bulur find. ...buradaki ilk (ve sadece) argümandır, burada vaarg fonksiyonundayız (herhangi bir loaded is) mevcut sembolümüz . findÖzel sembolleri yoksaymak için aşağıdaki argümanlar gereklidir ( 1yalnızca trueboole dönüştürüldüğü zaman değerlendiren kısa bir değerdir ): başlangıç ​​konumu (burada bir varsayılan)plain aslında desen işlemeyi devre dışı bırakır. Bu programlar olmadan üçüncü test durumunda başarısız olur% özel olmaları oluyorlar.

Eşleşme bulunursa, birini Lua dizeleri (ve btw dizileri) 1 tabanlı olduğundan çıkarın. Eşleşme bulunmazsa, hiçbir şey döndürmez ve değişiklik yapılmaz.

Çözme

math.ceil(load('return '..ABOVE)()-0.5)

Başına Ekle return döndürmesine izin vermek, Lua işlevi olarak derleyip hesaplamak, yapmak için ifademize bağlı ( bu , onu kısaltmak için tersine döndü).

Sonunda sorunumuza sayısal bir çözüm bulduk, ancak geri dönüşümü kaldı.

Yine delirtmek

(ABOVE..'')
:gsub('%d',load'c=...+1 return l:sub(c,c)')

İlk satır, sayıyı dizeye dönüştürmek için kısa bir yoldur, bu nedenle şimdi dize yöntemlerini kısa bir şekilde çağırabiliriz. Hadi yapalım!

Şimdi gsubher şeyi tekrar deliliğe çevirmek için tekrar aranıyor. Bu süre %d, .fonksiyonumuzun sadece sayıları işlemesi gerektiği ve ( .sayıları negatif sayılarla sonuçlanacak) işlemesi gerektiği için değiştirme modeli yerine kullanılır . Bu zaman fonksiyonu ( loadtekrar bayt kaydetmek için ed) ilk kez ekler1 ilk (ve sadece) vaar değişkenine eklenir, onu dict string'deki pozisyona dönüştürür, sonra karakterini o pozisyonda döndürür.

Yaşasın, neredeyse orada!

Dramatik final veya Neden Parantez Önemli

print((ABOVE))

Peki ... neden yine de iki çift braket var? Parall hakkında konuşma zamanı… eh, Lua'da çoklu geri dönüş. Mesele şu ki, bir işlev bir çağrıdan birkaç değer döndürebilir ( daha fazla örnek için bu meta soruya bakın).

Burada, en son gsubiki değer döndürüldü: ihtiyacımız olan cevap dizesi ve yapılan değiştirme miktarı (gerçekte basamak sayısı, ama kimin umrunda). Eğer iç çift için olmasaydı, hem sicim hem de sayı basılır ve bizi mahvederdi. İşte burada ikinci sonucu atlamak ve son olarak bu delilik fabrikasının ürününü basmak için iki bayt feda ediyoruz.


Neredeyse ilk etapta golf oynamak kadar açıklamaktan zevk aldım, umarım burada olanları almışsınızdır.


Not: Tüm sınamalardan geçer, ancak muhtemelen diğerlerinde yanlış yuvarlar. Bir tane bulabilirseniz, düzelteceğim.
val diyor Reinstate Monica
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.