5318008 - Hesap Makineleri ile Eğlence


32

Dünyanın dört bir yanındaki okullarda çocuklar 'Boobies' kelimesini oluşturduktan sonra LCD hesap makinesine bir sayı yazar, ters çevirir ve kahkahalara boğulur. Tabii ki, bu en popüler kelime, fakat üretilebilecek başka birçok kelime var.

Ancak, tüm kelimeler 10 harften kısa olmalıdır (sözlükte bundan daha uzun kelimeler bulunur, bu nedenle programınıza bir filtre uygulamanız gerekir). Bu sözlükte bazı büyük kelimeler vardır, bu yüzden tüm kelimeleri küçük harflere dönüştürün.

Bir İngilizce sözlük kullanarak, bir LCD hesap makinesine yazılabilecek ve bir kelime yazan bir sayılar listesi oluşturun. Tüm golf kodlarıyla ilgili sorularda olduğu gibi, bu görevi tamamlayan en kısa program kazanır.

Testlerim için, yazarak toplanan UNIX kelime listesini kullandım:

ln -s /usr/dict/words w.txt

Veya alternatif olarak, buradan alın .

Örneğin, yukarıdaki resim, sayıyı 35007hesap makinesine yazıp baş aşağı çevirerek oluşturuldu.

Harfler ve sayıları:

  • b :8
  • g :6
  • l :7
  • ben :1
  • o :0
  • s :5
  • z :2
  • h :4
  • e :3

Sayı sıfırla başlıyorsa, sıfırdan sonra bir ondalık basamağı gerektiğini unutmayın. Sayı bir ondalık sayı ile başlamamalıdır.

Sanırım bu MartinBüttner’ın kodu, sadece bunun için kredi vermek istedim :)

/* Configuration */

var QUESTION_ID = 51871; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";

/* App */

var answers = [], page = 1;

function answersUrl(index) {
  return "http://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

function getAnswers() {
  jQuery.ajax({
    url: answersUrl(page++),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      answers.push.apply(answers, data.items);
      if (data.has_more) getAnswers();
      else process();
    }
  });
}

getAnswers();

var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^,]+)/;

function shouldHaveHeading(a) {
  var pass = false;
  var lines = a.body_markdown.split("\n");
  try {
    pass |= /^#/.test(a.body_markdown);
    pass |= ["-", "="]
              .indexOf(lines[1][0]) > -1;
    pass &= LANGUAGE_REG.test(a.body_markdown);
  } catch (ex) {}
  return pass;
}

function shouldHaveScore(a) {
  var pass = false;
  try {
    pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
  } catch (ex) {}
  return pass;
}

function getAuthorName(a) {
  return a.owner.display_name;
}

function process() {
  answers = answers.filter(shouldHaveScore)
                   .filter(shouldHaveHeading);
  answers.sort(function (a, b) {
    var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
        bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
    return aB - bB
  });

  var languages = {};
  var place = 1;
  var lastSize = null;
  var lastPlace = 1;
  answers.forEach(function (a) {
    var headline = a.body_markdown.split("\n")[0];
    //console.log(a);
    var answer = jQuery("#answer-template").html();
    var num = headline.match(NUMBER_REG)[0];
    var size = (headline.match(SIZE_REG)||[0])[0];
    var language = headline.match(LANGUAGE_REG)[1];
    var user = getAuthorName(a);
    if (size != lastSize)
      lastPlace = place;
    lastSize = size;
    ++place;
    answer = answer.replace("{{PLACE}}", lastPlace + ".")
                   .replace("{{NAME}}", user)
                   .replace("{{LANGUAGE}}", language)
                   .replace("{{SIZE}}", size)
                   .replace("{{LINK}}", a.share_link);
    answer = jQuery(answer)
    jQuery("#answers").append(answer);

    languages[language] = languages[language] || {lang: language, user: user, size: size, link: a.share_link};
  });

  var langs = [];
  for (var lang in languages)
    if (languages.hasOwnProperty(lang))
      langs.push(languages[lang]);

  langs.sort(function (a, b) {
    if (a.lang > b.lang) return 1;
    if (a.lang < b.lang) return -1;
    return 0;
  });

  for (var i = 0; i < langs.length; ++i)
  {
    var language = jQuery("#language-template").html();
    var lang = langs[i];
    language = language.replace("{{LANGUAGE}}", lang.lang)
                       .replace("{{NAME}}", lang.user)
                       .replace("{{SIZE}}", lang.size)
                       .replace("{{LINK}}", lang.link);
    language = jQuery(language);
    jQuery("#languages").append(language);
  }

}
body { text-align: left !important}

#answer-list {
  padding: 10px;
  width: 50%;
  float: left;
}

