Kağıt ve Zarf Boyutları


17

Görev

Bir harf (A, B, C) ve bir sayı (0-10) verildiğinde, eşleşen standart kağıt boyutunun (A ve B Serisi) veya eşleşen standart zarf boyutunun (C serisi) milimetre cinsinden çıktısını alın aaaa x bbbbnerede aaaave bbbbISO216 (Seri A ve B) veya ISO296'ya (Seri C) göre milimetre cinsinden genişlik ve yükseklik ölçümleri

İşleri kolaylaştırmak için Wikipedia'nın Kağıt Boyutları tablosundan alıntı yapacağım

ISO paper sizes in portrait view
Format  A series    B series    C series
Size     mm × mm      mm × mm    mm × mm
0       841 × 1189  1000 × 1414 917 × 1297
1       594 × 841    707 × 1000 648 × 917
2       420 × 594    500 × 707  458 × 648
3       297 × 420    353 × 500  324 × 458
4       210 × 297    250 × 353  229 × 324
5       148 × 210    176 × 250  162 × 229
6       105 × 148    125 × 176  114 × 162
7        74 × 105     88 × 125   81 × 114
8        52 × 74      62 × 88    57 × 81
9        37 × 52      44 × 62    40 × 57
10       26 × 37      31 × 44    28 × 40

Yani girdi ve çıktı örnekleri:

**Test case 1**
Input: A4
Output: 210 x 297

**Test Case 2**
Input: B6
Output: 125 x 176

**Test Case 3**
Input: C2
Output: 458 x 648

Dikkat edilmesi gerekenler:

  1. "210 x 297" veya "1000 x 1414" vb. Biçimi Bu tercih edilen biçim olsa da, "x" değerini çıktınızdan, yani bir dizi veya iki sayı biçiminde veya süslemenizi gıdıklayan herhangi bir biçimde atlamayı seçebilirsiniz. genişlik ölçümü yükseklikten çıktığı sürece.
  2. Yükseklik ve genişlik arasındaki oran kabaca 2'nin kare köküne eşdeğerdir, bu nedenle yüksekliklerin hesaplanmasında genişlik sqrt (2) ile çarpılır ve daha sonra en yakın milimetreye yukarı veya aşağı yuvarlanır. Yukarıdaki tablodaki ölçümler. Bu, kodunuzu golf oynamaya yardımcı olabilir.
  3. Bir seri için ardışık boyutlarda, tablodan aşağı inerken, bir boyutun genişliği bir sonraki için yükseklik olur. Bu, kodunuzu aşağı atmanıza da yardımcı olabilir.

Kurallar:

  1. Bu kod golfü. Sonuç olarak standart kurallar uygulanır. Skor bayt sayısına göre belirlenecektir. En düşük sayı kazanacaktır.
  2. Aptal boşluk yok , daha önce oradaydık ... Bunu bir daha gözden geçirmeyeceğiz.
  3. Kod yazabiliyorsanız, lütfen diğer programcıların ve golfçülerin kodunuzun nasıl çalıştığını öğrenebilmeleri için kodunuzun çalışan bir örneğine bir bağlantı eklemeyi de düşünün. Bu zorunlu değildir, ancak başkalarını bunu yapmaya teşvik etmek istiyorum, böylece hepimiz birbirimizi öğrenebiliriz. Mümkünse diğer golfçülerin dilleri hakkında daha fazla bilgi edinmek isterim.

İyi şanslar.


Bn, An ve An + 1'in geometrik ortalamasıdır ve Cn, An ve Bn'nin geometrik ortalamasıdır.
Adam

Yanıtlar:


9

JavaScript (ES7), 57 bayt

@WallyWest sayesinde 1 bayt kaydedildi

s=>n=>[n,n-1].map(x=>.707**x*{A:841,B:1e3,C:917}[s]+.2|0)

3
İyi iş çıkardınız ... 57 ile yapabilirsiniz s=>n=>[n,n-1].map(x=>.707**x*{A:841,B:1e3,C:917}[s]+.2|0)ve yine çıktınızda aynı hassasiyete sahip olacaktır.
WallyWest

@WallyWest Tavsiye için teşekkürler. Bir süre ve bir süre için çeşitli yedeklerle oynadım .7071ve .2işe
yarayan bir

Endişeye gerek yok, tüm kod golf adında ...;) Ben haritayı biri böyle bir nesne içinde sıralanmamış anahtarlar başvuru izin izin vermedi ...? Bunu yakında kullanmam gerekecek ...
WallyWest

1
@WallyWest Bunun bir ilgisi yok .map, istediğiniz zaman kullanabilirsiniz {key1:1,key2:2,key3:3}[myKey]. Anahtarları yalnızca geçerli değişken adları değilse alıntılamanız gerekir.
ETHproductions

Brilliant, bahşiş için teşekkürler ...
WallyWest

6

C (GCC) , 113 111 90 78 70 bayt

-lmTIO'da çalışması gerekiyor , ancak seçenek olmadan bilgisayarımda iyi çalışıyor.