#language-list {
  padding: 10px;
  width: 50%px;
  float: left;
}

table thead {
  font-weight: bold;
}

table td {
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
  <h2>Leaderboard</h2>
  <table class="answer-list">
    <thead>
      <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
    </thead>
    <tbody id="answers">

    </tbody>
  </table>
</div>
<div id="language-list">
  <h2>Winners by Language</h2>
  <table class="language-list">
    <thead>
      <tr><td>Language</td><td>User</td><td>Score</td></tr>
    </thead>
    <tbody id="languages">

    </tbody>
  </table>
</div>
<table style="display: none">
  <tbody id="answer-template">
    <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>
<table style="display: none">
  <tbody id="language-template">
    <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>


4
Gerekli olmasa bile ilk sayıdan sonra ondalık sayı kullanabilir mi?
Dennis

1
Biz yazmak zorunda mı 0.7734için Merhaba ya olur .7734kabul edilebilir?
Dennis

3
Sözlük büyük harf, noktalama, vb. İçeren kelimeler içeriyorsa doğru davranış nedir?
Peter Taylor

1
@Dennis 0.7734gerekli
Beta Decay

4
Ondalıktan sonra sonda sıfır gerektiren kelimelerden ne haber? Örneğin , ondalık oligo0.6170
Bay Llama

Yanıtlar:


7

CJam, 44 42 bayt

r{el"oizehsglb"f#W%"0."a.e|N+_,B<*_W&!*r}h

CJam tercümanında çevrimiçi olarak deneyin .

Programı komut satırından çalıştırmak için Java tercümanını indirin ve şu komutu çalıştırın:

java -jar cjam-0.6.5.jar 5318008.cjam < /usr/share/dict/words

Nasıl çalışır

r            e# Read a whitespace-separated token from STDIN.
{            e# While loop:
 el          e#   Convert to lowercase.
 "oizehsglb" e#   Push that string.
 f#          e#   Get the index of each character from the input in that string.
             e#   This pushes -1 for "not found".
 W%          e#   Reverse the resulting array.
 "0."a       e#   Push ["0."].
 .e|         e#   Vectorized logical NOT. This replaces an initial 0 with "0.".
 N+          e#   Append a linefeed.
 _,B<*       e#   Repeat the array (array.length < 11) times.
 _W&!*       e#   Repeat the array !(array.intersection(-1)) times.
 r           e#   Read a whitespace-separated token from STDIN.
}h           e# If the token is not empty, repeat the loop.

9

Bash + coreutils, 54

Yine, golf yardımı için @TobySpeight sayesinde.

rev|tr oizehsglb 0-8|sed '/.\{11\}\|[^0-9]/d;s/^0/&./'

Girilen kelime listesi STDIN'den alınmıştır:

$ ./5318008.sh < /usr/share/dict/words | head
8
38
338
5338
638
5638
36138
31738
531738
7738
$ 

"Belie" ve "Belies" kelimeler mi? Ne kadar çok bilirseniz ...
clismique

6

Python 2, 271 216 211 205 Bayt

Şimdiye kadar sahip olduğum tek fikir bu. Başka bir şey düşündüğümde bunu güncelleyeceğim! Bir dosyadan okumaya ihtiyacımız olduğunu varsaydım, ancak bilmeme izin vermediysem güncelleme yapabilirim :)

Beni 55 baytı kurtardığı için Dennis'e teşekkür ederim :)

Ayrıca 6 byte tasarruf için Sp3000 sayesinde :)

d,f,g='oizehsglb',[x.lower()for x in open('w.txt').read().split('\n')if len(x)<10],[]
for x in f:
 c=x[::-1]
 for b in d:c=c.replace(b,`d.find(b)`)
 g=[g,g+[['0.'+c[1:],c][c[0]!='0']]][c.isdigit()]
print g

Çok fazla Python tanımıyorum, ancak daha "oizehsglb".index(b)kısa bir şey olmaz mıydı ?
Dennis

3
d[b] == "oizehsglb".index(b). Muhtemelen bir karakter dizisi için bir karakter eksikliği.
Dennis

1
Oh, vay, değiştirebileceğim sayıların sırayla sayısal değerlere sahip olduğu hiç aklıma gelmedi .. Evet, kesinlikle işe yarayacak! Teşekkürler!
Kade

1
Test edilmedi ancak: 1) 2'den .findkısa .index, 2) Sahip olduğunuz sürüme bağlı olarak, en azından 2.7.10'da openvarsayılan bir argüman olmadan varsayılan olarak r, 3) Yalnızca for x in open(...)çalışmıyor mu? (sondaki yeni satırı kaldırmanız gerekebilir) Eğer değilse, o zaman .split('\n')daha kısadır.splitlines()
Sp3000

1
Ayrıca g+=[['0.'+c[1:],c][c[0]!='0']]*c.isdigit(), ve fsonra for c in fyerine tersine çevirerek birkaç tasarruf yapabilirsiniz c=x[::-1]. Ayrıca sadece bir fkez kullanırsınız , bu yüzden onu değişken olarak kaydetmenize gerek yoktur
Sp3000,

6

JavaScript (ES7), 73 bayt

Bu, ES7'de yalnızca 73 bayt yapılabilir:

s=>[for(w of s)'oizehsglb'.search(w)].reverse().join``.replace(/^0/,'0.')

Ungolfed:

var b = function b(s) {
    return s.length < 10 && /^[bglioszhe]*$/.test(s) ? s.replace(/./g, function (w) {
        return 'oizehsglb'.search(w);
    }).reverse().join('').replace(/^0/, '0.') : '';
};

Kullanımı:

t('hello'); // 0.7734
t('loose'); // 35007
t('impossible'); //

İşlev:

t=s=>                       // Create a function 't' with an argument named 's' 
   [                        // Return this array  comprehension
     for(i of s)            // Loops through each letter in the string
     'oizehsglb'.search(w)  // Converts it to it's corresponding number
   ]
  .reverse().join``         // Reverse the array and make it a string
  .replace(/^0/,'0.')       // If the first character is a 0, add a decimal after it

Bunu UNIX kelime listesine koştum ve sonuçları bir yapıştırma kutusuna koydum:

Sonuçlar

Firefox'ta sonuçları elde etmek için kullanılan kod :

document.querySelector('pre').innerHTML.split('\n').map(i => t(i.toLowerCase())).join('\n').replace(/^\s*[\r\n]/gm, '');

Ne ile oluyor t('Impossible')?
Arturo Torres Sánchez


ES2015'e katılmak mı yoksa ES2015 öncesi mi?
WallyWest

@WallyWest Bu bir ES6 özelliğidir. Çoğu büyük tarayıcıda desteklenir
Downgoat

Bu konuda ES7'ye özgü olan nedir?
Arjun

5

Python 2,121 bayt

for s in open("w.txt"):
 L=map("oizehsglb".find,s[-2::-1].lower())
 if-min(L)<1>len(L)-9:print`L[0]`+"."[L[0]:]+`L`[4::3]

Sözlük dosyasının w.txtson satırda yeni bir satır ile bittiğini ve boş satırı olmadığını varsayar .


3

GNU sed, 82

(için 1 tanesi dahil -r)

Golf yardımı için @TobySpeight'a teşekkürler.

s/$/:/
:
s/(.)(:.*)/\2\1/
t
s/://
y/oizehsglb/012345678/
/.{11}|[^0-9]/d;s/^0/&./

Girilen kelime listesi STDIN'den alınmıştır:

$ sed -rf 5318008.sed /usr/share/dict/words | tail
3705
53705
1705
0.705
50705
5705
505
2
0.02
5002
$ 

2

TI-BASIC, 75 88 bayt

düzenleme 2: boşver, bu teknik olarak geçersizdir, çünkü bir kerede yalnızca bir kelime kabul eder (sözlük değil). Giriş olarak birden fazla sözcüğe izin vermek için düzeltmeye çalışacağım ...

edit: oops; Ben aslında o bir .0 göstermek yapılmış sonuna eğer son sayı 0, değil başka bir yol oldu. Bu, çok kötü bir geçici çözüm olmasına rağmen düzeltildi (0 ile başlıyorsa sayının yanında "0" görüntüler, aksi takdirde aynı yerde iki boşluk gösterir). Parlak tarafta, aslında "ondalık" sayıları göstermediğinden, "Otto" (her ikisini de görüntüler) gibi kelimeleri doğru şekilde kullanır!


Bunu yapmak için daha iyi bir dil düşünemiyorum. Kesinlikle daha çok golf oynayabilir, ancak şu anda çok yorgunum. Tilde olumsuzlama sembolüdür [ ( - )düğme].

Giriş, hesap makinesinin cevap değişkeninden alınır, yani en son ne değerlendirildiyse ( _interaktif python kabuğunda olduğu gibi), böylece ana ekranda bir dize yazmanız gerekir (alıntı işareti açık ALPHA+), tuşuna basın ENTER, sonra programı çalıştırın. Alternatif olarak, komutları ayırmak için iki nokta üst üste kullanabilirsiniz, bu nedenle programı adlandırırsanız, "CALCTEXT" deyin ve "HELLO" dizesinde çalıştırmak istiyorsanız, "HELLO":prgmCALCTEXTbunları ayrı yapmak yerine yazabilirsiniz .