Pizzapantlar sayesinde 20 bayt kaydedildi184 .

Değerleri işaretçiye göre döndür.

f(a,b,c,d)int*c,*d;{float x=1e3*pow(.707,b+a%3/4.)+.2;*c=x,*d=x/.707;}

Açıklama:

f(a,b,c,d)int*c,*d;{          // calling by char, but receive as int
    float x = 1e3 * pow(.707, // float gives enough precision 
            a % 3 / 4.        // series: a%3/4.=.5,0,.25 when a=65,66,67
            + b) - .2;        // magic number to get correct roundings
    *c = x, *d = x / .707;
}

1
94 byte +charint
-lm

1
91 bayt + -lm değiştirerek(a^66?a^67:0.5:0.25:0) içinabs(a-66)/(a-63.)
pizzapants184


3

Toplu, 105 bayt

@set/aA=1189,B=1414,C=1297,h=%1,w=h*29/41
@for /l %%i in (1,1,%2)do @set/at=w,w=h/2,h=t
@echo %w% x %h%

41/29 ≅ √2


Batch @Neil'de ondalık sayılar mümkün değil mi? Bundan h*.707daha iyi olacağını düşünürdüm h*41/29? Dikkat edin, yakınlığın ustaca kullanımı!
WallyWest

@WallyWest Hayır, yalnızca 32 bit imzalı tam sayılar.
Neil

Ah anlıyorum! Her gün yeni bir şeyler öğrenin!
WallyWest

3

JavaScript, 53 bayt

L=>N=>[N+1,N].map(p=>1091/2**(p/2+~{B:2,C:1}[L]/8)|0)

Neil sayesinde alternatif çıktı formatını kullanarak birçok bayt tasarruf edin.


1
66 bayt:L=>N=>(g=p=>1000.2/2**(N/2+p-{A:2,B:4,C:3}[L]/8)|0)(.5)+' x '+g(0)
Neil

1
Alternatif çıktı biçimini kullanıyorsanız 58 bayt:L=>N=>[N+1,N].map(p=>1000.2/2**(p/2-{A:2,B:4,C:3}[L]/8)|0)
Neil

@Neil düzenledi. Ve ayrıca 56 bayta düşürüldü
tsh



3

APL (Dyalog) , 31 28 bayt

-2 sayesinde teşekkürler.

Tam program gövdesi. Devraldı ⎕IO( Ben nDex Ç rigin) olmak 0üzere birçok sistem üzerine varsayılan olan. Her ikisi de STDIN'den önce sayı, sonra harf ister. STDOUT'a yazdırır.

.2+1E3÷2*8÷⍨('BC'⍳⍞)+4×⎕-⍳2

Çevrimiçi deneyin!

Biraz değiştirilmiş bir sürüm, tüm olasılıkları aynı anda test etmemizi sağlar: Çevrimiçi deneyin!

⍳2 ilk iki ɩ , yani 0 ve 1

⎕- bunu sayısal girdiden çıkart

 bununla dörde çarpın

()+ Aşağıdakileri ekleyin

 karakter girişi…

'BC'⍳ … 'S bu dizedeki nd ndex ("A", sonun ötesinde dizin olarak 2 verecektir)

8÷⍨ bunu 8'e böl

2* bunun gücüne 2 yükselt

1E3÷ 1000 bölü

.2+ buna ⅕ ekle

 kat (yuvarlak)


@ H.PWiz Evet. Tipo. Teşekkürler.
Adam

2

Befunge, 69 56 55 bayt

"}"8*~3%:"L"*7vv\p00-1_$..@
")"*":":-*!!\+<>2/00g:^:&\/

Çevrimiçi deneyin!

açıklama

Befunge'de kayan nokta lüksümüz veya güç fonksiyonu gibi bir şeyimiz yok, bu nedenle verilen biçim karakteri f için taban boyutunu aşağıdaki gibi hesaplıyoruz :

fn = f % 3
width = 1000 - (n * 76 + 7) * !!n
height = width * 58 / 41

Daha sonra, verilen boyut numarası için uygun alt bölüme ulaşmak için bu boyutları tekrar tekrar döndürüyoruz ve bölüyoruz.

"}"8*                         Push 1000 for later use in the width calculation.
     ~                        Read the format character from stdin.
      3%                      Convert into a number in the range 0 to 2.
        :"L"*7v               Calculate width = 1000 - (fn * 76 + 7) * !!fn
        -*!!\+<                  where fn is the format number derived above.
")"*":":                  /   Calculate height = width * 58 / 41.
                         \    Swap so the width is above the height on the stack.
                      v:&     Read the numeric size from stdin and duplicate for testing.
                      _       While not zero, go left.
                 p00-1        Decrement the size and move it from the stack into memory.
               v/             Swap the width and height.
               >2/            Divide the new width by 2.
                  00g:        Restore the size from memory and duplicate for testing.
                      _       While not zero, repeat this loop.
                       $      When zero, continue to the right and drop the size.
                        ..@   Output the width and height, then exit.
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.