seq(inString("OIZEHSGLB",sub(Ans,X,1))-1,X,length(Ans),1,~1
Text(0,0,sub("0.  ",1+2(0 or Ans(1)),2),sum(seq(Ans(X)10^(dim(Ans)-X),X,1,dim(Ans

2

Python 2, 147 158 156 bayt

Bu '0' eksikti. gereklilik. Umarım şimdi düzgün çalışır.

edit : Removed ".readlines ()" ve hala çalışıyor; p

edit2 : Bazı boşluklar kaldırıldı ve baskıyı 3. satıra taşıdı

edit3 : Sp3000 sayesinde 2 bayt kaydedildi (yazdırıldıktan sonra yer kaldırıldı ve 'dizin' değiştirildi 'olarak değiştirildi)

for x in open("w.txt"):
 a="oizehsglb";g=[`a.find(b)`for b in x[::-1].lower()if b in a]
 if len(g)==len(x)-1<10:
  if g[0]=="0":g[0]="0."
  print"".join(g)

1

Python 2,184 174 bayt

for s in open('w.txt'):
 try:a=''.join(map(lambda c:dict(zip('bglioszhe','867105243'))[c],s[:-1][::-1]));a=[a,'0.'+a[1:]][a[0]=='0'];print['',''.join(a)][len(s)<11]
 except:0

1

Yakut 2, 88 86 bayt

x="oizehsglb"
puts$_.tr(x,"0-8").reverse.sub /^0/,"0." if$_.size<11&&$_.delete(x)<?A

Bayt sayısı ln, komut satırındaki seçenekler için 2 içerir :

$ ruby -ln 5318008.rb wordlist.txt

Bu durumda ==""ile değiştirilebilir <?A. Ve gerek gsub()olarak sub()yeterlidir.
Manatwork

1

C, 182 172 169/181 172 bayt

char*l="oizehsglb",S[99],*s,*t;main(x){for(;t=S+98,gets(S);){for(s=S;*s;s++)if(x=strchr(l,*s|32))*--t=48+x-(int)l;else break;*t==48?*t--=46,*t=48:0;*s||s-S>10?0:puts(t);}}

Expanded

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *l="oizehsglb",S[99],*s,*t;

main(int x, char **argv)
{
    for (;t=S+98,gets(S);){
        for (s=S;*s;s++)
            if (x=strchr(l,*s|32))
                *--t=48+x-(int)l;
            else
                break;
        if (*t==48) {       // '0'
            *t--=46;        // '.'
            *t=48;  // '0'
        }

        if (!*s && s-S <= 10)
            puts(t);
    }
}

Bağlantılı words.txt kullanarak, küçük harf dönüşümü ile:

$ ./a.out  < words.txt  | tail
2212
0.2
0.802
0.602
7702
37702
0.02
321607002
515002
0.02002

$ ./a.out < words.txt   | wc -l
 550

1
Olmaz *s|32bu bağlamda küçük dönüşüm olarak çalışacak?
Hagen von Eitzen

İyi fikir! Teşekkürler!
bazı kullanıcılar

1

Haskell, ithalat olmadan 175 bayt (ithalat ile 229 bayt)

İlgili kod (Dosya Calc.hs'de söyleyin):

import Data.Char(toLower)
import Data.Maybe(mapMaybe)
s="oizehsglb\n"
g('0':r)="0."++r
g x=x
main=mapM_(putStrLn.g.reverse.mapMaybe(`lookup`zip s['0'..'8'])).filter(\l->length l<10&&all(`elem`s)l).lines.map toLower=<<getContents

$ cat /usr/share/dict/words | runghc Calc.hs

0

Java, 208 200 176 bayt

String f(char[] w){String o="",l="oizehsglb";for(int i=w.length;i>0;i--)o+=l.indexOf(w[i-1]|32);if(o.contains("-")||o.length()>8)o="  ";return o.charAt(0)+"."+o.substring(1);}

Expanded

String f(char[] w)
{
    String o = "", l = "oizehsglb";
    for(int i = w.length; i > 0; i--)
        o+=l.indexOf(w[i-1]|32);
    if(o.contains("-")||o.length() > 8)
        o = "  ";
    return o.charAt(0) + "." + o.substring(1);
}

Her zaman ondalık basamak ekler ve geçersiz olduğunda "." Döndürür. Ama aksi halde olması gerektiği gibi çalışır. : P

@ LegionMammal978 teşekkürler!


Sen değiştirerek 7 bayt kaydedebilirsiniz ;String l=için ,l=ve =o+için +=.
LegionMammal978
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.